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