Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per...

66
Laboratorio di Servizi We b - JSP - Ardissono 1 Servlet e Java Server Pages • Servlet sono ottime per programmare applicazioni Server side complesse, ma poco adatte a generazione di interfaccia utente • JSP introdotte per facilitare stesura di interfaccia utente – permettono scrittura diretta di codice HTML, anzichè richiedere inserimento di codice in PrintWriter, riga per riga – permettono di inserire codice java (scriptlets) per implementare semplici operazioni

Transcript of Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per...

Page 1: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

1

Servlet e Java Server Pages

• Servlet sono ottime per programmare applicazioni Server side complesse, ma poco adatte a generazione di interfaccia utente

• JSP introdotte per facilitare stesura di interfaccia utente– permettono scrittura diretta di codice HTML,

anzichè richiedere inserimento di codice in PrintWriter, riga per riga

– permettono di inserire codice java (scriptlets) per implementare semplici operazioni

Page 2: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

2

Java Server Pages - I

• Volte a semplificare creazione e gestione di pagine dinamiche (sintatticamente simili a PHP e ASP)

• Combinano markup statico (HTML) con tag di scripting

<%@page import="java.util.Date"%><html> <body> The current time is <%= (new Date()).toString() %> </body></html>

data.jsp

Salvare temporaneamente data.jsp a root di contesto (swebi)

http:130.192.241.1:10000/swebi/data.jsp

Page 3: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

3

Java Server Pages - II

• Basate su tecnologia Servlet • Da JSP Web Container genera Servlet S equivalente

– S contiene package e imports necessari

– S implementa metodo doGet/doPost che crea pagina di output di JSP (usa PrintWriter, definisce formato di output, scrive su PrintWriter per generare codice HTML statico, permette invocazione di metodi java)

• Generazione e compilazione avvengono a primo richiamo di JSP da parte di client (translation time)

• Poi ogni richiamo di JSP causa esecuzione di S (run time)

Page 4: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

4

Translation time e run time

JSP<JSP tags><java code>Web

browser

JSP<JSP tags><java code>

Prima richiesta

Risposta generata

Servlet

Traduzione

JSP<JSP tags><java code>

usa

usa

Richieste successive

Page 5: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

5

Espansione di JSP • Web Container implementa interfaccia

javax.servlet.jsp.HttpJspPage• Da pagina JSP Web Container genera Servlet che

estende implementazione di HttpJspPage• javax.servlet.jsp.HttpJspPage

– public void jspInit(): metodo invocato da Web Container a tempo di inizializzazione di servlet generata

– public void jspDestroy(): invocato a tempo di distruzione di servlet

– public void _jspService(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException: ad ogni HTTP request

Page 6: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

6

Struttura di una JSP

• A metà tra pagina statica e Servlet. Contiene– codice java racchiuso tra <% e %>

– tag HTML e XML-like

– testo, ...

• Categorie di JSP tag– JSP Directives

– Scripting elements

– Actions <%@page import="java.util.Date"%><html> <body> The current time is <%= (new Date()).toString() %> </body></html> data.jsp

Page 7: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

7

JSP directives

• <%@ directiveName attribute=“value” attribute=“value” ... %>– Es: <%@page import="java.util.Date"%>

• istruzioni che danno specifiche per generazione di codice effettuata da Web Container quando crea Servlet

• non producono output per generazione di risposta a invocazione di JSP

• influenzano intera pagina JSP (non altre pagine di applicazione)

• Directives: page, include, taglib

Page 8: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

8

JSP directives - page • <%@ page attribute=“val” attribute=“val” ... %>

– Es: <%@page import="java.util.Date,java.rmi.*” session=“true” isThreadSafe=“true” %>

• JSP può contenere + page directives ma ciascun attributo (eccetto import) può comparire al più una volta

• Alcuni attributi (vd libro per gli altri)

– import: specifica classi da importare per esecuzine di JSP– session: specifica se pagina partecipa ad HttpSession

• Se session=“true” pagina può usare oggetto implicito session per accedere a dati di sessione utente

• se session=“false” non si gestisce sessione utente

• default: session=“true”

– errorPage: specifica URL di pagina JSP di applicazione invocata in caso di eccezioni

Page 9: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

9

JSP directives - include - I

• <%@ include file=“fileName” %>• specifica che durante generazione di Servlet il

Web Container deve includere risorsa specificata• fileName: path relativo a contesto di applicazione

<%@page import="java.util.Date"%><html> <body> The current time is <%= (new Date()).toString() %> <%@ include file=”JSP-EX/prova.html" %> </body></html> swebi

JSP-EXsrc WEB-INF

Page 10: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

10

prova.html

Page 11: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

11

JSP directives - include - II

• Contenuto di file incluso è analizzato sintatticamente a translation time

• si possono includere vari tipi di file: html, jsp, …– Es: esempio.jsp contiene il seguente directive:

<@% include file=“JSP-EX/inclusa.jsp” %>

– inclusa.jsp contiene codice<%@page import="java.util.Date"%>

<%= “data odierna: “ + new Date() %>

• se file modificato, non è garantito che Web Container ricompili automaticamente JSP

Page 12: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

12

JSP directives - include - III

Servlet generata a partire da JSP (circa…)

public class esempio extends javax.servlet.jsp.HttpJspPage ... {public void _jspService(HttpServletRequest request,

HttpServletResponse response) throws … {...out.write(“<html>\r\n >head>\r\n …..out.print(“data odierna: “ + new Date());…out.close(); }

...}

Page 13: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

13

NB: packaging di JSP

• Potete organizzare le JSP in directory sotto vostro contesto di applicazione ma– directory deve essere leggibile e attraversabile

da tutti– la prima JSP invocata per accedere ad

applicazione deve stare sotto swebi (se no web container inserisce JSP-EX in path relativi)

swebi

JSP-EXsrc WEB-INF

Page 14: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

14

JSP directives - taglib (cenni)

• <%@ taglib uri=“tagLibraryURI” prefix=“tagPrefix” %>

• • Directive taglib permette che pagina JSP utilizzi

tag extensions (custom tags)• tag extensions: si definiscono tag associati a

codice java• directive taglib specifica tag library contenente

codice java compilato che definisce tag da usare

URI di descrittoredi libreria di tagPrefisso da usare per

identificare tag library<myTag:tagname … />

Page 15: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

15

Scripting elements• Permettono di inserire codice java in pagina JSP

– dichiarazioni di variabili– dichiarazioni di metodi– scriptlets: blocchi di codice eseguiti quando client

richiede pagina JSP– espressioni

<%! int anno = 2003; public String saluta(String name) { return “Ciao, “ + name + “!!”; }%><html><head>…</head><body> <p> Ciao <%= saluta(“carissimo”)%>, siamo nel <%= anno %></body></html>

Dichiarazioni divariabili e metodi

EspressioneEspressione

Page 16: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

16

Scripting elements: dichiarazioni di variabili e metodi

• <% dichiarazioni di variabili e metodi java %>• inserite come elementi globali in Servlet generata• variabili inizializzate quando Servlet inizializzata• non producono output

<%! int anno = 2003; public String saluta(String name) { return “Ciao, “ + name + “!!”; }%><html><head>…</head><body> <p> Ciao <%= saluta(“carissimo”)%>, siamo nel <%= anno %></body></html>

Dichiarazioni divariabili e metodi

Page 17: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

17

Scripting elements: scriptlets - I

• <% statements java %>• blocchi di codice java eseguiti a tempo di

processamento di richiesta HTTP• possono produrre output per client• se pagina contiene più scriptlets, questi vengono

combinati e Servlet generata li contiene nell’ordine in cui appaiono in JSP

Page 18: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

18

Scripting elements: scriptlets - II

<html><head>…</head><body> <h1> prova di scriptlet </h1> <%

for (int i=0; i<5; i++) {out.println(“ciao n. “ + i);}

%></body></html>

testScriptlet.jsp

http:130.192.241.1:10000/swebi/JSP-EX/testScriptlet.jsp

Page 19: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

19

Scripting elements: scriptlets - III

In JSP si può inserire codice statico in scriptlets, utilizzando statement complessi (con parentesi graffe)

<html><head>…</head><body> <h1> prova di scriptlet complessa </h1> <%

if (18>= request.getParameter(“age”)) { %> Sei maggiorenne, dunque puoi votare!!

<% } else { %> Mi spiace, ancora non hai diritto di voto. <% } %></body></html> testScriptlet2.jsp

Molto similea PHP e ASP.Poco leggibile

Page 20: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

20

Scripting elements: espressioni • <%= espressione java da valutare %>• Permettono di valutare espressioni java

(invocazione metodi, valutazione variabili) e inviare risultato a client in output stream (String)

• Sono scriptlets abbreviate

<%! int anno = 2003; public String saluta(String name) { return “Ciao, “ + name + “!!”; }%><html><head>…</head><body> <p> Ciao <%= saluta(“carissimo”)%>, siamo nel <%= anno %></body></html>

EspressioneEspressione

Page 21: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

21

Scriptlets e JavaBeans • Utile per applicazioni molto semplici• Se si inserisce troppo codice in JSP

– pagine risultano difficili da leggere– si perde separazione tra aspetti di interfaccia e di

sviluppo di logica applicativa (obiettivo iniziale di sviluppo di JSP!)

• Introdotto uso di Java Beans per separare logica applicativa da markup in JSP– JSP include markup HTML e invocazione di metodi su

bean– Java Bean implementa codice dei metodi (accesso a

DB, …) meno codice java presente in JSP

Page 22: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

22

JSP: Architettura Model 1

Webbrowser

Webserver

JSP

JavaBean

Web container

Webbrowser

request

response

1

2

3

4

Page 23: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

23

JSP e java beans – acquisizione dati da form

• In JSP si può dichiarare che si utilizza istanza di classe (JavaBean) per– salvare parametri di richieste HTTP– recuperare valore di tali parametri quando serve

• dati (parametri) acquisiti attraverso form in JSP vengono “automaticamente” salvati in properties del bean usato da JSP

• bean serve come raccoglitore di dati acquisiti da form

Page 24: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

24

Esempio - form

parametro “login”

parametro “tipoInfo”: no, nomi, cc

Invocazione di JSP cheusa javaBean (SimpleBean.java)

Page 25: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

25

Esempio - Estratto di JSP

<jsp:useBean id=“sBean" scope="page" class="application.other.SimpleBean"/>

<jsp:setProperty name=“sBean" property="*"/><HTML><HEAD>...</HEAD><BODY> …<p><center> Ciao<jsp:getProperty name=“sBean" property="login"/> !</center></p><p> Hai richiesto la seguente operazione: <jsp:getProperty name=“sBean" property="tipoInfo"/></p></BODY></HTML>

Dichiarazione bean usato

Recupera valore property per visualizzaz

Visualizza codice interno di operaz scelta

Salva valore dei parametri di richiesta HTTP con nome = property di bean

Page 26: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

26

Esempio - Pagina visualizzata

Ciao liliana!

Hai richiesto la seguente operazione: nomi

Page 27: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

27

Esempio : SimpleBean.javapackage …;public class SimpleBean { private String login;

private String tipoInfo; public SimpleBean() { }

public void setLogin(String login) {this.login = login; } public String getLogin() {return login; }

public void setTipoInfo(String tipoInfo) {this.tipoInfo = tipoInfo;} public String getTipoInfo() {return tipoInfo;}}

Properties con nome checoincide con parametri di

HTTPServletRequest

• memorizza login di utente (login) e tipo di info richieste da utente (tipoInfo)

Page 28: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

28

Commenti

<jsp:useBean id=“sBean" scope="page" class="application.other.SimpleBean"/>

<jsp:setProperty name=“sBean" property="*"/><HTML>…

Ciao<jsp:getProperty name=“sBean" property="login"/> !</center></p>…..

Bean associato a singola JSP

(scope=“page”)

Salvataggio dati utente: istanza di bean salva variabili di statolocalmente ad esecuzione di JSP (se bean vivesse per

tutta la sessione utente lo potrebbero usare anche altre JSPper recuperare variabili di stato (vd dopo)

Page 29: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

29

JSP e java beans – logica applicativa

• Istanza di Java Bean usata anche per eseguire metodi di gestione di logica applicativa (in base a dati forniti da utente via form HTML)– definizione di metodi aggiuntivi rispetto a quelli di

gestione di properties associate ai parametri di richieste HTTP

– Tali metodi sono invocati da JSP per gestire richieste utente

Page 30: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

30

Java Bean

• Java Bean: Classe che definisce il bean deve seguire standard di definizione dei javaBeans– getXXX di ogni proprietà XXX del javaBean, per

leggere valore di property– setXXX di ogni proprietà XXX del javaBean, per

assegnare valore a property

• Logica applicativa può essere implementata definendo metodi di setXXX() e getXXX() che effettuano i servizi necessari

Page 31: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

31

Gestione logica applicativa - esempio esteso

Ciao franca!

Hai richiesto la seguente operazione: nomi persone(codice interno: nomi)

Valore parametro “tipoInfo”

Formato esterno tradotto da bean

(logica applicativa)

Page 32: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

32

Estratto di JSP – esempio esteso<jsp:useBean id="opBean" scope="page"

class="application.other.OPBean"/><jsp:setProperty name="opBean" property="*"/><HTML><HEAD><TITLE>...</TITLE></HEAD><BODY> <h1> … </h1><p><center> Ciao<jsp:getProperty name="opBean" property="login"/> !</center></p><p> Hai richiesto la seguente operazione:<jsp:getProperty name="opBean" property="operazione"/>(codice interno <jsp:getProperty name="opBean" property="tipoInfo"/> )</p></BODY></HTML>

Invocazione metodo di traduzione (logica app)

Page 33: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

33

OPBean.java - Ipackage application.other;public class OPBean { private String login;

private String tipoInfo; public OPBean() { }

public void setLogin(String login) {… } public String getLogin() {… }

public void setTipoInfo(String tipoInfo) {… } public String getTipoInfo() {… }

Properties con nome checoincide con parametri di

HTTPServletRequest

Page 34: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

34

OPBean.java - II

public String getOperazione() { String out = ""; if (tipoInfo.equals("no")) out = "nessuna

informazione"; else if (tipoInfo.equals("nomi")) out = "nomi

persone"; else if (tipoInfo.equals("cc")) out = "conti

correnti bancari"; else out = "tipo di informazione non gestita"; return out; }

} //chiusura bean

Logica applicativa (semplice, ma potrebbe prevedere accesso a DB)

NB: metodo usa altri valori inseriti da utente e salvati in Java Bean (variabili

di stato)

Metodo di gestionedi logica applicativa

Page 35: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

35

JSP Standard actions • Tag predefiniti che influenzano comportamento di

JSP a run-time e risposta inviata a client. Implementati da tutti i Web Container

• Associati a codice java che viene inserito da Web Container quando genera Servlet per JSP– jsp:useBean (per invocare oggetti esterni: java bean)– jsp:setProperty (gestione properties di bean)– jsp:getProperty (interrogazione java beans)– jsp:param (parametri richieste HTTP)– jsp:include (inclusione risorse)– jsp:forward (forward a risorse)– jsp:plugin (inclusione applet)

Page 36: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

36

Standard actions - jsp:useBean

• Sintassi<jsp:useBean id=”name" scope=”sc" bean_details />

• usata per istanziare JavaBean o per identificare istanza di bean esistente e specificare identificatore

• scope: specifica visibilità di bean– page: visibilità associata a richiesta specifica di pagina

– request: bean associato a richiesta HTTP visibile ad altre JSP incluse, o a cui si fa forward di richiesta

– session: associato a sessione utente

– application: visibile da tutte JSP di applicazione

Page 37: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

37

Uso di istanze di Java Bean in diverse JSP

<jsp:useBean id=”name" scope=”sc" bean_details /> • Se scope di Java Bean è session, istanza di java bean

creata da prima JSP invocata e usata da altre JSP durante sessione utente

• Gestione di istanza di Java Bean– Basata su id (“name”) associato a istanza di Java Bean

– Tutte le JSP devono usare stesso id con stesso scope

– Web Container cerca istanza di bean con id richiesto nell’ambito dello scope specificato da JSP

• Se lo trova, lo usa come riferimento in esecuzione di JSP

• Altrimenti lo crea

Page 38: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

38

jsp:useBean – esempio I<%-- informa.jsp : questo è un commento per JSP --%><jsp:useBean id="opBean" scope="page"

class="application.other.OPBean"/><jsp:setProperty name="opBean" property="*"/><HTML><HEAD><TITLE>...</TITLE></HEAD><BODY> <h1> … </h1><p><center> Ciao<jsp:getProperty name="opBean" property="login"/> ! Come stai?</center></p><p> Hai richiesto la seguente operazione:<jsp:getProperty name="opBean" property="operazione"/>(codice interno <jsp:getProperty name="opBean" property="tipoInfo"/> )</p></BODY></HTML>

Page 39: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

39

jsp:useBean – esempio II<%-- informa.jsp : questo è un commento per JSP --%>

<jsp:useBean id="opBean" scope="page" class="application.other.OPBean"/>

<jsp:setProperty name="opBean" property="*"/>

<HTML>

<HEAD><TITLE>...</TITLE></HEAD>

<BODY>

<h1> … </h1>

...

Dichiarazione di bean di nome opBean con proprietà di visibilità

Salvo valore di tutti i parametri dirichiesta HTTP con nome = property di bean

Page 40: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

40

jsp:useBean – esempio III...

<p><center>

Ciao

<jsp:getProperty name="opBean" property="login"/> ! Come stai?

</center></p>

<p>

Hai richiesto la seguente operazione:

<jsp:getProperty name="opBean" property="operazione"/>

(codice interno <jsp:getProperty name="opBean" property="tipoInfo"/> )

</p>

</BODY></HTML>

Recupero valore di property “login”di bean (recupero parametro di richiesta…)

NB: “operazione” non è parametro di richiestaInvoco metodo di bean che “gestisce” richiesta

Page 41: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

41

Standard actions - jsp:setProperty • <jsp:setProperty name=”beanName" property_details />• setta properties (semplici o indexate - array) di bean• per settare proprietà di bean con nome = a parametri di

richiesta HTTP– <jsp:setProperty name=”beanName" property=“*” />

• per settare properties specifiche (nome=parametro)– <jsp:setProperty name=”beanName" property=“propName”

/>

• property con nome da parametri di richiesta HTTP– <jsp:setProperty name=”beanName" property=“propName”

param=“paramName” />

• … vd libro

Page 42: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

42

Standard actions - jsp:getProperty

• <jsp:getProperty name=”beanName”

property=“prName” />• recupera valore di property di bean (convertendolo in

String - toString(), valueOf())• per recuperare valori di richieste salvate in bean• per invocare metodi di gestione di logica applicativa

– <jsp:getProperty name="opBean"

property="operazione"/>

– invoca metodo getOperazione() di bean

Se istanza di Java Bean ha scope più ampio di “page”, JSP può recuperare dati memorizzati in

precedenti passi di interazione con utente

Page 43: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

43

Standard actions - jsp:include - I

• <jsp:include page=”URL" flush=“true” />• <jsp:include page=”URL" flush=“true” >

<jsp:param name=“parName” value=“parValue” /> </jsp:include>

• permette inserimento di risorsa statica o dinamica specificata da URL in JSP

• inclusione risorsa effettuato a request processing time meno efficiente di directive include, ma adatto a includere risorse che cambiano spesso

• NB: Buffer usato da printWriter per mantenere dati temporanei da inviare a browser (si può scegliere dimensione minima di buffer da imporre a Web Container, che può allocare un buffer di tale dimensione o più grande)

Permette specifica di ulterioriparametri rispetto a richiesta HTTP originale

Page 44: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

44

Standard actions - jsp:include - II

• pagina inclusa può accedere a JSPWriter object, non può settare cookies o headers

• flush: specifica se buffer di output deve essere ripulito prima di includere la pagina o meno

• flush: default=false. Se true, buffer “flushed” prima di inclusione di pagina ( non si può fare forward ad altre risorse o usare error pages)

• jsp:include directive include– con directive include, risorsa inclusa a translation time e

web container fa compilare la pagina ottenuta– con jsp:include inclusione fatta a run time, no precedente

compilazione. Adatto a includere Servlet java

Page 45: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

45

Standard actions - jsp:param

• <jsp:param name=”parName" value=“parValue” />

• usato in jsp:include e jsp:forward per invocare risorse aggiungendo parametri rispetto a quelli di HttpServletRequest originale

• specifica nuovi attributi come coppie <chiave, valore>

Page 46: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

46

Esempio di uso di java bean • Sviluppiamo applicazione “Prova” che

– tramite form HTML permette a utente di richiedere 3 servizi: nessuna informazione (no), nomi persone (nomi) o dati su conti correnti bancari (cc)

– Form HTML invoca (post) JSP di gestione dei servizi– JSP invoca bean per gestire il servizio richiesto,

passando scelta utente come parametro, e raccoglie risultato da visualizzare in pagina per browser utente

– bean traduce richiesta utente da codice interno a esterno• Es: da cc a conti correnti bancari, da no a nessuna

informazione

– NB: metodi di bean potrebbero essere più complessi, e.g., accesso a DB per recupero dati

Page 47: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

47

Invocazione JSP da form HTML

<FORM METHOD="POST" ACTION="informa.jsp">

parametro “login”

parametro “tipoInfo”: no, nomi, cc

Page 48: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

48

Page 49: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

49

Esempio di inclusione di Servlet <jsp:useBean id="opBean" scope="page" class="application.other.OPBean"/><jsp:setProperty name="opBean" property="*"/><HTML><HEAD> … </HEAD><BODY...<p><center>Ciao <jsp:getProperty name="opBean" property="login"/>! Come stai?</center></p>

<p> Hai richiesto la seguente operazione:<jsp:getProperty name="opBean" property="operazione"/>(codice interno: <jsp:getProperty name="opBean" property="tipoInfo"/> )</p>

<p>Ecco il risultato: sto per invocare la servlet application.servlets.Informazioni.java!!<jsp:include page="servlet/info" flush="true" /> </p>

<CENTER><INPUT TYPE="Submit" NAME="btnSubmit" VALUE="Submit request"></CENTER></FORM></BODY></HTML>

Include senza parametri extra

Page 50: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

50

Standard actions - jsp:forward - I

• <jsp:forward page=”URL” />• <jsp:forward page=”URL">

<jsp:param name=“parName” value=“parValue” /> </jsp:forward>

• permette invio di richiesta ad altra risorsa di applicazione (pagina HTML, JSP, Servlet)

• flusso di esecuzione passa a risorsa invocata• buffer viene ripulito prima di forward (non si fa

merge di output delle due risorse)• equivalente a metodo forward() di

javax.servlet.RequestDispatcher

Permette specifica di ulterioriparametri rispetto a richiesta HTTP originale

Page 51: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

51

Standard actions - jsp:forward - II

<HTML><HEAD>...</HEAD><BODY>...<% if (request.getParameter("login").equals(“raf”)) %><jsp:forward page=“wellcomeRAF.jsp” /><% } else %><%@ include file=“completeRegistration.html” %><% } %></BODY></HTML>

Page 52: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

52

Standard actions - jsp:plugin

• Permette di includere java applet in pagine generate da JSP

• vd libro

Page 53: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

53

Oggetti Java impliciti

• request: rappresenta oggetto HttpServletRequest che ha originato invocazione di metodo service(). Visibilità: a livello di singola richiesta HTTP

• response: oggetto HttpServletResponse che rappresenta risposta a richiesta HTTP. Visibilità: a livello di pagina

• session: oggetto HttpSession generato da connessione di client. Visibilità: a livello di sessione

• config: oggetto ServletConfig associato a JSP

queste variabili (e altre) possono essere usate esplicitamente in JSP perchè create a translation time

(anche ASP etc. hanno “request”, “session”, …)

Page 54: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

54

Commenti

• JSP adatte a sviluppo di interfaccia utente di applicazioni– facilitano specifica di layout di pagine

– nascondono in parte dettagli implementativi di applicazioni web

• JSP non adatte a gestione di logica applicativa– inserimento di troppo codice java in pagina JSP causa

poca leggibilità del codice

– compilazione di pagine evidenzia errori in codice di pagine in modo indiretto (compilazione avviene su Servlet espansa, non su JSP) difficile fare debugging

Page 55: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

55

Architettura Model 1 – page centric

• In architettura Model 1 interfaccia utente composta di una o più JSP– utente carica JSP home page di servizio– esecuzione JSP invoca metodi di JavaBean per

generare parti dinamiche di pagina da visualizzare su browser utente

– pagina visualizzata include bottoni e link per continuare interazione

– a seconda di azione utente, JSP opportuna viene invocata

– continua in modo simile

Page 56: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

56

Model 2

• JSP hanno RequestDispatcher e offrono istruzioni – include per includere risorse (pagina HTML, Servlet)

– forward per delegare risorse a gestione richiesta HTTP

• Per sviluppo di applicazioni complesse, meglio combinare JSP e Servlet (e pagine statiche)– JSP e pagine statiche per gestione interazione con utente

– Servlet per gestione di attività di backend

– combinazione basata su pattern Model View Controller (Model 2)

• http://www.javaworld.com/javaworld/jw-12-1999/jw-12-ssj-jspmvc.html

Page 57: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

57

JSP: Architettura Model 2

Webserver

(controller)Servlet

Web container

request

response

1

3

5 (view)JSP

(Model)JavaBean

2

instantiate

4

Page 58: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

58

Architettura Model 2

• Servlets per gestire logica applicativa• JSP per generare presentation layer• Servlet

– intercetta richieste utente (post, …)

– in base a valore di parametri di richiesta decide a quale JSP forwardare richiesta

– crea java beans necessari a JSP

• JSP– recupera oggetti e beans creati da Servlet

– estrae da oggetti contenuto dinamico da visualizzare in pagina da inviare a browser utente

Page 59: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

59

Architettura Model 2 – Esempio

• Music without borders: negozio elettronico

• Interfaccia utente realizzata con diverse JSP che generano porzioni diverse di interfaccia – es: pagina principale include JSP di

visualizzazione di carrello spesa– pagina di checkout (chiusura interazione)

• Servlet gestisce flusso di interazione scegliendo JSP a cui forwardare richieste utente ad ogni passo

Page 60: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

60

Music without borders – pagina principale - I

Page 61: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

61

<%@ page session="true" %><html><head><title>Music Without Borders</title></head><body><font face="Times New Roman,Times" size="+3">Music Without Borders</font><hr><p><center><form name="shoppingForm" action="/examples/servlet/ShoppingServlet"

  method="POST"> <b>CD:</b> <select name=CD>

  <option>Yuan | The Guo Brothers | China | $14.95</option> …  <option>Ibuki | Kodo | Japan | $13.95</option> </select>

<b>Quantity: </b><input type="text" name="qty" SIZE="3" value=1><input type="hidden" name="action" value="ADD"><input type="submit" name="Submit" value="Add to Cart">

</form></center></p> <jsp:include page="Cart.jsp" flush="true"/> </body></html>

Include JSP di carrello spesa:visualizza prodotti già scelti

Music without borders – pagina principale - II

Page 62: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

62

Music without borders – pagina principale - III

Page 63: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

63

<%@ page session="true" import="java.util.*, shopping.CD" %><% Vector buylist = (Vector) session.getValue("shopping.shoppingcart"); if (buylist != null && (buylist.size() > 0)) { %>

<center><table border="0" cellpadding="0" width="100%" bgcolor="#FFFFFF"><tr> <td><b>ALBUM</b></td> <td><b>ARTIST</b></td> …

<td><b>QUANTITY</b></td> <td></td> </tr><% for (int index=0; index < buylist.size();index++) {

   CD anOrder = (CD) buylist.elementAt(index); %><tr> <td><b> <%= anOrder.getAlbum() %> </b></td>   ….

    <td><b> <%= anOrder.getQuantity() %> </b></td>   <td><form name="deleteForm“

action="/examples/servlet/ShoppingServlet“ method="POST">    <input type="submit" value="Delete">

   <input type="hidden" name= "delindex" value='<%= index %>'>   <input type="hidden" name="action" value="DELETE"> </form> </td></tr>

 <% } %><\table>  

Music without borders – pagina carrello - I

Page 64: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

64

   <p>  <form name="checkoutForm"    action="/examples/servlet/ShoppingServlet" method="POST">    <input type="hidden" name="action" value="CHECKOUT">    <input type="submit" name="Checkout" value="Checkout">  </form>  </center><% } %>

Music without borders – pagina carrello

NB: questo codice è vecchio, parziale e potrebbe contenere errori… vediamolo solo per

capire come si integrano Servlet e JSP in Model 2

Page 65: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

65

public class ShoppingServlet extends HttpServlet { … …

 public void doPost (…) throws … { HttpSession session = req.getSession(false); if (session == null) {forward a pagina error.html);} Vector buylist = (Vector)session.getValue("shopping.shoppingcart"); String action = req.getParameter("action");  if (action.equals("DELETE")) {elimina item da carrello (buyList);} else if (action.equals("ADD")) {aggiunge item a carrello;}

   session.putValue("shopping.shoppingcart", buylist); String url="/jsp/shopping/EShop.jsp"; ServletContext sc = getServletContext(); RequestDispatcher rd = sc.getRequestDispatcher(url); rd.forward(req, res); } else if (action.equals(“CHECKOUT”) …

Music without borders – Servlet (controller) - I

Forward a pagina principale (Eshop.jsp)

Page 66: Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Laboratorio di Servizi Web - JSP - Ardissono

66

else if (action.equals("CHECKOUT"))  {      amount = calcola prezzo da pagare;}      req.setAttribute("amount",amount);      String url="/jsp/shopping/Checkout.jsp";      ServletContext sc = getServletContext();      RequestDispatcher rd = sc.getRequestDispatcher(url);      rd.forward(req,res);    }  } // fine servlet

Music without borders – Servlet (controller)

Invia controllo a pagina Di checkout (Checkout.jsp)