Java i jej wykorzystanie do tworzenia dynamicznych aplikacji
Transkrypt
Java i jej wykorzystanie do tworzenia dynamicznych aplikacji
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