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.)

Podobne dokumenty