Aplikacje Internetowe



Podobne dokumenty
prepared by: Java Server Pages Sesje, cookies, znaczniki

Aplikacje Internetowe

prepared by: Programowanie WWW Model-View-Controller

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

przygotował: Bazy danych Paweł Kasprowski Wersja 2006Z

JAVA I BAZY DANYCH. MATERIAŁY:

Aplikacje bazodanowe. dr inż. Arkadiusz Mirakowski

Programowanie w Sieci Internet JSP ciąg dalszy. Kraków, 9 stycznia 2015 r. mgr Piotr Rytko Wydział Matematyki i Informatyki

Połączenie z bazą danych

Wprowadzenie do JDBC z wykorzystaniem bazy H2

Java i jej wykorzystanie do tworzenia dynamicznych aplikacji Webowych

JDBC (Java Database Connectivity vit )

Wykład dla studentów Informatyki Stosowanej UJ 2012/2013

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

Metody dostępu do danych

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

Java wybrane technologie

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

Projektowanie aplikacji w modelu MVC opartej o framework CodeIgniter

Java Database Connectivity

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

Podstawowe wykorzystanie Hibernate

Elementy JEE. 1. Wprowadzenie. 2. Prerekwizyty. 3. Pierwszy servlet. obsługa parametrów żądań 4. JavaServer Pages.

Podejście obiektowe do relacyjnych baz danych Hibernate.

Wykorzystywanie parsera DOM w programach Java i PL/SQL

Aplikacje internetowe - laboratorium

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

Java Database Connectivity

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

Wzorce logiki dziedziny

Aplikacje Internetowe, Servlety, JSP i JDBC

Aplikacje WWW - laboratorium

Java rozszerzenie. dr. A. Dawid

Programowanie w Internecie. Podstawy użycia JSP. Paweł Kasprowski. vl06z

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

Kurs programowania aplikacji bazodanowych

akademia androida Składowanie danych część VI

Wielojęzykowość w aplikacjach J2EE. Tomasz.Skutnik@e-point.pl

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

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Ćwiczenia 2 IBM DB2 Data Studio

Bartosz Jachnik - Kino

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

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

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

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

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

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

PHP może zostać rozszerzony o mechanizmy dostępu do różnych baz danych:

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

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

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

prepared by: Programowanie WWW Servlety

Języki programowania wysokiego poziomu. PHP cz.4. Bazy danych

1 Wprowadzenie do J2EE

Wdrożenie modułu płatności eservice. dla systemu Magento

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

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

Zaawansowane aplikacje WWW - laboratorium

Programowanie w języku Java

Database Connectivity

Internetowe bazy danych

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

Wydział Elektrotechniki, Informatyki i Telekomunikacji Instytut Informatyki i Elektroniki

Aplikacje WWW - laboratorium

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

Wersjonowanie baz danych podczas developmentu. Liquibase. Piotr Pelczar.

Dostęp do baz danych z serwisu www - PHP. Wydział Fizyki i Informatyki Stosowanej Joanna Paszkowska, 4 rok FK

Programowanie Obiektowe Java

Bazy Danych i Usługi Sieciowe

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

Ćwiczenie 1. Kolejki IBM Message Queue (MQ)

Wdrożenie modułu płatności eservice. dla systemu Gekosale 1.4

Bazy danych i usługi sieciowe

Db4o obiektowa baza danych wersja.net

Wykład 7: Pakiety i Interfejsy

Wzorce prezentacji internetowych

Programowanie w Javie

Programowanie Obiektowe Java

Przegląd technologii JSP

Aplikacje RMI

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

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

Język JAVA podstawy. wykład 2, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Bazy danych SQLite w Javie

Wprowadzenie do Doctrine ORM

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

Dzisiejszy wykład. Wzorce projektowe. Visitor Client-Server Factory Singleton

Serwery Statefull i Stateless

Tuning SQL Server dla serwerów WWW

Systemy Rozproszone - Ćwiczenie 6

Aplikacje WWW - laboratorium

Bazy danych wykład dwunasty

Programowanie obiektowe

Aplikacje Internetowe. przygotował:

Aplikacje Internetowe. Zakres przedmiotu. Plan ramowy. Tworzenie aplikacji internetowych w języku Java w środowisku Eclipse

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

Serwery aplikacji. dr Radosław Matusik. radmat

Programowanie obiektowe zastosowanie języka Java SE

Enterprise JavaBeans

Transkrypt:

Aplikacje Internetowe Bazy danych, JSTL

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

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");

Pierwszy przykład JDBC 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.");} } } 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 ".;mssqlserver.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("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.");} } DBExample1.java

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

Użycie w AI Można bezpośrednio w skryplecie Konieczny sterownik Wystarczy wgrać sterownik do WEB-INF/lib Można go również umieścić w katalogu lib serwera

Stworzenie tabeli CREATE TABLE car ( ); idc int NOT NULL auto_increment, make varchar(50), model varchar(50), regnum varchar(8) NOT NULL, price double default NULL, PRIMARY KEY (`idc`)

Wstawienie danych INSERT INTO car VALUES(1,'Fiat','Brava','SH01089',20); INSERT INTO car VALUES(2,'Fiat','Punto','FA34589',20); INSERT INTO car VALUES(3,'Ford','Fiesta','AW29034',20); INSERT INTO car VALUES(4,'Ford','Focus','KA34567',20); INSERT INTO car VALUES(5,'Opel','Astra','WA10293',20);

public String getcars() { try{ Użycie bazy danych Class.forName("com.mysql.jdbc.Driver"); Connection con = DriverManager.getConnection( "jdbc:mysql://127.0.0.1/baza","user","pass"); Statement stmt = con.createstatement(); ResultSet rs = stmt.executequery("select * from car"); while(rs.next()) txt += rs.getstring(1)+" "+rs.getstring(4); con.close(); }catch(sqlexception ec) {ec.printstacktrace();} catch(classnotfoundexception ex) {ex.printstacktrace();} }

Prawidłowe zamykanie public String getcars() { Connection con = null; try{ połączenia con = DriverManager.getConnection( "jdbc:mysql://127.0.0.1/baza","user","pass"); }catch(sqlexception ec) {ec.printstacktrace();} finally { } } try{con.close();}catch(sqlexception ec) {ec.printstacktrace();}

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 = new com.mysql.jdbc.jdbc2.optional.mysqldatasource(); ds.setuser("lab"); ds.setpassword("lab"); ds.seturl(" jdbc:mysql://127.0.0.1/baza "); Connection con = ds.getconnection();

Problemy Utrzymywanie połączenia Wielowątkowość aplikacji

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 przechować informację o połączeniu, jeśli jest ono używane w różnych obiektach Rozwiązanie: w każdym miejscu aplikacji dostęp do obiektu DataSource z którego można pobrać połączenie (obiekt Connection)

Wielodostęp do danych Aplikacje internetowe wielu jednoczesnych użytkowników tej samej aplikacji Nie ma potrzeby nawiązywania połączenia dla każdego - każdy z nich może używać tego samego połączenia Problem: co jeśli dwóch użytkowników potrzebuje danych w tym samym czasie? Rozwiązanie najprostsze: blokada połączenia na czas używania Rozwiązanie lepsze: stworzenie wielu połączeń

Connection pooling Jeśli jest dużo klientów można otworzyć kilka równoległych połączeń z bazą Konieczny obiekt, który przechowuje pulę połączeń i udostępnia klientom Gdy klient zwalnia połączenie - wraca ono do puli Dobra wiadomość: Apache Tomcat posiada już coś takiego DBCP (Database Connection Pool) Wystarczy skonfigurować źródło danych w XMLu

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( return ds.getconnection(); }catch(sqlexception ec) {... } catch(namingexception ne) {...} return null; } "java:/comp/env/jdbc/mydb"); Zamknięcie tak uzyskanego połączenia zwraca je do puli dostępnych

Użycie bazy danych public String getcars() { try{ Connection con = getconnection(); Statement stmt = con.createstatement(); ResultSet rs = stmt.executequery("select * from car"); while(rs.next()) txt += rs.getstring(1)+" "+rs.getstring(4); con.close(); // nie zamyka połączenia tylko oddaje }catch(sqlexception ec) {ec.printstacktrace();} }

Użycie bazy danych public String getcars() { Connection con = null; try{ con = getconnection(); Statement stmt = con.createstatement(); ResultSet rs = stmt.executequery("select * from car"); while(rs.next()) txt += rs.getstring(1)+" "+rs.getstring(4); }catch(sqlexception ec) {ec.printstacktrace();} finally{ try{con.close();}catch(sqlexception ex) { } }

Podsumowanie Wystarczy skonfigurować DBCP Dodanie elementu <Resource> Dołączyć do aplikacji sterownik Wywołać w programie Context initcontext = new InitialContext(); DataSource datasource = (DataSource)initContext.lookup("java:/comp/env/jdbc/mydb"); Dla obiektu datasource wywołać: Connection con = datasource.getconnection();... tu kod korzystający z bazy Con.close();

Problemy ze skrypletami Mieszanie kodu HTML, Java i JavaScript powoduje nieczytelność Logika jest rozdzielona na różne strony Debugowanie jest trudne W rozbudowanych aplikacjach: HTML developers interfejs użytkownika Java developers logika aplikacji

Przykład strony JSP <body> <h1>edycja odczynnika <%=request.getparameter("cas")%></h1> <input type=button value='< powrót do karty' onclick='document.location="view.jsp?cas=<%=request.getparameter("cas")%>"'> <font size=11> <% cas.casedit casedit=new cas.casedit(request.getparameter("cas")); if(request.getparameter("delete")!=null) { casedit.delete(request.getparameter("oid")); %><SCRIPT language='javascript'> document.location='edit.jsp?cas=<%=request.getparameter("cas")%>&x=x';</script><% } if(request.getparameter("update")!=null && request.getparameter("sbm")!=null) { casedit.update(request.getparameter("oid"),request.getparameter("type"), request.getparameter("newdata"),request.getparameter("newdata2"),session); out.println(casedit.gettable("",request.getparameter("newtype"),session)); } else { if(request.getparameter("anuluj")!=null) out.println(casedit.gettable("",request.getparameter("newtype"),session)); else out.println(casedit.gettable(request.getparameter("oid"),request.getparameter("newtype"), session)); } %> </body>

Użycie tagów Cel: uniknięcie kodu w Javie na stronie HTML Otwieranie i zamykanie tagu <some.tag> </some.tag> Tag pojedynczy <some.tag/> Tagi mogą być: predefinowane w specyfikacji JSP: <jsp:...> ładowane z bibliotek

Tagi predefinowane <jsp:include page="page.jsp"/> <jsp:forward page="page.jsp"/> <jsp:param name="..." value="..."/> <jsp:usebean> <jsp:setproperty> <jsp:getproperty>

Biblioteki tagów Przykładowe biblioteki http://java.sun.com/products/jsp/jstl/ http://jakarta.apache.org/taglibs/ http://jsptags.com/tags/ Włączanie biblioteki do aplikacji WEB-INF/lib/xyz.jar WEB-INF/*.tld Załadowanie definicji (*.tld) na stronie JSP: <% @taglib uri="<address>" prefix="xyz" %> Użycie tagu: <xyz:newtag>...</xyz:newtag>

JSTL Java Standard Tag Library Biblioteka Sun'a Różne implementacje najpopularniejsza: jakarta-taglibs Usprawnienia na stronach JSP bez użycia skrypletów (kodu w Javie) Ładowanie JSTL (jakarta): wgrać pliki standard.jar i jstl.jar do katalogu WEB-INF/lib

Elementy JSTL core <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> Zmienne, kontrola przepływu fmt <%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%> Formatowanie dat, lokalizacja sql <%@taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%> Obsługa baz danych XML <%@taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x"%> Operacja na dokumentach XML functions <%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%> Funkcje konwertujące i inne

Expression Language ${expression} Uproszczony dostęp do: standardowych obiektów i właściwości beanów obiektów typu Map, List czy Array Włączone do JSP 2.0

Core JSTL c:set c:out c:if c:foreach c:choose, c:when

c:set i c:out ustawianie i czytanie <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <html> <body> <c:set var="name" value="pawel"/>... My name is ${name} </body> </html>

c:if tag <c:if test="${some test}"> jakiś kod </c:if> <c:if test="${x>5}"> x is greater than 5! </c:if>

Zakresy widoczności obiektów page tylko na stronie request dla następnej strony przetwarzającej parametry z aktualnej session dla wszystkich stron w ramach sesji application dla całej aplikacji

Zakres (scope) zmiennych Domyślnie: request (inne: session, application, page) <c:if test="${empty sessionscope.x}"> <c:set var="x" value="1" scope="session"/> </c:if> <p>current value: ${x}</p> <c:set var="x" value="${x + 1}" scope="session"/>

c:choose tag <p> <c:choose> <c:when test="${x> 0 and x<= 5}"> "x" value in range (0, 5> </c:when> <c:when test="${x> 5 and x <= 10}"> "x" value in range (5, 10> </c:when> <c:otherwise> "x" value over 10 or below 0! </c:otherwise> </c:choose> </p>

c:foreach tag Kod z użyciem JSTL: <ul> <c:foreach var="i" begin="1" end="10"> <li>${i} </c:foreach> </ul> To samo jako scriplet: <ul> <% for(int i=1; i<=10; i++) { out.println("<li>"+i); } %> </ul>

Inne przykłady c:foreach <c:foreach var="i" begin="0" end="1000" step="100"> <c:foreach var="word" items="${words}"> <c:foreach var="country" items="australia,canada,japan,philippines,usa"> <c:fortokens var="color" items="(red (orange) yellow)(green)((blue) violet)" delims="()">

Moduł Functions <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> <c:set var="str" value="here we have a simple text"/> <p>text: ${str} <p>to upper case: ${fn:touppercase(str)} <p>text length: ${fn:length(str)}</p> <p>does it contain "have" word?: ${fn:contains(str,"have")}</p> <p>number of words (space separated): ${fn:length(fn:split(str," "))}</p> <p>letter "s" in at position: ${fn:indexof(str, "s")}</p> <p>replace "s" with "%": ${fn:replace(str, "s", "#")}</p>

Funkcje formatujące <fmt:formatnumber> <fmt:parsenumber> <fmt:formatdate> <fmt:parsedate> <fmt:setlocale> <fmt:bundle>, <fmt:setbundle> <fmt:message> <fmt:param>

Funkcje modułu sql <sql:setdatasource driver="com.mysql.jdbc.driver" url="jdbc:mysql://localhost:3306/mydb" user="" password=""/> <sql:query var="results" sql="select * FROM car"/> <c:foreach var="row" items="${results.rows}"> ${row.make} ${row.model} <br/> </c:foreach>

Uniwersalny showrs <table border="1"> <tr> <%-- Get the column names for the header of the table --%> <c:foreach var="columnname" items="${results.columnnames}"> <th>${columnname}</th> </c:foreach> <%-- Get the value of each column while iterating over rows --%> <c:foreach var="row" items="${results.rows}"> <tr> <c:foreach var="column" items="${row}"> <td>${column}</td> </c:foreach> </c:foreach> </table>

Podsumowanie W JSP można używać tagów Jest kilka użytecznych bibliotek tagów Główna idea: bez kodu w Javie na stronie JSP! Problem: obsługa wyjątków, kontrola parametrów Krok dalej: sprawdzenie parametrów i przygotowanie danych w klasach Javy wyświetlanie przygotowanych danych za pomocą JSP