Java Server Pages [email protected] http://www.cs.kuleuven.be/~joost/DN/ Motivatie • Maken van View! • Dynamische pagina! • HTML! • (Beetje) code! • Gebruiksvriendelijk formaat Servlet rver Pages technologie wel statische als dynamische componenten an Jakbaar atuurn van -tags). Unified expression language JavaServer Pages Standard Tag Library JavaServer Pages Java Servlet JavaServer Faces Levenscyclus Bij eerste request voor blad.jsp: Via XML ontwerper ontwerp <% %> blad.jsp vertaling laden en compilatie initialiseren blad jsp.java blad jsp.class servlet blad jsp servlet Wanneer een request gekoppeld wordt aan een JSP-pagina, controleert de web container eerst of de bijhorende servlet ouder is dan de JSP-pagina. Servlet Indien de servlet ouder is, vertaalt de web container de JSP-pagina naar een servlet klasse en compileert deze klasse. Netbeans: right-click + view servlet Dus, één van de voordelen van JSP op servlets is dat het build proces automatisch JSP syntax import ...; ! public class index_jsp extends ... { ... public void _jspService(...) { ... out.print(...); Directieven <%@ ... %> ... Scriptlets <% ... %> } Expressies <%= ... %> ! Declaraties <%! ... %> } Directieven <%@page import=”model.∗” %> <%@page contentType=”text/html”%> <%@page pageEncoding=”UTF−8”%> Expressies <p> Dit is het! <%= Teller.getTeller() %>e bezoek. ! </p> = <p> Dit is het! <% out.print(Teller.getTeller()); %>e bezoek.! </p> Voorbeeldje teller1.jsp Gedeelde geheugen setAttribute(“naam”, object) & getAttribute(“naam”) Servlet JSP App getServletContext() application Sessie getSession() session Req request request Pagina lokale variabele pageContext Voorbeeld BierExpertWeb Java Beans en EL Java Bean • Java klasse volgens bepaalde conventies! • Constructor zonder argumenten! • Voor eigenschap Klasse att naar keuze:! • Getter: public Klasse getAtt() { ... }! • Setter: public void setAtt(Klasse a) { ... } Bijvoorbeeld package!boeken; ! public class Boek {! ! private String titel; ! private String auteur ;! ! public Boek() { } ! ! public String getTitel () { return titel ; }! public void setTitel(String titel) { this.titel = titel; }! ! public String getAuteur ()! {return auteur; } ! public void setAuteur(String auteur) { this.auteur = auteur; }! } Gebruik in JSP <jsp:useBean ! id=”eenBoek” ! class=”boeken.Boek” ! scope=”session” /> boeken.Boek eenBoek = getSession().getAttribute(“eenBoek”);! if (eenBoek == null) {! eenBoek = new boeken.Boek();! getSession().setAttribute(“eenBoek”, eenBoek);! } Gebruik in JSP <jsp:setProperty ! name=”eenBoek” ! property=”titel” ! value=”De Avonden” /> eenBoek.setTitel(“De Avonden”); <jsp:getProperty ! name=”eenBoek” ! property=”titel” />! eenBoek.getTitel(); Initializatie van bean <jsp:useBean id=”eenBoek” class=”boeken.Boek”! scope=”session”> ! <jsp:setProperty id=”eenBoek” property=”titel” ! value=”De Avonden” />! </jsp:useBean> boeken.Boek eenBoek = getSession().getAttribute(“eenBoek”);! if (eenBoek == null) {! eenBoek = new boeken.Boek();! eenBoek.setTitel(“De Avonden”);! getSession().setAttribute(“eenBoek”, eenBoek);! teller2.java } Alternatief • Unified expression language! • ${...} (JSP)! • #{...} (JSF)! • Toegang tot gegevens in Java Beans! • Oproepen van methodes! • Uitvoeren van bewerkingen Verwijzen naar objecten ${boon} • Proberen getAttribute(“boon”) in! • Page scope! • Request scope! • Session scope! • Application scope Impliciete objecten • param! Map • paramValues! • header! • headerValues! • cookie! param.naam param[“naam”] paramValues[“naam”][0] • initParam! • pageContext request.getParameter(“naam”); . en [] • Met foo.bar! • Java Bean property! • Waarde voor een sleutel in Map! • Hetzelfde als foo[“bar”]! • Met foo[int] ook Array! • Naar wens nesten Let op! • Impliciete objecten van JSP <> impliciete objecten van EL! • JSP: request, response, session, application, pageContext! • EL: param, paramValues, header, headerValues, cookie, initParam, pageContext! • Toegang tot JSP impliciete objecten via pageContext Let op! • ${pageContext.request}! • ${pageContext.response}! • ${pageContext.session}! • ${pageContext.servletContext} = application Gedeelde geheugen • pageScope! • requestScope! Map • sessionScope! • applicationScope • Oplossen van name clashes! • requestScope[“iets.persoon”].naam ipv iets.persoon.naam ${iets} Operatoren Operatoren in EL Alhoewel JSP pagina’s als view in een MVC architectuur gebruikt worden en dus geen business logic mogen bevatten, zijn in EL toch enkele operatoren (naast . en []) voorzien: • rekenkundig: +, -, *, / en div, % en mod, en de unaire -; • logisch: and, &&, or, ||, not, !; • relationeel: eq, ==, ne, !=, lt, <, gt, >, le, <=, ge, >=; • conditioneel: A ? B : C , hierbij wordt B of C geevalueerd afhankelijk van h resultaat van de evaluatie van A; • de empty prefix-operator bepaalt of een waarde null of leeg is. In de expressies die met deze operatoren kunnen gebouwd worden zijn ook constanten toegelaten. Naast integer en floating point getallen (zoals in Java) en strings (tussen enkel of dubbel quotes) zijn ook de literals true, false en null voorzien. eelden: Voorbeelden EL expr res ${1 > (4/2)} false ${4.0 >= 3} true ${100.0 == 100} true ${’a’ < ’b’} true ${’hip’ gt ’ hit ’} false ${(10∗10) ne 100} false ${3 div 4} 0.75 ${10 mod 4} ${1.2E4 + 1.4} 2 12001.4 Functies oproepen webpaginauit waarjava virtueel met een dobbelsteen geworpen wordt en het •Voorbeeld Static: een functies klasse resultaat getoond wordt. package model ; public c l a s s D o b b e l s t e n e r { public s t a t i c int werpSteen ( ) { return ( int ) ( ( 6 ∗ Math . random ( ) ) + 1 ) ; } } JSP: oproep van een EL functie: <%@ t a g l i b p r e f i x=”dob” u r i=” D o b b e l s t e e n F u n c t i e s ” %> return ( int ) ( ( 6 ∗ Math . random ( ) ) + 1 ) ; } } Functies oproepen JSP: oproep van een EL functie: <%@ t a g l i b p r e f i x=”dob” u r i=” D o b b e l s t e e n F u n c t i e s ” %> <html> <body> <p> Tag Library Descriptor Aantal ogen : ${dob : werpen ( ) } </p> Mapping tussen de namen in JSP om de functie oproep te doen en de namen in</html> Java </body> (TLD bestand in de WEB-INF directory) klasse om de functie te definiëren. <t a g l i b ... > <u r i >D o b b e l s t e e n F u n c t i e s </u r i > <f u n c t i o n > <name> werpen <f u n c t i o n −class > model . DobbelStener </f u n c t i o n −class > <f u n c t i o n −s i g n a t u r e > int werpSteen ( ) </name> </f u n c t i o n −s i g n a t u r e > </f u n c t i o n > </ t a g l i b > taglib directief: verwijzing in JSP naar deze informatie in het TLD bestand. Voorbeeld index.jsp Code herbruik fragment • <jsp:include page=”ander.jspf” />! • <jsp:include page=”ander.jspf”> <jsp:param name=”extra” value=”nog” /> </jsp:include>! • <jsp:forward page=”ander.jsp” /> <html><body> <p> Er i s een f o u t o p g e t r e d e n . Fouten C o n t r o l e e r uw i n v o e r p a r a m e t e r s . </p> </body> </html> Het page directief om de fout-pagina te configureren: <%@ page e r r o r P a g e=” e r r o r P a g e . j s p ” %> <html><body> <p> Het v o l g e n d e g a a t v e r k e e r d a f l o p e n : <% int x = 1 0 / 0 ; %> </body></html> Als code exception gooit, wordt er naar errorPage.jsp gegaan </p> Langs de clientkant: geen impact op wat gebruiker doorgeeft Fouten In plaats van cryptische foutboodschappen die automatisch door het systeem ∗ foutpagina worden, gedeclareerd een specifieke gegenereerd eenvoor vriendelijker enfout attractievere fout-antwoord-pagina d ∗ algemene foutpagina voor andere gevallen geven aan de gebruiker: ∗ fout getypeerd op basis van een exception die tijdens het uitvoeren van de Java code <%@ i s Eworden. r r o r P a g e=” t r u e ” %> kanpage geworpen ∗ fout typeren op basis van Er de HTTP statuscode <html><body> <p> i s een fout opgetreden . Het <location> element geeft C de o nfoutpagina t r o l e e r aan: uw dit i n moet v o e rsteeds p a r arelatief m e t e rten s . opzichte </p> van de webapplicatie rootcontext zijn (en moet dus steeds met een slash beginnen). </body> </html> De container zal aan een JSP-pagina die expliciet gedeclareerd is als foutenpagina ook exception afleveren. Hiermee dan een meer specifieke pageimpliciet directiefobject om de fout-pagina tekan configureren: Het Toegang “exception” object: foutboodschaptot getoond worden. <%@ page e r r o r P a g e=” e r r o r P a g e . j s p ” %> <%@ page i s E r r o r P a g e=” t r u e ” %> <html><body> <p> Het v o l g e n d e g a a t v e r k e e r d a f l o p e n : <html> <body> <% int <p> Fout ${ pageContext . e x cx e p= t i o n1 }0 /i0s ; o p% g> e t r e d e n op de s e r v e</p> r. </body></html> C o n t r o l e e r uw i n v o e r p a r a m e t e r s . </p> </body> </html> In elke JSP een page directief met verwijzing naar foutpagina. Alternatief Globale foutpagina voor de volledige webtoepassing: ∗ declareren in de deployment descriptor ∗ eventueel overschrijven in een JSP door een page directief op te nemen met een verwijzing naar een specifieke foutpagina. <e r r o r −page> <e x c e p t i o n −type>j a v a . l a n g . A r i t h m e t i c E x c e p t i o n </e x c e p t i o n −type> <l o c a t i o n >/rekenFout . j s p </ l o c a t i o n > </ e r r o r −page> <e r r o r −page> <e x c e p t i o n −type>j a v a . l a n g . Throwable </e x c e p t i o n −type> <l o c a t i o n >/e r r o r P a g e . j s p </ l o c a t i o n > </ e r r o r −page> <e r r o r −page> <e r r o r −code >404</ e r r o r −code> <l o c a t i o n >/nietGevonden . j s p </ l o c a t i o n > </ e r r o r −page> JSTL Motivatie • JSP: hutsepotje van HTML en Java! • Beter <jsp:getProperty name=”eenBoek” property=”titel” /> dan <%= eenBoek.getTitel() %>! • Meer mogelijk maken zonder Java code Taglib • Verzameling tags! • Die bepaalde functionaliteit aanbieden! • Beschikbaar via taglib declaratie <%@ taglib uri=”http://java.sun.com/jsp/jstl/core” prefix=”c” %> Overzicht area subfunctie core variabele prefix uri c http://java.sun.com/jsp/jstl/core x http://java.sun.com/jsp/jstl/xml fmt http://java.sun.com/jsp/jstl/fmt SQL sql http://java.sun.com/jsp/jstl/sql collectie lengte fn http://java.sun.com/jsp/jstl/functions flow control URL beheer xml basis flow control transformatie I18N locale formattering databank functie string bewerking core library • Variabelen manipuleren! • Controlflow! • URL management! • Varia Variabelen Default: page • <c:set var=”boeknr” scope=”session” value=”${param.nummer}” />! • <c:remove var=”boeknr” scope=”session” />! • <c:set!target=”${persoon}” property=”naam”> ${iets .naam} </c : set> Control flow • <c:if test=”${!empty param.nummer}”> <c:set var=”boeknr” scope=”session” value=”$param.nummer” /> <p>Boek met nummer ${boeknr} is toegevoegd. </p> </c:if>! • Maar geen “else” Control flow • <c:choose> <c:when test=”${param.cat == ’trial’}”> <h2>Proberen </h2></c:when> <c:when test=”${param.cat == ’lid’}”> <h2>Leden </h2>!</c:when> <c:otherwise> <h2>Gasten</h2></c:otherwise> </c:choose> Control flow Map, Collection, array,... • <c:forEach var=”movie” items=”${filmLijst}”> <tr> <td> ${movie} </td> </tr> </c:forEach> URL management Doet zonodig herschrijving • <c:url var=”flip” value=”/verwerk.do” > <c:param name=”voorNaam” value=”${voor}” /> <c:param name=”naNaam” value=”${na}”!/> </c:url>! • <a href=”${flip}” Klik hier </a> Varia • <c:catch>! • <c:out value=”${naam}” default=”niemand” espaceXML=”true” /> VB: viewtags.jsp SQL • Normaal: EJBs! • Voor rapid prototyping: sql tags! • <sql:query var=”boeken”> select ∗ from PUBLIC.boeken where id = ? <sql :param value=”${bid}” /> </sql : query> Resultaat • public interface Result { public String [] getColumnNames(); public int!getRowCount(); public Map[] getRows(); public Object[][] getRowsByIndex() ; public boolean!isLimitedByMaxRows () ; } Bijvoorbeeld • <sql:query var=”boeken”> select ∗ from PUBLIC.boeken where id = ? <sql:param value=”${bid}” /> </sql:query>! • <ul> <c:forEach var=”bk” items=”${boeken.rows}” > <li> ${bk.titel} </li> </c:forEach>! </ul> Netbeans • Services -> Databases! • New -> Glassfish -> JDBC resource! • Resultaat in glassfish-resources.xml en (na restart) in Services! • Toevoegen aan web.xml (tab resources) VB: viewtagssql.jsp SQL - andere • <sql:update var=”boeken” sql=”update PUBLIC.boeken set inv = inv − ? where id = ?”> <sql :param value=”${hoeveelheid}” /> <sql :param value=”${bid}” /> </sql : update>! • <transaction> voor transacties Lokalizering • <jsp:useBean id=”nu” class=”java.util.Date” />! • <p>Standaard : <fmt:formatDate value=”${nu}” type=”date” dateStyle=”full” /> ! • <p>Spaans : <fmt:setLocale value=”es” /> <fmt:formatDate value=”${nu}” type=”date” dateStyle=”full” /> Function Tag Library Function Om de lengte van een collectie of van een String te berekenen, ka gebruikt worden: <c : i f t e s t=”${ f n : l e n g t h ( param . g e b r u i k e r ) > <%@ i n c l u d e f i l e =” antwoord . j s p ” </c : i f > • <c:if test=”${fn:length(param.gebruiker) > 0}” > Functies om bewerkingen met strings te doen: • toUpperCase, toLowerCase • substring, substringAfter, substringBefore • trim, resplace • indexOf, startsWith, endsWith • contains, containsIgnoreCase • split , join %>