18 Wykorzystanie aplikacji Java Server Pages w środowisku J2EE Mikołaj Morzy Mikolaj.Morzy@cs.put.poznan.pl http://www.cs.put.poznan.pl/mmorzy/
Plan rozdziału 19 Serwlety Java Filtry serwletów Wprowadzenie do JavaServer Pages Biblioteki znaczników JSP Plik konfiguracyjny web.xml
Serwlety 20 Serwlet to klasa języka Java, która implementuje interfejs Servlet. Serwlety wykonują się w ramach kontekstu środowiska uruchomieniowego (servlet engine) i są współdzielone przez wielu klientów. Cykl życia serwletu: load init() service() destroy() Serwlet HTTP to klasa języka Java, która dziedziczy z klasy HttpServlet i która obsługuje metody GET i POST protokołu HTTP poprzez metody doget() i dopost() parametry wywołania przekazywane do serwletu poprzez obiekt HttpServletRequest wygenerowana odpowiedź przekazywana do klienta poprzez obiekt HttpServletResponse
MyServlet.java Przykład prostego serwletu 21 // import niezbędnych klas import java.io.*; import javax.servlet.*; import javax.servlet.http.*; // klasa serwletu dziedzicząca z klasy HttpServlet public class MyServlet extends HttpServlet { // metoda odpowiedzialna za obsługę metody GET protokołu HTTP public void doget(httpservletrequest req, HttpServletResponse res) throws ServletException, IOException { res.setcontenttype("text/html"); PrintWriter out = res.getwriter(); } } out.println("<html>"); out.println("<head><title>bajarz v.0.1</title></head>"); out.println("<body>"); out.println("dawno, dawno temu..."); out.println("</body></html>");
Obsługa danych wejściowych 22 Metoda GET przekazuje dane wejściowe zakodowane w łańcuchu URL, np. http://www.google.com?q=jsp&lang=pl ręczne wpisanie URL wykorzystanie hiperłącza formularz bez metody lub z metodą GET Metoda POST przekazuje dane wejściowe na standardowe wejście formularz z metodą POST W obu przypadkach serwlet odczytuje wartości danych wejściowych za pomocą metody getparameter(). Nazwy parametrów można odczytać za pomocą metody getparameternames()
Przykład serwletu z obsługą danych wejściowych MyServlet.java import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class MyServlet extends HttpServlet { public void doget(httpservletrequest req, HttpServletResponse res) throws ServletException, IOException { res.setcontenttype("text/html"); PrintWriter out = res.getwriter(); // pobranie wartości parametru String language = req.getparameter("lang"); 23 } } out.println("<html>"); out.println("<head><title>bajarz v.0.2</title></head>"); out.println("<body>"); if (language.equals("pl")) out.println("dawno, dawno temu..."); else out.println("once upon a time..."); out.println("</body></html>");
Filtry serwletów 24 Filtr pozwala na przechwycenie i zmodyfikowanie zarówno żądania kierowanego do serwletu jak i odpowiedzi generowanej przez serwlet. Filtr może też modyfikować nagłówki żądania i odpowiedzi. Filtry służą do tworzenia spójnego mechanizmu autentyfikacji śledzenia użytkowników kompresowania danych "w locie" Filtr to klasa implementująca interfejs javax.servlet.filter void init(filterconfig) void dofilter(servletrequest, ServletResponse, FilterChain) void destroy() Konfiguracja: element <filter> i <filter-mapping> w pliku web.xml
MyFilter.jsp Przykład filtra 25 import javax.servlet.*; import javax.servlet.filter; import java.io.ioexception; public class MyFilter implements Filter { private FilterConfig fc; public void init(filterconfig filterconfig) throws ServletException { fc = filterconfig; } } public void destroy() { } // metoda dokonująca filtrowania i modyfikacji żądań i odpowiedzi public void dofilter(servletrequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request.setattribute("user","anonymous"); chain.dofilter(request, response); response.setcontenttype("image/jpg"); }
Java Server Pages - wprowadzenie 26 Serwlety nie umożliwiają oddzielenia części statycznej od dynamicznej. JSP to rozszerzenie technologii serwletów o możliwość łączenia statycznego HTML lub XML z dynamicznym kodem Java. Kod JSP jest automatycznie tłumaczony na odpowiadający mu serwlet. przeglądarka HTTP serwer aplikacji aplikacja JSP generowanie kompilacja serwlet wykonanie
Przykład prostej strony JSP 27 first.jsp <%@ page language="java" %> <html> <head> <title>eurokonwerter v.0.1</title> </head> <body> Dyrektywa, określa globalne ustawienia strony: język, dołączane pliki, biblioteki znaczników statyczny kod HTML <%! double priceeur = 10, pricepln = 0; %> <%! Double ratiopln2eur = 4.75; %> Deklaracje, zmienne globalne <% pricepln = priceeur * ratiopln2eur; %> Skryptlety, fragmenty kodu Java <p> Kwocie <%= priceeur %> euro odpowiada <%= pricepln %> zlotych </body> </html> Wyrażenia, wyświetlane po określeniu wartości
Dyrektywy 28 Dyrektywy to informacje dla kontenera JSP dotyczące translacji lub wykonania danej strony JSP <%@ page %> definiuje atrybuty strony, takie jak język, rozmiar bufora, rodzaj zawartości, klasę z której dana strona dziedziczy, automatyczne czyszczenie bufora, itp. <%@ include %> wskazuje zasób (plik lub kod) który powinien zostać dołączony podczas translacji strony <%@ taglib %> wskazuje na bibliotekę znaczników JSP używanych na stronie JSP, zawiera wskazanie na specjalny plik zwany deskryptorem biblioteki znaczników oraz prefiks używany przez znaczniki z danej biblioteki
Deklaracje, wyrażenia, skryptlety 29 Deklaracje służą do definiowania metod i zmiennych, mogą zawierać inicjalizację. Metody i zmienne deklarowane za pomocą znaczników <%! %> są tłumaczone na statyczne metody i pola klasy serwletu. Wyrażenia powodują wstawienie wartości wyrażenia Java bezpośrednio do ciała strony, wyrażenie zawarte w znacznikach <%= %> jest tłumaczone na instrukcję print() wewnątrz metody _jspservice(). Skryptlety to fragmenty kodu Java wstawiane bezpośrednio do metody _jspservice(), zmienne deklarowane wewnątrz skrypletu są tłumaczone na zmienne metody.
Obiekty predefiniowane 30 Strony JSP mogą zawierać odwołania do następujących predefiniowanych obiektów request zawiera wszystkie parametry wywołania strony JSP response reprezentuje odpowiedź zwracaną klientowi out reprezentuje stronę zwracaną klientowi session reprezentuje sesję HTTP application reprezentuje kontekst serwletu config konfiguracja serwletu czytana podczas inicjalizacji pagecontext kontekst strony, zawiera obiekty których zakresem widzialności jest bieżąca strona page reprezentuje bieżącą stronę JSP
Znaczniki akcji 31 Znaczniki akcji powodują wykonanie określonej akcji podczas przetwarzania strony JSP. Akcją może być utworzenie instancji obiektu JavaBean przekierowanie sterowania do innego dokumentu HTML, serwletu lub strony JSP włączenie zewnętrznego zasobu (pliku lub kodu) do strony JSP <jsp:usebean>: utworzenie instancji klasy zewnętrznej i nadanie zasięgu <jsp:setproperty>: ustawienie wartości parametru klasy zewnętrznej <jsp:getproperty>: pobranie wartości parametru klasy zewnętrznej <jsp:param>: dodanie wartości parametrów przed przekierowaniem <jsp:include>: włączenie zasobu do strony JSP <jsp:forward>: przekierowanie przetwarzania do innej strony, serwletu <jsp:plugin>: wykonanie appletu lub komponentu JavaBean w przeglądarce klienta poprzedzone ściągnięciem wtyczki Java
Obiekty JavaBean 32 Klasy zewnętrzne wykorzystywane w stronach JSP nazywane są JavaBeans. Wykorzystanie klas zewnętrznych ma na celu skrócenie kodu, ułatwienie pielęgnacji aplikacji, możliwość ponownego wykorzystania kodu zaimplementowanego w klasie zewnętrznej. Zasięg obiektów JavaBean jest definiowany przez programistę page: zasięg bieżącej strony request: zasięg stron obsługujących bieżące żądanie session: zasięg bieżącej sesji HTTP application: zasięg całej bieżącej aplikacji
Przykład wykorzystania JavaBean 33 Converter.java package ploug; public class Converter { double ratiopln2eur; second.jsp public Converter() { this.ratiopln2eur = 4.75;} <%@ page language="java" %> <html> <head> } public double convert(double priceeur){ return this.ratiopln2eur * priceeur;} <title>eurokonwerter v.0.1</title> </head> <body> // utworzenie instancji klasy Converter <jsp:usebean id="c" class="ploug.converter" scope="page"/> <%! double pricepln = 0, priceeur = 10; %> <% pricepln = c.convert(priceeur); %> <p> Kwocie <%= priceeur %> euro odpowiada <%= pricepln %> zlotych </body> </html>
Dokumenty JSP XML 34 Tradycyjne strony JSP nie są poprawnymi dokumentami JSP. Standard JSP 1.1 wprowadził składnię kompatybilną z XML. Strona JSP zbudowana zgodnie ze składnią XML nazywana jest dokumentem JSP. Każdy dokument JSP posiada znacznik <jsp:root> który identyfikuje stronę jako dokument JSP podaje wersję JSP i podaje przestrzenie nazw dla składni XML Znaczniki dyrektyw, wyrażeń, skryptletów i akcji posiadają swoje odpowiedniki zgodne ze składnią XML
Przykład dokumentu JSP 35 third.jspx <?xml version = '1.0' encoding = 'windows-1250'?> <jsp:root xmlns:jsp="http://java.sun.com/jsp/page" version="1.2"> <jsp:directive.page contenttype="text/html"/> <jsp:usebean id="c" class="ploug.converter" scope="page"/> <jsp:declaration> double priceeur = 10, pricepln = 0; </jsp:declaration> <jsp:scriptlet> pricepln = c.convert(priceeur); </jsp:scriptlet> <jsp:text>kwocie </jsp:text> <jsp:expression>priceeur</jsp:expression> <jsp:text> euro odpowiada </jsp:text> <jsp:expression>pricepln</jsp:expression> <jsp:text> zlotych </jsp:text> </jsp:root>
Wywołanie JSP z serwletu 36 Aby wywołać stronę JSP z serwletu należy uzyskać kontekst serwletu: ServletContext cs=this.getservletcontext() uzyskać zarządcę żądań: RequestDispatcher rd=cs.getrequestdispatcher("/myjsp.jsp"); przekierunkować przetwarzanie za pomocą metod include() lub forward(): rd.include(request, response); Dane do strony JSP można przekazać umieszczając je w adresie URL: RequestDispatcher rd = cs.getrequestdispatcher("/myjsppage.jsp?lang=pl"); wykorzystując metodę setattribute() obiektu request: request.setattribute("lang","pl"); RequestDispatcher rd = cs.getrequestdispatcher("/myjsppage.jsp?lang=pl");
Biblioteki znaczników 37 Biblioteki znaczników to zbiory znaczników definiowanych przez programistę. Znaczniki definiowane przez programistę mają tę samą funkcjonalność co klasy zewnętrzne. Wiele bibliotek znaczników jest oferowanych przez producentów. Przed użyciem biblioteki znaczników należy ją zadeklarować <%@ taglib uri="library.tld" prefix="myprefix" %> JSP 1.1 i późniejsze wersje standardu umożliwiają tworzenie własnych znaczników. Utworzenie własnego znacznika wymaga utworzenia klas obsługi znacznika (tag handler class) oraz deskryptora biblioteki znaczników (tag library descriptor)
Standardowe biblioteki 38 Java Server Pages Standard Tag Library (JSTL) JSTL expression language (EL): zapewnia abstrakcyjny język umożliwiający definiowanie operatorów logicznych, arytmetycznych, relacyjnych, operatorów dostępu do danych, itp. znaczniki podstawowe (core tags): reprezentują instrukcje warunkowe, iteratory, oraz operacje na URL, znaczniki c:if, c:catch, c:choose, c:foreach, c:when, c:out, c:set, c:remove, itp. znaczniki XML: umożliwiają pracę z dokumentami XML, parsowanie i transformację dokumentów, znaczniki x:parse, x:choose, x:if, x:otherwise, x:transform, x:param znaczniki SQL: praca z bazą danych, znaczniki sql:query, sql:update, sql:transaction, sql:setdatasource, sql:driver, sql:param, sql:dateparam znaczniki i18n: internacjonalizacja i transformacja danych
Standardowe biblioteki 39 Rozszerzenia Oracle OJSP SQL: dostęp do bazy danych, znaczniki dbopen, dbquery, dbclosequery, dbnextrow, dbexecute, dbclose OJSP File Access: przesyłanie danych między klientem a serwerem (operacje upload i download), znaczniki httpdownload, httpupload, httpuploadform OJSP Utility: znaczniki displaycurrency, displaynumber, displaydate, lastmodified OJSP EMail: znacznik sendmail Oracle9iAS Personalization: automatyczne rekomendacje i rankingi na podstawie Oracle Data Mining, znaczniki getrecommendations, getcrosssellrecommendations, selectfromhotpics, evaluateitems,
JSTL SQL Tag Library 40 Biblioteka JSTL SQL TagLib dostarcza znaczników służących do interakcji z relacyjną bazą danych źródło danych <sql:setdatasource var="name" scope="sc" datasource="expr"> <sql:setdatasource var="name" url="expr" user="expr" password="expr"> zapytanie <sql:query sql="expr" datasource="expr" var="expr"> <sql:param value="expr"/><sql:dateparam value="expr"/> </sql:query> dostęp do wyniku zapytania: javax.servlet.jsp.jstl.sql.result i własności rows, rowsbyindex, columnnames, rowcount modyfikacje <sql:update sql="expr" datasource="expr" var="expr"/> transakcje <sql:transaction isolation="isolevel">...</sql:transaction>
Standardowe biblioteki 41 Rozszerzenia Oracle9iAS Oracle9i JDeveloper Business Components for Java (BC4J) Tag Library: dostęp do komponentów i źrodel danych BC4J Oracle9i JDeveloper User Interface Extension (UIX) Tag Library: znaczniki generujące elementy interfejsu użytkownika Oracle9i Reports Tag Library: znaczniki umożliwiające integrację Oracle Reports i stron JSP Oracle9iAS Wireless Location (Spatial) Tag Library: znaczniki do kodowania danych geograficznych, routingu, tworzenia katalogów Oracle9iAS Ultra Search Tag Library: znaczniki do tworzenia zaawansowanych serwisów do wyszukiwania informacji Oracle9iAS Portal Tag Library: znaczniki do tworzenia aplikacji typu portalowego
Przykład zastosowania biblioteki 42 fourth.jsp <%@ taglib uri="http://xmlns.oracle.com/j2ee/jsp/tld/ojsp/sqltaglib.tld" prefix="database"%> <%@ page contenttype="text/html"%> <html> <body> <database:dbopen connid="db" datasource="jdbc/oracleds"> <database:dbquery connid="db" queryid="employees"> select * from emp </database:dbquery> </database:dbopen> <database:dbclose connid="db"/> </body> </html>
fourth_iterate.jsp Przykład zastosowania biblioteki 43 <%@ taglib uri="http://xmlns.oracle.com/j2ee/jsp/tld/ojsp/sqltaglib.tld" prefix="database"%> <%@ page contenttype="text/html"%> <html> <body> <table border="1"> <database:dbopen connid="db" datasource="jdbc/oracleds"> <database:dbquery connid="db" queryid="employees" output="jdbc"> select * from emp </database:dbquery> <database:dbnextrow queryid="employees"> <tr> <td><%= employees.getstring("ename") %></td> <td><%= employees.getstring("job") %></td> </tr> </database:dbnextrow> </database:dbopen> <database:dbclose connid="db"/> </table> </body> </html>
fifth.jsp Przykład zastosowania biblioteki 44 <%@ taglib uri="http://java.sun.com/jstl/core" prefix="c"%> <%@ taglib uri="http://java.sun.com/jstl/sql" prefix="sql"%> <%@ page contenttype="text/html"%> <html> <body> <sql:setdatasource var="db" driver="oracle.jdbc.driver.oracledriver" datasource="jdbc/oracleds" url="jdbc:oracle:thin:@miner.cs.put.poznan.pl:1521:miner" user="scott" password="tiger" /> <sql:query var="employees">select * from emp</sql:query> <c:foreach var="columnname" items="${employees.columnnames}"> <th><c:out value="${columnname}"/></th> </c:foreach> <c:foreach var="row" items="${employees.rows}"> <tr><c:foreach var="column" items="${row}"> <td><c:out value="${column.value}"/></td> </c:foreach></tr> </c:foreach> </body> </html>
sixth.jsp Przykład zastosowania biblioteki 45 <%@ taglib uri="http://xmlns.oracle.com/uix/ui" prefix="uix"%> <%@ taglib uri="http://xmlns.oracle.com/j2ee/jsp/tld/ojsp/fileaccess.tld" prefix="fileaccess"%> <%@ taglib uri="http://xmlns.oracle.com/j2ee/jsp/tld/ojsp/utiltaglib.tld" prefix="util"%> <%@ page contenttype="text/html;charset=windows-1250"%> <html> <body> <P>Strona modyfikowana ostatni raz <util:lastmodified/> <P>Proszę wybrać plik do załadowania: <fileaccess:httpuploadform formsaction="myuploadservlet"/> <P>Proszę wybrać ulubiony kolor <uix:colorpicker /> <P><uix:checkBox checked="true" text="to jest checkbox"/> <P><uix:button text="przycisk" /> <P><uix:messageLovInput /> <P><uix:messageBox message="to jest bardzo ważne"/> </body> </html>
Plik konfiguracyjny web.xml 46 Plik web.xml stanowi opis konfiguracji instalacji aplikacji Web. W pliku web.xml znajdują się opisy serwletów, filtrów serwletów, stron inicjalizacyjnych, stron z komunikatami o błędach, mapowania między serwletami i adresami URL, informacje o użytych bibliotekach znaczników oraz parametrach inicjalizacyjnych i ograniczeniach związanych z bezpieczeństwem. Plik web.xml zawiera również referencje do innych komponentów J2EE użytych w aplikacji (komponenty EJB, źródła danych, itp.)