Document 1018806

advertisement
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
%>
Download