Java Server Pages - JSP
Introduzione
È la tecnologia Java per lo sviluppo di applicazioni
Web mediante l’utilizzo di “pagine dinamiche”
Sono pagine Web (HTML o XHTML) che risiedono
sul server Web
possono contenere codice Java attraverso l’utilizzo di opportuni
tags, e componenti JavaBean
Il codice Java viene compilato al momento della
prima invocazione della pagina JSP e genera una
servlet
Java Servlet è la tecnologia sottostante ma JSP facilita la
creazione di interfacce umane
Il codice della Servlet è nel documento HTML
Servlet vs JSP
Servlet: richiede una dettagliata conoscenza della
programmazione Java per lo sviluppo ed il mantenimento di
tutti gli aspetti dell’applicazione Web, dato che il codice di
esecuzione della richiesta ed il codice HTML risiedono nello
stesso punto
Servlet: cambiare il comportamento dell’applicazione o
aggiungere supporto a nuovi tipi di client richiede una
modifica del codice della servlet ed una sua ri-compilazione
Servlet: è difficile trovare vantaggio dai tool per lo sviluppo
di pagine Web quando si progetta l’interaccia
dell’applicazione. ll codice HTML associato alla servlet deve
essere inserito manualmente nel codice delle Servlet:
Time-consuming
Error-prone
Boring
Servlet vs JSP (2)
Servlet: si prestano meglio alla realizzazione di
applicazioni service-oriented (Web service endpoints
sono implementati come servlet)
JSP: separa il processamento delle richieste (codice di
business logic) dalla presentazione dell’informazione
JSP: separando la request processing e la business
logic dalla presentazione è possibile dividere lo
sviluppo di tasks tra le persone aventi differenti skills
Web designer per l'interfaccia (presentazione)
Programmatori per la logica dell'applicazione
Esempio JSP
<!DOCTYPE ...>
<HMTL>
<HEAD>
<TITLE>Data e ora</TITLE>
</HEAD>
<BODY>
<p>
Data e ora corrente:<br>
<b><%= new java.util.Date() %></b>
</p>
</BODY>
</HMTL>
Espressione JSP in linguaggio
Java che verrà interpretata
dal JSP container e sostituita
alla data e ora correnti.
Esempio JSP(2)
Traduzione della JSP in Servlet:
class JSPDate extends HttpJSPServlet {
public void _jspService (HttpServletRequest req,
HttpServletResponse res) {
PrintWriter out = res.getWriter() ;
out.println(“<html>”) ;
out.println() ;
out.println(“<head>”) ;
out.println(“<title>Data e Ora</title>”) ;
out.println(“</head>”) ;
out.println(“<body>”) ;
out.println(“<p>”) ;
out.println(“Data e ora corrente :<br>”) ;
Esempio JSP(3)
out.print(“<b>”) ;
out.print(new java.util.Date()) ;
out.println(“</b>”) ;
out.println(“</p>”) ;
out.println(“</body>”) ;
out.println() ;
out.println(“</html>”) ;
Commenti:
Classe derivata da un ipotetica classe HTTPJspServlet che sarà una
sottoclasse di HttpServlet e implementa l’interfaccia HttpJspPage che
contiene il metodo _jsp Service che è l’equivalente del metodo
service() delle normali servlet
●
Funzionamento di una JSP
prova.jsp
Read
Get prova.jsp
provaServlet.java
Generate
Compile
<html>prova</html>
Execute
provaServlet.class
1. il client richiede la pagina “prova”
2. Il server legge la pagina prova.jsp
3. Il server genera la servlet provaServlet.java
4. Il server compila la servlet.java ottenendo una classe eseguibile
5. Il server esegue la servlet
6. La risposta viene inviata la client
8
Ciclo di vita di una JSP
Init()
Esecuzione
(doGet o
altro)
Si
No
Si
No
Si
No
Si
No
Si
Si
Req#3
Req#4
No
No
No
No
Si
No
Si
No
Si
Si
Req#5
Pagina modificata
Servlet
instanziata
Req#2
Server restarted
Servlet
compilata
Prima scrittura della pagina
Pagina JSP
tradotta in
servlet
Req#1
Req#6
Si
No
Si
No
Si
No
Si
No
Si
si
Elementi di una JSP
Template text
Commenti JSP
Elementi di scripting
Codice java da inserire nella servlet risultante
Direttive JSP
Controllano la struttura della servlet risultante
JSP actions
Controllano il comportamento del JSP engine
Elementi sintattici
Template text: tutte le parti di testo che non sono
definite come elementi JSP sono copiate nella
pagina di risposta (i commenti HTML sono
considerati come normale elemento di testo)
Commenti JSP:
Sitassi: <%-- commento --%>
Vengono eliminati dal container in fase di
compilazione/traduzione della pagina
Elementi di Scripting
Porzioni di codice in uno scripting language
specificato nelle direttive (di default Java)
Scriptlet con sintassi <% code %>; possono contenere variabili locali valide
solo per una singola esecuzione della Servlet (prodotta in seguito alla
compilazione della JSP)
Declaration con sintassi <%! declaration [declaration] ...%>;
sono metodi o variabili la cui durata è quella della Servlet (conservano il loro
valore per tutte le esecuzioni della servlet)
Expression: con sintassi <%=expression %>; l’espressione viene valutata
e scritta nella pagina di risposta della JSP
Esempio
Direttiva page:
specifica di importare
<head>
package Java
JSP declaration:
<title>Data e ora</title>
genera due oggetti
</head>
di tipo DateFormat
<html>
<%@ page import = "java.util.*, java.text.*" %>
<%!
String DateFormat = "EEEE d MMMM yyyy";
DateFormat dateFormat = new SimpleDateFormat(DateFormat);
DateFormat timeFormat = new SimpleDateFormat("H:mm"); Scriptlet: crea un
oggetto di tipo Date
%>
il cui valore cambia
ad ogni esecuzione
<% Date dateTime = new Date(); %>
<body> < style = "font-size: 16pt;">
Oggi ` <%= dateFormat.format(dateTime) %><br>
e sono le ore <%= timeFormat.format(dateTime) %>
</body>
</html>
expresion
Direttive JSP: page
page: Definisce attributi e parametri dipendenti dalla pagina, come ad
esempio il linguaggio di scripting usato, la pagine di errore, requisiti di
buffering. Eseguita nella fase di traduzione della pagina JSP.
Attributi:
language: indica il linguaggio di script usato negli script
elements. Default value Java, altri linguaggi supportati dipendono
dal container
import: serve ad importare package all’interno della JSP,
equivalente alla import declaration del linguaggio Java (ma si
possono specificare più package contemporaneamente)
buffer: indica se l’output stream deve essere bufferizzato e la
dimensione minima del buffer (8KB di default). Utile nel caso di
ridirezione richiesta a runtime quando dei dati sono stati già inviati
in output (come nel caso di error pages)
errorpage: Indica la pagina a cui si viene reindirizzati in caso di
eccezioni. Ha un valore espresso da un URL.
Direttive JSP
include: serve ad inserire il contenuto di un file
all’interno di una pagina JSP. Eseguita a translation time ed
il contenuto inserito è statico (anche se può contenere
elementi dinamici)
Attributi:
file: contiene l’URL del file che deve essere inserito all’interno della JSP
taglib: permette di utilizzare degli action element non
standard inclusi in tag library
Attributi:
uri: è l’URI che identifica la tag library
Direttive JSP (3)
Elemento
Descrizione
Definisce attributi dipendenti dalla
pagina, come ad esempio il
linguaggio di scripting usato, la
<%@ page
pagine di errore, requisiti di
import="java.util.*,
com.foo.*" buffer="16k" %> buffering
<%@ page … %>
<%@ include … %>
Include un file durante la fase di
traduzione
<%@ include
file="copyright.html" %>
<%@ taglib … %>
Dichiara una libreria di tag,
contenente azioni custom diverse
da quelle definite dagli action
element standard ed usate nella
pagina
16
Action Element
Sono istruzioni che vengono eseguite in fase di
processing (i.e. al momento dell’elaborazione della
risposta) e si traducono in istruzioni Java nel metodo
service() della Servlet corrispondente
Sono tag XML dunque indipendenti dal linguaggio
Si possono dividere in due categorie:
Action per l’uso di componenti JavaBeans
Action per compiere operazioni su pagine JSP in fase di
processing
JSP e JavaBeans
I componenti JavaBeans sono il mezzo migliore per inserire
contenuti dinamici in una pagina JSP.
Gli script “sporcano” la pagina JSP (utilizzo di simboli
speciali non usati in HTML o XML)
e.g. <%@ page import = "java.util.*, java.text.*" %>
Sono interfacciati nella JSP per mezzo delle action all’interno di
tag specifici in una sintassi “designer-friendly”
e.g. <jsp:usebean id = “dateTime” class =
dates.DateTime” / >
JSP e JavaBeans - esempio
<html>
<head>
<title>Data e ora</title>
</head>
<%@ page import = "java.util.*, java.text.*" %>
<%!
String DateFormat = "EEEE d MMMM yyyy";
DateFormat dateFormat = new SimpleDateFormat(DateFormat);
DateFormat timeFormat = new SimpleDateFormat("H:mm");
%>
<% Date dateTime = new Date(); %>
< body style = "font-size: 16pt;">
Oggi e’: <%= dateFormat.format(dateTime) %><br>
e sono le ore <%= timeFormat.format(dateTime) %>
</body>
</html>
RUGGERO RUSSO
19
JSP e JavaBeans - esempio
<html>
<head>
<title>Data e ora</title>
</head>
<jsp:usebean id= “dateTime” class = “date.DateTime” />
<body style = “font-size: 16pt;”>
Oggi è <jsp:getProperty name = “dateTime” property
= “date”/ > <br>
e sono le ore < jsp:getProperty name = “dateTime” property
= “time”/>
</body>
</html>
RUGGERO RUSSO
20
JSP e JavaBeans - esempio
Tutto il codice che prima era sparso
per la pagina JSP ora è incapsulato
nella classe Java che esegue le
specifiche dei JavaBeans
Import java.util.*;
Import java.text.*;
Public class DateTime {
DateFormat dateFormat = new SimpleDateFormat (“EEEE d
MMMM yyyy”);
DateFormat timeFormat = new SimpleDateFormat (“H:mm”);
public String getDate () {
Date date = new Date();
return dateFormat.format (date);
}
public String getTime() {
Date date =new Date()
return timeFormat.format(date);
}
}
RUGGERO RUSSO
21
Gestione degli Errori
Errori in fase di traduzione-compilazione.
Si traducono con l’invio di un Server error (errore 500)da
parte del server HTTP
Viene generata una pagina in cui sono indicati gli errori di
sinatssi JSP e/o di compilazione Java per errori negli script
element
Errori in fase di processing (runtime errors).
Si risolvono nella generazione di eccezioni java
Possono essere gestiti dal programmatore
direttamente nella pagina
Utilizzando bean inseriti nella pagina
Possono essere lasciati alla gestione di default del JSP
container
Possono essere gestiti tramite una error page
RUGGERO RUSSO
24