Java i jej wykorzystanie do tworzenia dynamicznych aplikacji Webowych Zadanie do wykonania na następny tydzień: Przedstawić aplikację napisaną w JSP realizującą analogiczne zadania jak pierwsza aplikacja w php, czyli podstawowe operacje na tabeli w bazie danych MySQL, tj SELECT, INSERT, UPDATE, DELETE. Niezbędne jest dodanie autowypełniania formularza przy instrukcji UPDATE. Środowisko uruchomieniowe Rozpakować archiwum zawierające kontener serwletów Tomcat Korzystając z konsoli ustalić zmienną środowiskową JAVA_HOME=C:\Program Files\Java\jdk1.6.0_07, sprawdzić ustawienia poleceniem set. Wejść do katalogu bin w katalogu głównym Tomcata, uruchomić kontener serwletów poleceniem catalina start. Ustawień parametrów Tomcata dokonujemy w pliku Server.xml w katalogu conf (domyślnie serwer pracuje na porcie 8080), aplikacje umieszczamy w katalogu webapps. Przykład aplikacji JSP wyświetlającej aktualną datę <HTML> <HEAD> <TITLE>Hello World</TITLE> </HEAD> <BODY> <H1>Hello World</H1> Today is: <%= new java.util.date().tostring() %> </BODY> </HTML> 1. Umieścić kod w pliku hello.jsp w katalogu Root 2. Uruchomić wpisując w przeglądarce adres http://server.address/hello.jsp Połączenie z bazą danych MySQL z poziomu zarówno JAVy jak JSP Aplikacja wykorzystująca bazę danych powinna w pierwszej kolejności załadować sterownik bazy danych, połączyć się z bazą danych, wysłać zapytanie SQL, odebrać wyniki zapytania i je przetworzyć a następnie zamknąć połączenie z bazą danych. Po zrealizowaniu połączenia z bazą danych moŝemy wielokrotnie wysłać polecenie i przetworzyć wyniki. Aby załadować sterownik JDBC naleŝy utworzyć obiekt odpowiedniej klasy, w tym przypadku klasy JdbcOdbcDriver, sterownik standardowo naleŝący do JDK sterownik dla MySQL dostępny TUTAJ naleŝy go umieścić w katalogu: ścieŝka_do_katalogu_javy/jre/lib/ext: Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); NaleŜy zauwaŝyć Ŝe nie istnieje Ŝadna zmienna obiektowa identyfikująca sterownik. Za dostęp do sterowników odpowiada klasa DriverManager.
Aby nawiązać połączenie z bazą danych naleŝy zainicjować obiekt klasy Connection za pomocą statycznej metody DriverManager.getConnection(). connect = DriverManager.getConnection(url); Parametrem metody getconnection klasy Connection jest adres URL bazy danych. Parametr URL zawiera: jdbc:<subprotocol>:<subname> Pierwszym członem URL jest zawsze jdbc i jest to typ protokołu. Kolejeny element URL to nazwa sterownika lub mechanizm połączenia do bazy danych. Trzeci człon to lokalizacja bazy danych. Przykładowy URL moŝe wyglądać tak: String URL = "jdbc:odbc:webdevdb"; i określa wykorzystanie protokołu ODBC i lokalnej bazy danych o nazwie WebDevDB. JeŜeli chcemy skorzystać z bazy danych umieszczonej na zdalnym serwerze moŝemy zdefiniować URL: String url ="jdbc:mysql://zs4.pl:3306/student"; Taka definicja adresu bazy danych oznacza Ŝe będziemy korzystać z bazy danych student dostępnej na komputerze zs4.pl, korzystamy z silnika Mysql pracującego na porcie nr 3306. JeŜeli baza danych wymaga podania uŝytkownika i hasła moŝemy podać te parametry takŝe w metodzie getconnection: connect = DriverManager.getConnection(url, "student", "student"); Wykonanie zapytania SQL Dla wykonania zapytania SQL naleŝy utworzyć obiekt typu Statement będący kontenerem dla operacji SQL. Obiekt typu Statement umoŝliwia wysłanie prostych - statycznych poleceń SQL. Oprócz klasy Statement mamy do dyspozycji klasy PreparedStatement (polecenia z parametrami) i CallableStatement (odwołania do procedur zdefiniowanych w bazie). Spróbujmy wykorzystać obiekt typu Statement: connect = DriverManager.getConnection(URL); // łączymy się z bazą stmt = connect.createstatement(); // inicjacja połączenia Statement Polecenie SQL moŝemy wysłać korzystając z metod klasy Statement: executeupdate() (operacje modyfikujące zawartość bazy danych), executequery() (operacje zwracające pojedynczy zbiór danych - ResultSet), execute() (operacje zwracające wiele zbiorów danych ResultSet). Metoda executeupdate() wykorzystywana jest dla poleceń SQL modyfikujących zawartość bazy danych - CREATE TABLE, INSERT, UPDATE, DELETE, np.: String createstring = "create table klienci"+ "(ID int," + " IMIE varchar(30)," + " NAZWISKO varchar(30)," +
" DATA_UR varchar(30),"; stmt.executeupdate(createstring); // wykonanie zapytania SQL Metoda executequery(), wykorzystywana dla polecenia SELECT, zwraca obiekt klasy ResultSet (zbiór wynikowy). ResultSet r; String selectstring = "select * from klienci"; // zapytanie SQL r = stmt.executequery(selectstring); // wysłanie zapytania, r - wynik zapytania d) odebranie i przetworzenie wyników Wynik zapytania SELECT zwraca zbiór rekordów, które moŝemy odczytać stosując metody next(), previous(),, first(), last(), getxxx() (getstring(), getfloat(), getint() itd., np.: String imie, nazwisko,id,ulica,numer; while(r.next()){ // kolejny rekord id = r.getstring(1); // odczyt 5 kolejnych wartosci z rekordu imie = r.getstring(2); nazwisko = r.getstring(3); data_ur = r.getstring(4); System.out.println(" "+id+" "+imie+" "+nazwisko+" "+data_ur+" "); Metody next(), previous(), first(), last() operują na zbiorze wynikowym zmieniając bieŝący rekord. MoŜemy odczytać dane z bazy jako wartości typu String bez względu na typ danej w bazie lub teŝ odczytać wartości numeryczne korzystając z odpowiedniej metody getxxx(), np.: float numer = r.getfloat(5); pod warunkiem Ŝe wartość kolumy w bazie danych jest typu numerycznego. e) zamknięcie połączenia z bazą danych Po zakończeniu wszystkich operacji na otwartej bazie danych naleŝy zamknąć połączenie z bazą danych. Zamykamy obiekt Statement i Connection, np.: stmt.close(); connect.close();
Połączenie z bazą danych z poziomu Javy. Aplikacja listuje tabele w bazie danych student. Połączenie z bazą danych z poziomu JSP <%@ page import="java.net.*" %> <%@ page import="java.util.*" %> <%@ page import="java.io.*" %> <%@ page import="java.sql.*" %> <% try{ Class.forName("com.mysql.jdbc.Driver").newInstance(); catch (Exception E) { out.println("unable to load driver."); E.printStackTrace();
try{ out.println("getting Connection..."); Connection C = DriverManager.getConnection("jdbc:mysql://IP_ADDRESS:3306/test"); out.println("<br>connected: " +!C.isClosed() + "<br>\n"); out.println("catalog: " + C.getCatalog() + "<br>\n"); Statement S = C.createStatement(); ResultSet rs = S.executeQuery("SELECT * FROM foo"); ResultSetMetaData rsstruc = rs.getmetadata(); out.println("table: " + rsstruc.gettablename(1) + "<br>"); out.println("<table bgcolor=c8c8c8 cellpadding=5 cellspacing=1>"); out.println("<tr bgcolor=000000>"); int colcount = rsstruc.getcolumncount(); String colname = ""; for(int i=1;i <= colcount; i++){ colname = rsstruc.getcolumnname(i) ; out.println("<td><b><font color=white>" + colname + "</font></b></td>\n"); out.println("</tr>"); while (rs.next()) { out.println("<tr bgcolor=ffffff>"); for(int i=1;i <= colcount; i++){ colname = rsstruc.getcolumnname(i) ; String fld = rs.getstring(colname); out.println("<td>" + fld + "</td>"); out.println("</tr>"); out.println("</table>"); rs.close(); C.close(); catch (Exception E) { out.println("sqlexception: " + E.getMessage()); %> Więcej na stronie: www.radgol.prv.pl/materialy/java.htm