Wykorzystanie aplikacji Java Server Pages w środowisku J2EE
Transkrypt
Wykorzystanie aplikacji Java Server Pages w środowisku J2EE
18 Wykorzystanie aplikacji Java Server Pages w środowisku J2EE Mikołaj Morzy [email protected] http://www.cs.put.poznan.pl/mmorzy/ 19 Plan rozdziału • • • • • Serwlety Java Filtry serwletów Wprowadzenie do JavaServer Pages Biblioteki znaczników JSP Plik konfiguracyjny web.xml 20 Serwlety • 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 21 Przykład prostego serwletu MyServlet.java // 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>"); } } 22 Obsługa danych wejściowych • 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 MyServlet.java wejściowych 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"); 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>"); } } 23 24 Filtry serwletów • 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 25 Przykład filtra MyFilter.jsp 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"); } } 26 Java Server Pages - wprowadzenie • 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 generowanie kompilacja aplikacja JSP wykonanie serwlet 27 Przykład prostej strony JSP 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 28 Dyrektywy • 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 29 Deklaracje, wyrażenia, skryptlety • 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. 30 Obiekty predefiniowane • 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 – – – – – – – 31 Znaczniki akcji • 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 32 Obiekty JavaBean • 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 33 Przykład wykorzystania JavaBean Converter.java package ploug; public class Converter { double ratioPLN2EUR; second.jsp <%@ page language="java" %> public Converter() { this.ratioPLN2EUR = 4.75;} public double convert(double priceEUR){ return this.ratioPLN2EUR * priceEUR;} <html> } <head> <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> 34 Dokumenty JSP XML • 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 35 Przykład dokumentu JSP 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> 36 Wywołanie JSP z serwletu • 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"); 37 Biblioteki znaczników • 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) 38 Standardowe biblioteki • 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 39 Standardowe biblioteki • 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, 40 JSTL SQL Tag Library • 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> 41 Standardowe biblioteki • 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 42 Przykład zastosowania biblioteki 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> 43 Przykład zastosowania biblioteki fourth_iterate.jsp <%@ 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> 44 Przykład zastosowania biblioteki fifth.jsp <%@ 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> 45 Przykład zastosowania biblioteki sixth.jsp <%@ 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> 46 Plik konfiguracyjny web.xml • 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.)