Java Enterprise Edition spotkanie nr 3. Serwlety c.d.



Podobne dokumenty
Java wybrane technologie spotkanie nr 4. Serwlety c.d.

Java wybrane technologie spotkanie nr 5. Java Server Pages

Java wybrane technologie spotkanie nr 3. Serwlety

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

prepared by: Programowanie WWW Servlety


Java Enterprise Edition spotkanie nr 4. Java Server Pages c.d.

mgr inż. Michał Paluch

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

Wzorce prezentacji internetowych

Serwery aplikacji. dr Radosław Matusik. radmat

Programowanie w Sieci Internet filtry oraz web.xml. Kraków, 11 stycznia 2013 r. mgr Piotr Rytko Wydział Matematyki i Informatyki

Serwlety. Co to jest serwlet? Przykładowy kod serwletu. Po co są serwlety?

1 Wprowadzenie do J2EE

Java EE: Serwlety i filtry serwletów

Kurs WWW 1. Paweł Rajba

Architektury Usług Internetowych. Laboratorium 1. Servlety

Wprowadzenie do JSP. Marcin Apostoluk, Tadeusz Pawlus, Wojciech Walczak. Technologie Biznesu Elektronicznego, 7 marzec 2006

JavaServer Pages. Konrad Kurdej Karol Strzelecki

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

Serwlety Java: zagadnienia zaawansowane. Data Sources. Data Sources. Przykład pliku data-sources.xml

Zaawansowane aplikacje internetowe - laboratorium Web Services (część 1).

Komunikacja między serwletami

Serwlety i JSP. Autor: Marek Zawadka deekay@gazeta.pl

Aplikacje internetowe i rozproszone - laboratorium

Programowanie wielowarstwowe i komponentowe JSP, JSF

Piotr Laskowski Krzysztof Stefański. Java Servlets

Tworzenie i wykorzystanie usług

Serwery aplikacji. dr Radosław Matusik. radmat

Aplikacje WWW - laboratorium

CGI i serwlety. Plan wykładu. Wykład prowadzi Mikołaj Morzy. Przykład: serwlety vs. szablony. Implementacja logiki prezentacji

prepared by: Programowanie WWW Model-View-Controller

b) Jako nazwę projektu wpisz SerwletyJSPJSTL. Nie zmieniaj wartości pozostałych opcji. Kliknij przycisk Next >.

Programowanie obiektowe

Serwlety i JSP na platformie Java EE. Damian Makarow

Aplikacje WWW - laboratorium

Przegląd technologii JSP

PaaS technologie i standardy. Paulina Adamska tiia@pjwstk.edu.pl

Aplikacje WWW - laboratorium

Gatesms.eu Mobilne Rozwiązania dla biznesu

2) W wyświetlonym oknie należy zaznaczyć chęć utworzenia nowej aplikacji (wygląd okna może się różnić od powyższego); kliknąć OK

Facelets ViewHandler

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Java Database Connectivity

Wybrane działy Informatyki Stosowanej

Podstawowe wykorzystanie Hibernate

Programowanie w języku Java

Aplikacje WWW - laboratorium

Przetwarzanie dokumentów XML i zaawansowane techniki WWW Wykład 09

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Logika prezentacji III

SOAP. Autor: Piotr Sobczak

Bezpieczeństwo frameworków WEBowych Java na przykładzie ataku CSRF

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Programowanie obiektowe

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

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

Wprowadzenie do J2EE. Maciej Zakrzewicz.

Serwery aplikacji. mgr Radosław Matusik. Wydział Matematyki i Informatyki Uniwersytetu Łódzkiego radmat radmat@math.uni.lodz.

Architektury Usług Internetowych. Laboratorium 1 Servlety

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Programowanie obiektowe

Programowanie w Internecie. Java

Podejście obiektowe do budowy systemów rozproszonych

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

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

Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut.

Aplikacje Internetowe, Servlety, JSP i JDBC

TIN Techniki Internetowe Lato 2005

Badania poziomu bezpieczeństwa portalu dostępowego do infrastruktury projektu PL-Grid

Aplikacje RMI

Podstawy JavaScript ćwiczenia

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Współbieżność w środowisku Java

Wstęp Budowa Serwlety JSP Podsumowanie. Tomcat. Kotwasiński. 1 grudnia 2008

Serwery aplikacji. mgr Radosław Matusik. Wydział Matematyki i Informatyki Uniwersytetu Łódzkiego radmat radmat@math.uni.lodz.

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Programowanie obiektowe

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Wywoływanie metod zdalnych

Języki i metody programowania Java INF302W Wykład 3 (część 1)

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Programowanie obiektowe

Podstawy i języki programowania

Metody dostępu do danych

Budowa prostej aplikacji wielowarstwowej. Laboratorium 1 Programowanie komponentowe Zofia Kruczkiewicz

Programowanie Obiektowe Ćwiczenie 4

Języki Programowania II Wykład 3. Java podstawy. Przypomnienie

Java Server Faces - wprowadzenie

Java wybrane technologie

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Złożone komponenty JSF wg

Architektura Model-View-Controller

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

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Złożone komponenty JSF wg

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

Multimedia JAVA. Historia

Enterprise JavaBeans. 1. Architektura EJB: komponenty encyjne, komponenty sesyjne, komponenty sterowane komunikatami. 2. Kontenery EJB JBoss.

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Transkrypt:

Java Enterprise Edition spotkanie nr 3 Serwlety c.d. 1

Wzorzec obserwator ServletRequestAttributeListener void attributeadded(servletrequestattributeevent ev) void attributeremoved(servletrequestattributeevent ev) void attributereplaced(servletrequestattributeevent ev) HttpSessionAttributeListener void attributeadded(httpsessionbindingevent ev) void attributeremoved(httpsessionbindingevent ev) void attributereplaced(httpsessionbindingevent ev) ServletContextAttributeListener void attributeadded(servletcontextattributeevent ev) void attributeremoved(servletcontextattributeevent ev) void attributereplaced(servletcontextattributeevent ev) 2

Listenery c.d. ServletContextListener void contextdestroyed(servletcontextevent ev) void contextinitialized(servletcontextevent ev) public class ContextListenerTest implements ServletContextListener { public void contextinitialized(servletcontextevent ev) { try { Connection c = // tworzymy połączenie z bazą danych ev.getservletcontext().setattribute("con", c); catch (Exception e) { public void contextdestroyed(servletcontextevent ev) { try { Connection c = (Connection) ev.getservletcontext().getattribute("con"); c.close(); catch (Exception e) { 3

Listenery c.d. Analogicznie HttpSessionListener HttpServletRequestListener 4

Wskazywanie Listenerów Bezpośrednio w web-app <listener> <listener-class>wyklad.contextlistenertest</listener-class> </listener> Wszystkie interfejsy można obsługiwać jedną klasą 5

Klastry Zalety Fail-over support Load balancing Aplikacja odpowiednio przygotowana na istnienie kilku egzemplarzy każdego serwletu składowe statyczne składowe egzemplarza różnice lokalnego systemu plików istnienie kilku egzemplarzy ServletContext 6

Co gwarantuje specyfikacja Każda aplikacja ma tylko jeden egzemplarz ServletContext na danej JVM wyjątkowo ServletContext domyślnej aplikacji jest tylko na jednej JVM atrybuty ServletContext ustawiana na jednej JVM są niewidoczne na pozostałych (można się w zamian wspierać bazą danych lub sesją) ServletContextEvent i ServletContextAttributeEvent nie muszą być propagowane na inne JVM parametry ServletContext są dostępne na wszystkich JVM 7

Co gwarantuje specyfikacja c.d. Sesja w każdej chwili jest obsługiwana na tylko jednej JVM (może, ale nie musi migrować, np. ze względu na fail-over support lub load balancing) jeżeli sesja jest migrowana, to atrybuty (implementujące java.io.serializable, kontener może nie przyjmować innych argumentów - IllegalArgumentException) również ale niekoniecznie dochodzi do wywołania ich metod readobject(), writeobject() zdarzenia HttpSessionEvents nie muszą być migrowane na inne JVM o migrowaniu informowane są atrybuty implementujące HttpSessionActivationListener 8

Filtry Co może filtr: na podstawie analizy żądania: kontynuować przetwarzania lub samodzielne wygenerować odpowiedź wstępnie przetworzyć żądanie dodatkowo przetworzyć odpowiedzi przekierować żądania do innego zasobu 9

Pytania Aplikacja używa ServletContextListener do powiadamiania administratora, gdy dochodzi do jej wyłączenia. Czy używanie aplikacji w środowisku rozproszonym będzie miało wpływ na tą funkcjonalność? Nie. Egzemplarz ServletContext będzie utworzony na każdym serwerze i administratorzy zostaną powiadomieni o zniszczeniu każdego z nich. Aplikacja przechowuje listę aktualnie zalogowanych użytkowników w ServletContext i wypisuję ją na żądanie. Jaki wpływ na tą funkcjonalność będzie miało używanie tej aplikacji w środowisku rozproszonym? Żądania będą informowały o użytkownikach zalogowanych tylko na maszynie obsługującej żądanie (podzbiór wszystkich użytkowników). 10

Przykład public class WitajŚwiecieFiltrów implements Filter { private FilterConfig filterconfig; public void init(filterconfig filterconfig) throws ServletException { this.filterconfig = filterconfig; //w aplikacjach webowych parametry w rzeczywistości to //HttpServletRequest i HttpServletResponse public void dofilter(servletrequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletResponse res = (HttpServletResponse) response; res.setcontenttype("text/html;charset=utf8"); PrintWriter pw = res.getwriter(); pw.println("<html>"); pw.println("<head></head>"); pw.println("<body>"); pw.println("<h3>witaj świecie filtrów!</h3>"); pw.println("</body>"); pw.println("</html>"); pw.close(); public void destroy() { 11

Deskryptor <filter> <filter-name>witajswieciefiltrow</filter-name> <filter-class>wyklad.witajświeciefiltrów</filter-class> </filter> mapowanie dla URI <filter-mapping> <filter-name>witajswieciefiltrow</filter-name> <url-pattern>/filtry/*</url-pattern> </filter-mapping> mapowanie dla serwletu <filter-mapping> <filter-name>witajswieciefiltrow</filter-name> <servlet-name>pathservlet</servlet-name> </filter-mapping> od wersji 2.5 można: podać * zamiast nazwy serwletu w jednym elemencie filter-mapping można użyć wiele podelementów servlet-name i url-pattern 12

Kolejność filtrów Kolejność: Najpierw są wszystkie filtry dla URI, potem dla serwletów W ramach każdej grupy kolejność jest zgodna z kolejnością wymienienia w deskryptorze Kolejność filtrowania odpowiedzi jest odwrotna do kolejności filtrowania żądania 13

Niektóre zastosowania uwierzytelnianie sporządzanie logów i audyt kompresja szyfrowanie przekształcenia XSLT przekierowanie żądania do innego zasobu (przy pomocy RequestDispatcher) przygotowywanie zasobów 14

Interfejsy/klasy związane z filtrowaniem javax.sevlet.filter implementuje programista javax.servlet.filterconfig filtry też mają parametry inicjalizacji String getfiltername() String getinitparameter(string) Enumeration getinitparameternames() ServletContext getservletcontext() javax.servlet.filterchain dostarcza kontener void dofilter(servletrequest, ServletResponse) przekazuje sterowanie do następnego filtra lub do zasobu jeżeli ten był ostatni zmianę żądania/odpowiedzi można uzyskać przez opakowanie odpowiadających im obiektów przy pomocy: javax.servlet.servletrequestwrapper javax.servlet.servletresponsewrapper javax.servlet.http.httpservletrequestwrapper javax.servlet.http.httpservletresponsewrapper 15

Przykład import javax.servlet.http.*; public class WrapperIgnorujacyCache extends HttpServletRequestWrapper { public WrapperIngnorujacyCache(HttpServletRequest request) { super(request); @Override public String getheader(string name) { if (name.equals("if-modified-since")) return null; else return super.getheader(name); 16

Przykład c.d. class ByteArrayServletOutputStream extends ServletOutputStream { ByteArrayOutputStream baos; ByteArrayServletOutputStream() { this.baos = new ByteArrayOutputStream(); @Override public void write(int b) throws IOException { baos.write(b); ByteArrayOutputStream tobytearrayoutputstream() { return baos; byte[] tobytearray() { return baos.tobytearray(); 17

Przykład c.d. public class WrapperBuffor extends HttpServletResponseWrapper { public WrapperBuffor(HttpServletResponse response) { super(response); private ByteArrayServletOutputStream basos = new ByteArrayServletOutputStream(); private PrintWriter pw = new PrintWriter(basos.toByteArrayOutputStream()); public PrintWriter getwriter() { return pw; public ServletOutputStream getoutputstream() { return basos; byte[] tobytearray() { return basos.tobytearray(); 18

Przykład c.d. public class TextToHtmlFilter implements Filter { public void dofilter(servletrequest request, ServletResponse response, FilterChain filterchain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; WrapperIgnorujacyCache wic = new WrapperIgnorujacyCache(req); WrapperZBufforem wzb = new WrapperZBufforem(res); filterchain.dofilter(wic, wzb); String prefix = "<html><body background=\"tlo.png\"><pre>"; String suffix = "</pre></body></html>"; StringBuilder sb = new StringBuilder(prefix); String oryginalnydokument = new String(wzb.toByteArray()); sb.append(oryginalnydokument); sb.append(suffix);... res.setcontenttype("text/html;charset=utf8"); res.setcontentlength(sb.length()); PrintWriter pw = res.getwriter(); pw.println(sb.tostring()); 19

Filtry c.d. dla każdego wpisu <filter> będzie jeden egzemplarz filtru na każdej maszynie wirtualnej filtry muszą być przygotowane na współbieżną obsługę wielu żądań domyślnie filtrowanie odbywa się tylko dla zwykłych żądań, ale można zażądać również filtrowania RequestDispatcher.forward(), RequestDispatcher.include() i strony obsługi błędów <filter-mapping> <filter-name>jakiśfiltr</filter-name> <url-pattern>/*</url-pattern> <dispatcher>request</dispatcher> <dispatcher>forward</dispatcher> <dispatcher>include</dispatcher> <dispatcher>error</dispatcher> </filter-mapping> 20

MVC z filtrami zamiast serwletów serlwety są dobre jeżeli decyzja jaki widok wyświetlić jest podejmowana na podstawie reguł biznesowych 1) grupa powiązanych żądań jest przetwarzana przez jeden serwlet 2) serwlet przyjmuje dane i tworzy odpowiednie JavaBeany 3) potem przy pomocy RequestDispatchera przekierowuje żądanie do odpowiedniej strony JSP, np. na podstawie wyniku jakiś obliczeń filtry używamy jak potrzeba dodatkowej konfigurowalności, bo nie trzeba w nich kodować jaki widok następnie wyświetlić i dodawać mechanizmu pozwalającego wybrać (np. jakiegoś dodatkowego parametru żądania) np. JSP generujące XML i HTML 21

Jeszcze trochę o sesji Standardowo numer sesji jest trzymany w cookie POST /servlet/testservlet HTTP/1.1 User-Agent= MOZILLA/1.0 cookie=jsessionid=61c4f23524521390e70993e5120263c6 Content-Type: application/x-www.formurlencoded userid=john ponieważ cookisy można użyć do szpiegowania, niektórzy je wyłączają Do przepisywania URLi służy metoda encodeurl(string), a do użytku z HttpServletResponse.sendRedirect() metoda encoderedirecturl(string) identyfikator jest dodawany po ; zamiast po? (np. /wyklad/testsevlet;jsessioid=5454...) w takiej aplikacji nie można używać zasobów statycznych (np. stron HTML), trzeba je przefiltrować/przepchnąć przez serwlet i przepisywać zawarte w nich adresy 22

Jeszcze trochę o listenerach HttpSessionAttributeListener już omawialiśmy dodawanie, usuwanie i zmienianie atrybutu wskazujemy w deskryptorze (będzie jeden egzemplarz) HttpSessionListener np. można spamiętywać aktywne sesje sessioncreated()/destroyed() sessiondestroyed() woływane po zniszczeniu s. więc nie można w niej grzebać wskazujemy w deskryptorze (będzie jeden egzemplarz) HttpSessionBindingListener implementują obiekty, które chcą wiedzieć kiedy są dodawane (valuebound()) lub usuwane (valueunbound()) z sesji w tych metodach mamy dostęp do sesji, a przez nią do kontekstu nie informujemy o nim w deskryptorze (egzemplarzami są wartości atrybutów) HttpSessionActivationListener używany do informowania atrybutów przy migrowaniu sesji między JVM w klastrze 23

Pytanie W sesji przechowywane jest ID. W chwili usuwania sesji trzeba na jego podstawie wykonać pewne sprzątanie. Jak to zrobi? sessiondestroyed() z HttpSessionListener nie odczyta już ID trzeba zrobić wrapper dla ID, który będzie implementował HttpSessionBindingListener 24

Java Server Pages 25

Składnia dowolny HTML (template) <%@ dyrektywa %> <%! deklaracja %> <% skryptlet %> <%= wyrażenie %> <jsp:nazwaakcji /> <%-- komentarz --%> 26

Przykład <?xml version="1.0" encoding="utf8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="content-type" content="text/html; charset=utf8" /> <title>witaj świecie</title> </head> <body> <%@ page language="java" contenttype="text/html; charset=utf8" pageencoding="utf8" %> <%! int licznik = 0; %> <% licznik++; %> Witaj świecie (liczba wejść <%= licznik %>) <%-- to jest komentarz --%> </body> </html> 27

Fragment wygenerowanego serwletu Opracował public final class WitajSwiecie_jsp extends org.apache.jasper.runtime.httpjspbase implements org.apache.jasper.runtime.jspsourcedependent { int licznik = 0; public void _jspservice(httpservletrequest request, HttpServletResponse response) throws java.io.ioexception, ServletException { PageContext pagecontext = null; HttpSession session = null; ServletContext application = null; ServletConfig config = null; JspWriter out = null; Object page = this;... 28

Fragment wygenerowanego serwletu c.d. Opracował... try { response.setcontenttype("text/html; charset=utf8"); pagecontext = _jspxfactory.getpagecontext(this, request, response, null, true, 8192, true); application = pagecontext.getservletcontext(); config = pagecontext.getservletconfig(); session = pagecontext.getsession(); out = pagecontext.getout();... out.write("<html xmlns=\"http://www.w3.org/1999/xhtml\">\n");... licznik++; out.write("witaj świecie (liczba wejść "); out.print( licznik ); out.write(")\n"); out.write("</body>\n"); out.write("</html>"); catch (Throwable t) {... finally {... 29

Składnia XML <?xml version="1.0" encoding="utf-8"?> <jsp:root xmlns:jsp="http://java.sun.com/jsp/page" version="2.0"> <jsp:directive.page language="java" contenttype="text/html; charset=utf-8" pageencoding="utf-8" /> <jsp:text> <![CDATA[ <?xml version="1.0" encoding="utf-8"?> ]]> </jsp:text> <jsp:text> <![CDATA[ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1- transitional.dtd"> ]]> </jsp:text> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <title>składnia XML</title> </head> <body> <jsp:declaration> String kto="ala"; </jsp:declaration> <jsp:scriptlet> String pozdr="witaj "+kto+"!"; </jsp:scriptlet> <jsp:expression> pozdr </jsp:expression> </body> </html> </jsp:root> 30

Dyrektywy <%@ dyrektywa lista-atrybutów %> możliwe dyrektywy to page, include, taglib lista atrybutów istotna jest wielkość znaków wartości muszą być otoczone parą " lub ' przed i po = nie może być spacji przykłady <%@ page language="java" %> <%@ include file="plik.html" %> <%@ taglib prefix="test" uri="taglib.tld" %> 31

Deklaracje mogą zawierać dowolne Javowe deklaracje włącznie z klasami wewnętrznymi i blokami inicjalizacji statycznej. kilka deklaracji w jednym bloku <%! String[] wykłady = {"Wprowadzenie", "JavaMail", "Serwlety", "Serwlety c.d.", "JSP"; String getwykład(int i) { return wykłady[i-1]; %> deklaracje w oddzielnych blokach <%! String[] wykłady = {"Wprowadzenie", "JavaMail", "Serwlety", "Serwlety c.d.", "JSP"; %> <%! String getwykład(int i) { return wykłady[i-1]; %> 32

Skryptlety zawierają kod umieszczany w metodzie service() silnik JSP sam deklaruje dla nas kilka zmiennych, np. response i out <%! int i = 0; %> <% response.setcontenttype("text/html;charset=utf8"); %> out.println("<html>"); out.println("<head>"); out.println("</head>"); out.println("<body>"); out.println("<h3>liczniknaatrybucie</h3>"); out.println("aktualna wartość: " + i++); out.println("</body>"); out.println("</html>"); 33

Wyrażenia wypisują wartość zmiennej typu podstawowego lub napisu reprezentującego obiekt (nie kończą się średnikiem) <%! int wartośćcałkowita = 7; boolean wartośćlogiczna = true; char getlitera() { return 'A'; //nie może być void Float obiektfloat = new Float(12.6f); String napis = "jakiś napis"; StringBuilder bufor = new StringBuilder("początek"); %> <ul> <li>123=<%= 123 %></li> <li>wartośćcałkowita=<%= wartośćcałkowita %></li> <li>wartośćlogiczna=<%= wartośćlogiczna %></li> <li>true=<%= true %></li> <li>!true=<%=!true %></li> <li>getlitera()=<%= getlitera() %></li> <li>math.random()=<%= Math.random() %></li> <li>obiektfloat=<%= obiektfloat %></li> <li>obiektfloat.floatvalue()=<%= obiektfloat.floatvalue() %></li> <li>obiektfloat.tostring()=<%= obiektfloat.tostring() %></li> <li>napis=<%= napis %></li> <li>bufor=<%= bufor %></li> </ul> 34

Akcje jsp:include i jsp:forward poprzez RequestDispatcher jsp:usebean, jsp:setproperty i jsp:getproperty jsp:plugin definiowane przez użytkownika (custom tags) 35

Komentarze <%-- komentarz JSP --%> <% //komentarz Javy %> <!-- komentarz HTML --> 36

Cykl życia tłumaczenie strony (dla całej translation unit) strona może być składana z kawałków przy pomocy dyrektywy include również walidacja składni kompilacja można wymusić kompilację nie wykonując żądania url?jsp_precompile=true lub url?jsp_precompile samemu nie należy stosować parametrów z przedrostkiem jsp załadowanie klasy 37

Cykl życia c.d. utworzenie egzemplarza serwlet implementuje javax.servlet.jsp.httpjsppage wywołanie jspinit() można zadeklarować przy pomocy deklaracji <%! %> wywołanie _jspservice() wywołanie jspdestroy() można zadeklarować przy pomocy deklaracji <%! %> 38

Dyrektywa page import rozdzielona przecinkiem lista klas i pakietów, które chcemy zaimportować zawsze są importowane javax.servlet.*, javax.sevlet.jsp.*, javax.servlet.http.* przykład <%@ page import="java.util.*, java.io.*" %> session true lub false w zależności od tego czy strona bierze udział w sesji czy nie (decyduje o dostępności session) errorpage względny adres URL, która ma być użyty do obsługi błędów powstałych na tej stronie razem z iserrorpage pozwala wielokrotnie zastosować ten sam kod obsługi błędów dobrą praktyką jest używać tego atrybutu we wszystkich stronach iserrorpage true lub false w zależności od tego czy dana strona może być użyta jako strona obsługi błędów (zmienna exception) 39

Przykład Wyjatek.jsp <%@ page errorpage="obslugawyjatku.jsp" %> <% if (true) throw new Exception("nasz komunikat"); %> ObslugaWyjatku.jsp <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <title>obsługa wyjątku</title> </head> <body> <%-- jeżeli chcemy używać zmiennej exception --%> <%@ page iserrorpage="true" %> <h1>złapano: <%= exception.getmessage() %></h1> <%-- ta strona mogła by być statyczna --%> </body> </html> 40

Dyrektywa page c.d. language jedyna możliwa wartość to java (można nie podawać) extends wskazuje klasę, którą będzie rozszerzał serwlet domyślna klasa zależy od implementacji i zazwyczaj się jej nie zmienia buffer wielkość bufora przechowującego wyjście specyfikacja wymusza przynajmniej 8kb autoflush jak true dane z bufora są wysyłane do klienta w momencie przepełnienia, jak false zgłaszany jest wyjątek info wartość zwracana przez getservletinfo() contenttype domyślnie text/html;iso-8859-1 pageencoding domyślnie ISO-8859-1 41

Niuanse kolejność deklaracji <body> <%= powitanie %> <%! String powitanie = "Witaj świecie"; %> </body> kolejność skryptletów <body> <% String x = a+b; %> <%-- b jest niezdefiniowane--%> <%! String a = "a"; %> <% String b = "b"; %> </body> inicjalizacja zmiennych <%! int i; %> Atrybut i posiada wartość <%= i %> <br/> <% int j; %> <%-- zmienne w javie nie mają wartości domyślnych --%> Zmienna j posiada wartość <%= j %> oczywiście atrybuty zachowują wartość między wywołaniami 42

Instrukcje Javy <% %> if (true) out.println("<code>true</code>"); else out.println("<code>false</code>"); <%-- zazwyczaj nawiasy klamrowe są potrzebne --%> <% if (true) { %> <code>true</code> <% else { %> <code>false</code> <% %> 43

Atrybuty wyliczane w chwili wywołania <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <title>akcje</title> </head> <body> <jsp:include page="naglowek.html" /> <h3>treść</h3> <p>to jest treść</p> <% String adresstopki="stopka.html"; %> <jsp:include page="<%= adresstopki %>" /> </body> </html> 44