Aplikacje Internetowe



Podobne dokumenty
Połączenie z bazą danych

Aplikacje Internetowe

JAVA I BAZY DANYCH. MATERIAŁY:

przygotował: Bazy danych Paweł Kasprowski Wersja 2006Z

JDBC (Java Database Connectivity vit )

Java i jej wykorzystanie do tworzenia dynamicznych aplikacji Webowych

prepared by: Programowanie WWW Model-View-Controller

Informatyka I. Standard JDBC Programowanie aplikacji bazodanowych w języku Java

Wieloplatformowe aplikacje sieciowe. dr inż. Juliusz Mikoda mgr inż. Anna Wawszczak

Aplikacje bazodanowe. dr inż. Arkadiusz Mirakowski

Informatyka I. Programowanie aplikacji bazodanowych w języku Java. Standard JDBC.

Programowanie w języku Java. Kolekcje

JAVA bazy danych. na bazie: Język Java - Podstawy Programowania - Jacek Rumiński

Łączenie z bazą danych przykładowa klasa infpolaczenie import java.sql.drivermanager; import java.sql.connection; import java.sql.

Programowanie komputerów. Wykład 10: Dostęp do baz danych z poziomu aplikacji Java. (JDBC Database Access)

Metody dostępu do danych

Rozdział 9 Obsługa baz danych w języku Java

Programowanie w języku Java. Bazy danych SQLite w Javie

Typy sterowników. Rozdział 21 JDBC. Podstawowe kroki aplikacji. Historia. Program napisany w języku Java JDBC API. Menadżer sterowników JDBC

Java Zadanie 1. Aby poprawnie uruchomić aplikację desktopową, należy zaimplementować główną metodę zapewniającą punkt wejścia do programu.

Java Database Connectivity

Java Database Connectivity

JDBC. Plan ćwiczenia. Wywoływanie poleceń SQL z języków programowania. Plan ćwiczenia cd. Wprowadzenie do laboratorium

Wprowadzenie do JDBC z wykorzystaniem bazy H2

Plan wykładu. Dostęp do bazy danych. Architektura JDBC. Dostęp do baz danych z aplikacji Java EE

Tworzenie aplikacji w języku Java

Java rozszerzenie. dr. A. Dawid

Java i bazy danych. 1. JDBC podstawy, transakcje. 2. Mapowanie relacyjno obiektowe. Hibernate, przykład.

JDBC - Obsługa baz danych w języku Java

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Programowanie Obiektowe (Java)

Podstawy otwartych języków programowania Java Database Connectivity (JDBC)

Kolekcje mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011

Kolekcje. Na podstawie:

Kolekcja (kontener) to po prostu obiekt, który grupuje wiele elementów w jeden twór.

Kolekcje - pakiet Java Collections Framework

Wzorce logiki dziedziny

Aplikacje RMI

Bazy danych. Dr inż. Paweł Kasprowski

Bazy danych wykład dwunasty

dr inż. Piotr Czapiewski Tworzenie aplikacji w języku Java Laboratorium 1

JDBC w LoXiMie. Interfejs Java Database Connectivity dla systemu LoXiM. Adam Michalik 2008

Realizacja ekstensji klasy. Paulina Strzelecka, Tomasz Roszkowski

Klasy i obiekty cz II

Dawid Gierszewski Adam Hanasko

Kurs programowania aplikacji bazodanowych

Instrukcja 2 Laboratorium z Podstaw Inżynierii Oprogramowania

Instytut Sterowania i Systemów Informatycznych Uniwersytet Zielonogórski. Zaawansowane Systemy Decyzyjne. Laboratorium

Wykład 12. Programowanie serwera MS SQL 2005 w C#

Kolekcje - pakiet Java Collections Framework

Programowanie w języku Java

import java.util.*; public class ListExample { public static void main(string args[]) { List<String> lista1= new ArrayList<String> ();

Aplikacje Internetowe, Servlety, JSP i JDBC

Obsługa transakcji rozproszonych Java. Marek Wojciechowski, Maciej Zakrzewicz Instytut Informatyki, Politechnika Poznańska

Java. Michał Wójcik.

Podejście obiektowe do relacyjnych baz danych Hibernate.

Materiały oryginalne: ZAWWW-2st1.2-l11.tresc-1.0kolor.pdf. Materiały poprawione

Podstawy programowania III WYKŁAD 2

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Ćwiczenie 10 JDBC. Wywoływanie poleceń SQL z języków programowania. Ćwiczenie 10 JDBC. Wymagania: Bazy Danych

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Technologia JDBC w praktyce

Programowanie obiektowe zastosowanie języka Java SE

Język JAVA podstawy. Wykład 4, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Connection con = DriverManager.getConnection(dbUrl, username, passwd);

java.util.* :Kolekcje Tomasz Borzyszkowski

DB+frontend Inne języki H2. Bazy Danych i Systemy informacyjne Wykład 9. Piotr Syga

1) Przygotowanie środowiska pracy.

Java niezbędnik programisty spotkanie nr 8. Kolekcje c.d.

Dostęp do baz danych z aplikacji J2EE

Podstawy otwartych języków programowania Przechowywanie danych

Systemy Rozproszone - Ćwiczenie 6

Aplikacje Internetowe. Najprostsza aplikacja. Komponenty Javy. Podstawy języka Java

Zadanie polega na stworzeniu bazy danych w pamięci zapewniającej efektywny dostęp do danych baza osób.

1. Czynności przygotowujące aplikację działającą na platformie Java SE Biblioteka5 (należy ją pobrać z załącznika z p.1)

Wywoływanie metod zdalnych

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Dostęp do baz danych w aplikacjach Java EE

Połączenia między bazami danych i programem w języku Java część 2

Programowanie obiektowe

Programowanie obiektowe

Zaawansowane aplikacje WWW - laboratorium

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

Remote Method Invocation 17 listopada 2010

Programowanie obiektowe

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

Języki skryptowe - PHP. PHP i bazy danych. Paweł Kasprowski. pawel@kasprowski.pl. vl07

Podejście obiektowe do budowy systemów rozproszonych

Ćwiczenie 1. Kolejki IBM Message Queue (MQ)

Aplikacje RMI Lab4

Db4o obiektowa baza danych wersja.net

Java: otwórz okienko. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Java Collections Framework

Wprowadzenie do Doctrine ORM

Wywoływanie metod zdalnych

RMI-2. Java Remote Method Invocation (RMI) na podstawie m.in. podręcznika firmy Sun Microsystems SYSTEMY ROZPROSZONE

Wzorce dystrybucji i wspólbieżności autonomicznej

Bazy danych dla producenta mebli tapicerowanych. Bartosz Janiak Marcin Sikora Wrocław r.

Metody dostępu do danych

Transkrypt:

Aplikacje Internetowe Łączenie z bazą danych

Podstawy Klient Serwer Sterownik Własne API (Application Programmer Interface)

Łączenie z bazą danych Sterownik Protokół komunikacyjny Adres serwera Port nasłuchowy Przesłanie zapytania SQL Odebranie rezultatów

Język Java - JDBC JDBC API pozwala na: Ustalenie połączenia z bazą Wysyłanie poleceń SQL Przetwarzanie rezultatów

Sterowniki JDBC 1) JDBC-ODBC Bridge 2) Native-API partly-java driver 3) Net-protocol all-java driver 4) Native-protocol all-java driver

Główne klasy i interfejsy JDBC Driver DriverManager Connection Statement, PreparedStatement, CallableStatement ResultSet DatabaseMetaData ResultSetMetaData Types SQLException SQLWarning

Sposób działania JDBC Załaduj sterownik Class.forName( DriverClassName); Połącz się ze źródłem danych Connection con = DriverManager.getConnection( URL, Username, Password ); Stwórz polecenie Statement stmt = con.createstatement(); Zapytaj bazę danych ResultSet result = stmt.executequery("select * FROM table1");

Ładowanie sterownika Statyczne: import drivername; Dynamiczne: Class.forName( drivername ); Na przykład: com.mysql.jdbc.driver lub com.microsoft.sqlserver.jdbc.sqlserverdriver

Połączenie ze źródłem danych Connection con = DriverManager.getConnection ( URL, Username, Password ); URL = jdbc:<subprotocol>:<subname> <subname> = //host:port/dbname;params Na przykład: jdbc:mysql://127.0.0.1/baza lub jdbc:microsoft:sqlserver://db.xyz.pl:1433

Pierwszy przykład JDBC import java.sql.*; class DBExample1{ public static void main(string[] args){ } try{ Class.forName("com.mysql.jdbc.Driver"); Connection con = DriverManager.getConnection("jdbc:mysql://127.0.0.1/baza", "lab","lab"); Statement stmt = con.createstatement(); ResultSet rs = stmt.executequery("select * from pracownicy"); while(rs.next()) System.out.println(rs.getString(1)+" "+rs.getstring(4)); con.close(); } catch(sqlexception ec) {ec.printstacktrace()); } catch(classnotfoundexception ex) {ex.printstacktrace();} } DBExample1.java

Ładowanie sterownika Zwykle sterownik typu 4 Ściągnięcie pliku jar ze sterownikiem Umieszczenie go na ścieżce Zmiana nazwy sterownika i url'a w programie

Przykłady sterowników SQL Server (http://msdn.microsoft.com/data/ref/jdbc) java -classpath ".;sqljdbc4.jar" %1 MySQL (http://www.mysql.com/products/connector/j/) java -classpath ".;mysql-connector-java.jar" %1 PostgreSQL (http://jdbc.postgresql.org) java -classpath ".;postgres-8.2dev-503.jdbc2ee.jar" %1 run.bat

Zmiana sterownika import java.sql.*; class DBExample1{ public static void main(string[] args){ } try{ Class.forName("com.mysql.jdbc.Driver"); Connection con = DriverManager.getConnection("jdbc:mysql://127.0.0.1/baza","lab", "lab"); Statement stmt = con.createstatement(); ResultSet rs = stmt.executequery("select * from pracownicy"); while(rs.next()) System.out.print(rs.getString(1)+" "+rs.getstring(4)+"\n"); con.close(); } catch(sqlexception ec) { System.err.println(ec.getMessage()); } catch(classnotfoundexception ex) {System.err.println("Cannot find driver.");} } DBExample1.java

Zmiana sterownika import java.sql.*; class DBExample1{ public static void main(string[] args){ } try{ Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); Connection con = DriverManager.getConnection("jdbc:sqlserver://localhost", "lab", "lab"); Statement stmt = con.createstatement(); ResultSet rs = stmt.executequery("select * from pracownicy"); while(rs.next()) System.out.print(rs.getString(1)+" "+rs.getstring(4)+"\n"); con.close(); } catch(sqlexception ec) { System.err.println(ec.getMessage()); } catch(classnotfoundexception ex) {System.err.println("Cannot find driver.");} } DBExample1.java

ResultSet ResultSet rs=stmt.executequery("select * from table"); dostęp do jednego wiersza danych jednocześnie next() przejście do następnego wiersza getxxx(i) wartość i-tej kolumny Najczęściej: getint(), getstring(), getdate(), getdouble()... Informacje o strukturze danych (nazwy i typy kolumn) - MetaData

Tworzenie polecenia (Statement) Statement stmt = con.createstatement(); executequery() uruchamia polecenia SQL zwracające listę wierszy jako ResultSet. executeupdate() uruchamia polecenia SQL modyfikujące dane lub strukturę bazy execute() uruchamia polecenie SQL dowolnego typu

executeupdate int rows=stmt.executeupdate( "update table set field=3 where id=5"); Dla poleceń DML i DDL Zwraca ilość przetworzonych wierszy Zwraca zero dla poleceń DDL (CREATE TABLE itp.)

PreparedStatement PreparedStatement pstmt = con.preparestatement( "select * from table1 where id=? and field like?") Pre-kompilacja zapytań po stronie serwera Przyspiesza działanie podobnych zapytań Czytelniejszy kod Pozwala na użycie parametrów( marker? ) setxxx() ustawienie wartości parametru

PreparedStatement // definicja polecenia PreparedStatement pstmt = con.preparestatement( "select * from table1 where id<? and field like?"); // ustawienie parametrów pstmt.setint(1,20); pstmt.setstring(2,"value"); // uruchomienie Rs = pstmt.executequery();

SQLException import java.sql.*; class DBExample1{ public static void main(string[] args){ } try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection con = DriverManager.getConnection("jdbc:odbc:uran","lab","lab"); Statement stmt = con.createstatement(); ResultSet rs = stmt.executequery("select * from pracownicy"); while(rs.next()) System.out.print(rs.getString(1)+" "+rs.getstring(4)+"\n"); con.close(); } catch(sqlexception ec) { System.err.println(ec.getMessage()); } catch(classnotfoundexception ex) {System.err.println("Cannot find driver.");} }

SQLException import java.sql.*; class DBExample1{ public static void main(string[] args){ } } try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); }catch(classnotfoundexception ex) {System.err.println("Cannot find driver.");} try{ Connection con = DriverManager.getConnection("jdbc:odbc:uran","lab","lab"); Statement stmt = con.createstatement(); ResultSet rs = stmt.executequery("select * from pracownicy"); while(rs.next()) System.out.print(rs.getString(1)+" "+rs.getstring(4)+"\n"); con.close(); }catch(sqlexception ec) { System.err.println(ec.getMessage()); }

Transakcje Niepodzielny blok poleceń Utrzymanie spójności danych Domyślnie AutoCommit każde polecenie to osobna transakcja con.setautocommit(false) con.commit() con.rollback()

... Przykład transakcji (przelew bankowy) con.setautocommit(false); try{ int n1 = stmt.executeupdate("update accounts set amount=amount-100 where custid=75"); int n2 = stmt.executeupdate("update accounts set amount=amount+100 where custid=43"); if(n1==1 && n2==1) else con.commit(); con.rollback(); }catch(sqlexception ec)... {con.rollback(); System.err.println(ec.getMessage());}

Utrzymywanie połączenia Nawiązanie połączenia jest czasochłonne lepiej więc raz nawiązane połączenie używać do kolejnych zapytań Problem: jak przechwać informację o połączeniu, jeśli jest ono używane w różnych obiektach Rozwiązanie: własny obiekt "Połączenie" dostępny globalnie (wszędzie w aplikacji) Pytanie: jak to zrobić? Rozwiązanie naiwne: przekazywanie referencji na obiekt do każdej klasy w dużych aplikacjach niemożliwe

Przechowywanie połączenia Pole statyczne w jakiejś klasie class SqlConnection { static Connection con; } Singleton klasa która z założenia ma tylko jedną implementację tworzy się tylko jeden obiekt i najczęściej nie da się stworzyć nowego

Singleton public class MojSingleton { private static MojSingleton mojsingleton = null; public static MojSingleton getinstance() { if(mojsingleton==null) { } mojsingleton = new MojSingleton(); } return mojsingleton; } private MojSingleton(){ //tu tworzenie obiektu }

Użycie singletona Tak nie można! MojSingleton s = new MojSingleton(); Tak można w każdym miejscu (i zawsze dostajemy ten sam obiekt!) MojSingleton s = MojSingleton.getInstance();

Przechowanie Connection import java.sql.*; class DBCon { } private static Connection con; static Connection getconnection() { } if(con==null) {...stwórz połączenie...} return con; W programie: Connection con = DBCon.getConnection();...

Inicjalizacja połączenia import java.sql.*; class DBCon { private static Connection con; static Connection getconnection(){ if(con==null) { try{ Class.forName("com.mysql.jdbc.Driver"); con = DriverManager.getConnection("<url>", "user","pass"); }catch(exception ec) {ec.printstacktrace();} } return con; } }

Użycie DBCon... Connection c = DBCon.getConnection(); try{ Statement stmt = c.createstatement(); ResultSet rs = stmt.executequery("..."); while(rs.next()) System.out.println(rs.getString(1)); }catch(sqlexception ec) {ec.printstacktrace();}...

Użycie DBCon... try{ Statement stmt = DBCon.getConnection().createStatement(); ResultSet rs = stmt.executequery("..."); while(rs.next()) System.out.println(rs.getString(1)); }catch(sqlexception ec) {...}...

Użycie DBCon... try{ ResultSet rs = DBCon.getConnection().createStatement().executeQuery("..."); while(rs.next()) System.out.println(rs.getString(1)); }catch(sqlexception ec) {...}...

Przykład aplikacji Wyświetlenie listy pracowników Plik: index.jsp Połączenie: DBCon.java Generacja listy: DBHandler.java

Index.jsp Lista pracowników: <% pl.test.dbhandler dbh = new pl.test.dbhandler(); out.write(dbh.getlist()); %> Można też to samo za pomocą JSTL/EL: <jsp:usebean id="dbh" class="pl.kurs.db.dbhandler"/> ${dbh.list}

DBHandler.java public String getlist() { String txt = ""; try{ ResultSet rs = DBCon.getConnection().createStatement().executeQuery("select * from pracownicy"); while(rs.next()) txt+= rs.getstring("nr_prac") +" "+rs.getstring("nazwisko"); }catch(sqlexception ec) {ec.printstacktrace();} return txt; }

Problem z kodem (1) Co jeśli wiele jednoczesnych połączeń z bazą danych? Lepiej zamiast jednego połączenia przechowywać fabrykę połączeń! Gotowa klasa: DataSource DataSource.getConnection() zwraca połączenie Możliwe dzięki temu zaimplementowanie ConnectionPooling

DataSource Zalecany zamiennik dla DriverManager Posiada właściwości, które można zmieniać setterami i getterami każdy sterownik może mieć inne nazwy właściwości! Może być wpisywany do JNDI Może wspomagać przydział połączeń (Connection Pooling)

Zmiana w programie Zamiast linii: Class.forName("com.mysql.jdbc.Driver"); Connection con = DriverManager.getConnection(" jdbc:mysql://127.0.0.1/baza ","lab","lab"); Wprowadzamy (dla MySQL): com.mysql.jdbc.jdbc2.optional.mysqldatasource ds = ds.setuser("lab"); new com.mysql.jdbc.jdbc2.optional.mysqldatasource(); ds.setpassword("lab"); ds.setdatabasename("baza"); Connection con = ds.getconnection();

Connection Pooling Zalecane przy aplikacjach wielowątkowych używanych jednocześnie przez wielu użytkowników (np. aplikacje internetowe) Singleton (fabryka) tworzy kilka połączeń z bazą i udostępnia je innym obiektom Gdy obiekt skończy pracę nie zwraca połączenia lecz zwalnia je "oddaje" do singletona Apache Tomcat ma gotowy do użycia moduł: DBCP wystarczy wpisać jego konfigurację do server.xml

Użycie DBCP Stosuje connection pooling Używa sterownika, który podamy jest niezależny od serwera bazy danych Konfiguracja połączenia w Context conf/server.xml conf/catalina/localhost/aplikacja.xml aplikacja/meta-inf/context.xml W aplikacji używamy JNDI lookup

Konfiguracja połączenia <Context path="/web1" reloadable="true"> <Resource name="jdbc/mydb" auth="container" type="javax.sql.datasource" maxactive="100" maxidle="30" maxwait="10000" username="myuser" password="mypass" driverclassname="com.mysql.jdbc.driver" url="jdbc:mysql://localhost:3306/mydb? autoreconnect=true"/> </Context>

Użycie DBCP w aplikacji public Connection getconnection() { try{ Context initcontext = new InitialContext(); DataSource ds =(DataSource)initContext.lookup( "java:/comp/env/jdbc/mydb"); return ds.getconnection(); }catch(sqlexception ec) {... } catch(namingexception ne) {...} return null; }

Używanie połączenia Otwarcie połączenia: Connection con = ds.getconnection(); Zamykanie połączenia: con.close() W rzeczywistości nie jest ono zamykane ale wraca do puli połączeń! Niezamknięcie połączenia jest potencjalnie niebezpieczne bo może wyczerpać pulę!

Problem z kodem (2) Formatowanie listy zaszyte w kodzie metody w Javie Ograniczona funkcjonalność pliku JSP Zmiana formatowania (np. zrobienie tablicy) to ingerencja w kod Javy Lepiej przekazywać do JSP dane niesformatowane! Jak przekazać listę danych? Odpowiedź: kolekcja!

Kolekcje Gotowe do użycia struktury o wbudowanej przydatnej funkcjonalności Element Java Collections Framework Oparte na grupie interfejsów

Metody interfejsu Collection add(object o) addall(collection c) contains(object o) containsall(collection c) remove(object o) removeall(collection c) size() iterator()

Metody interfejsu Iterator next() zwraca kolejny obiekt kolekcji hasnext() true, gdy jest kolejny obiekt w kolekcji remove() usuwa obiekt i przechodzi na następny Iterator it = vkl.iterator(); while(it.hasnext()) { System.out.println(it.next()); }

Implementacje interfejsu List ArrayList tablica rozszerzalna dodatkowe metody: set(index, element) zastępuje obiekt o podanym indeksie add(index, element) dodaje element w podany indeks get(index) zwraca obiekt z podanego indeksu LinkedList metoda iterator() zwraca obiekt implementujący ListIterator dodatkowe metody ListIterator previous() hasprevoius() add(element)

Implementacje interfejsu Set Nie może być powtórzeń (elementów takich samych) Metoda contains() działa znacznie efektywniej Kolekcje nie mogą zawierać duplikatów HashSet elementy nieuporządkowane TreeSet elementy uporządkowane elementy muszą implementować interfejs Comparable (np. klasa String implementuje)

Pętla foreach Działa od wersji 5.0 Upraszcza użycie iteracji for(object o: kolekcja) { } System.out.println(o);

Generics (od 5.0) Kolekcja może zawierać obiekty dowolnego typu Można ograniczyć kolekcję do jednego typu Zamiast List lista = new ArrayList(); Piszemy List<Klient> lista = new ArrayList<Klient>(); Teraz do listy można dodać tylko dane zdefiniowanego typu Ten typ to może być także interfejs! Dzięki temu więcej błędów wykryjemy już na etapie kompilacji

Prosty przykład 1 // stwórz kolekcję Collection<String> c = new ArrayList<String>() // dodaj elementy for(int i=0;i<100;i++) c.add("aa"+i); // wyświetl elementy for(string s:c) System.out.println(s); Dla ArrayList i LinkedList elementy są w kolejności dodawania Dla HashSet elementy są nieposortowane Dla TreeSet elementy są posortowane tekstowo

Prosty przykład 2 // stwórz kolekcję Collection<String> c = new ArrayList<String>() // dodaj elementy (teraz cały czas taki sam!) for(int i=0;i<100;i++) c.add("aa"); // wyświetl elementy for(string s:c) System.out.println(s); Dla ArrayList i LinkedList elementy są w kolejności dodawania Dla HashSet i TreeSet jest tylko jeden element

Użycie ArrayList // stwórz kolekcję Collection<String> c = new ArrayList<String>() // dodaj elementy for(int i=0;i<10;i++) ((ArrayList)c).add(0,"aa"+i); // wyświetl elementy for(string s:c) System.out.println(s); Nowe elementy są teraz dodawane zawsze na początek

Po co kolekcje JFC Mniejszy wysiłek przy programowaniu Zwiększa jakość i szybkość programu Ułatwia wymianę informacji pomiędzy różnymi fragmentami kodu (bibliotekami) Ujednolica pracę w różnych miejscach kodu Pozwala na tworzenie własnych implementacji

Rozwiązanie z kolekcją DBHandler.getList() zwraca jeden tekst ze wszystkimi danymi DBHandler.getList2() będzie zwracało kolekcję wierszy W pliku index.jsp wyświetlone będą w pętli

DBHandler.getList() public String getlist() { String txt = ""; try{ ResultSet rs = DBCon.getConnection().createStatement().executeQuery("select * from pracownicy"); while(rs.next()) txt+= rs.getstring("nr_prac") +" "+rs.getstring("nazwisko"); }catch(sqlexception ec) {ec.printstacktrace();} return txt; }

DBHandler.getList2() public List<String> getlist2() { List<String> lista = new ArrayList<String>(); try{ ResultSet rs = DBCon.getConnection().createStatement().executeQuery("select * from pracownicy"); while(rs.next()) String txt = rs.getint("nr_prac")+""+rs.getstring("nazwisko"); lista.add(txt); }catch(sqlexception ec) {ec.printstacktrace();} return lista; }

Stary index.jsp Lista pracowników: <% pl.kurs.db.dbhandler dbh = new pl.kurs.db.dbhandler(); out.write(dbh.getlist()) %>

Nowy index.jsp Lista pracowników: <% pl.kurs.db.dbhandler dbh = new pl.kurs.db.dbhandler(); java.util.list<string> lista = dbh.getlist2(); for(string linia:lista) out.write(linia+"<br/>"); %>

JSTL użyjmy tagów! <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> Lista pracowników: <jsp:usebean id="dbh" class="pl.kurs.db.dbhandler"/> <c:foreach var="linia" items="${dbh.list2}"> ${linia}<br/> </c:foreach>

Co uzyskaliśmy? Całe formatowanie tylko w HTML Kod w Javie tylko generuje dane i przekazuje je w postaci listy Wciąż jednak brak dostępu do poszczególnych danych pracownika Nie da się formatować w zależności od wartości kolumny np. pogrubić nazwiska Nie da się zrobić tabelki z kolumnami: numer, nazwisko

Bean zamiast tekstu DBHandler.getList3() będzie zwracało kolekcję Kolekcję obiektów klasy Pracownik! Klasa Pracownik: JavaBean z getterami i setterami Pola Numer Nazwisko Plec Dla każdego pola getter i setter

Pracownik.java public class Pracownik { } private int numer; private String nazwisko; private String plec; public int getnumer() {return numer;} public void setnumer(int numer) {this.numer = numer;} public String getnazwisko() {return nazwisko;} public void setnazwisko(string nazwisko) {this.nazwisko = nazwisko;} public String getplec() {return plec;} public void setplec(string plec) {this.plec = plec;}

DBHandler.getList2() public List<String> getlist2() { List<String> lista = new ArrayList<String>(); try{ ResultSet rs = DBCon.getConnection().createStatement().executeQuery("select * from pracownicy"); while(rs.next()) String txt = rs.getint("nr_prac")+""+rs.getstring("nazwisko"); lista.add(txt); }catch(sqlexception ec) {ec.printstacktrace();} return lista; }

DBHandler.getList3() public List<Pracownik> getlist3() { List<Pracownik> lista = new ArrayList<Pracownik>(); try{ ResultSet rs = DBCon.getConnection().createStatement().executeQuery("select * from pracownicy"); while(rs.next()) Pracownik p = new Pracownik(); p.setnumer(rs.getint("nr_prac")); p.setnazwisko(rs.getstring("nazwisko")); p.setplec(rs.getstring("plec")); lista.add(p); }catch(sqlexception ec) {ec.printstacktrace();} return lista;}

Nowy index.jsp <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> Lista pracowników: <jsp:usebean id="dbh" class="pl.kurs.db.dbhandler"/> <c:foreach var="linia" items="${dbh.list2}"> ${linia}<br/> </c:foreach>

Nowy index.jsp <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> Lista pracowników: <jsp:usebean id="dbh" class="pl.kurs.db.dbhandler"/> <c:foreach var="linia" items="${dbh.list2}"> ${linia}<br/> </c:foreach> <c:foreach var="prac" items="${dbh.list3}"> ${prac.numer} ${prac.nazwisko} ${prac.plec}<br/> </c:foreach>

Efekt Do JSP przychodzi jeden obiekt, który jest typu "kolekcja pracowników" List<Pracownik> W JSP można prostą pętlą wydobyć wszystkie dane z kolekcji i dowolnie formatować <c:foreach var="prac" items="${dbh.list3}"> <c:if test="${prac.plec=='k'}"><font color="#ff0000"></c:if> ${prac.numer} ${prac.nazwisko} ${prac.plec}<br/> <c:if test="${prac.plec=='k'}"></font></c:if> </c:foreach>

Dziękuję za uwagę przygotował: pawel@kasprowski.pl