SlideShare a Scribd company logo
Bari, Dicembre 2002 
Java Advanced 
Java Advanced 
Antonio Furone
Java Advanced Bari, 2002 2 
Antonio Furone 
Contenuti 
 Advanced API : JDBC, Mailing, Interoperabilità, Log4j 
 J2EE: JSP, Servlet, EJB, Custom Tag Library, JSTL, EJB 
 Web Services 
 ANT 
 Framework applicativi: Modello MVC,Struts (base e advanced)
Java Advanced Bari, 2002 3 
Antonio Furone 
JDBC
Java Advanced Bari, 2002 4 
Antonio Furone 
Mailing
Java Advanced Bari, 2002 5 
Antonio Furone 
Interoperabilità 
 Java to COM : J-Integra, Jacob 
 COM to Java: JavaBeans ActiveX Bridge 
 WebServices 
 CORBA
Java Advanced Bari, 2002 6 
Antonio Furone 
Interoperabilità: Esempio 
//Jacob 
import com.jacob.com.*; 
import com.jacob.activeX.*; 
…. 
private final String ACTIVEX="DENIC.xldap"; 
private ActiveXComponent activeX_comp=null; 
private String org_group="o=telecom italia group"; 
…. 
activeX_comp = new ActiveXComponent(ACTIVEX); 
Variant org=new Variant(org_group); 
Dispatch.call(activeX_comp,"setOrganization", org); 
…. 
Variant usr = new Variant(user); 
Variant psw = new Variant(password); 
Variant info = new Variant(""); 
Variant v = Dispatch.call(activeX_comp,"chkUtente0", usr,psw,info); 
…. 
Variant usr = new Variant(user); 
Variant info = new Variant("mail"); 
Variant v = Dispatch.call(activeX_comp,"getValue", usr,info);
Log delle applicazioni (Log4J) 
 Elementi cardine della libreria: i logger, gli appender, i layout e i livelli 
 Logger: Componente che il programma utilizza per registrare gli eventi. Sono 
organizzati ad albero gerarchico la cui radice (log root) può essere recuperata 
attraverso il metodo statico getInstance(); 
 Appender: Deposito nel quale si possono registrare gli eventi. Esistono 
diversi tipi di appender, ma i più utili sono quelli basati su file, su console, su 
DB, mail, socket … 
 Layout: Forma con la quale vengono registrati i messaggi (Html, Xml, …) 
 Livelli : Ogni messaggio ha un livello di gravità dell’errore (DEBUG, INFO, 
WARN, ERROR, FATAL) 
Java Advanced Bari, 2002 7 
Antonio Furone
Java Advanced Bari, 2002 8 
Antonio Furone 
Log4J 
 Esistono due modalità per configurare Log4j all’interno di una applicazione: 
via codice o attraverso un file di property 
import org.apache.log4j.PropertyConfigurator; 
… 
PropertyConfigurator.configure(“path/to/file.properties”); 
 File di properties 
log4j.rootLogger=DEBUG, F1 
… 
log4j.appender.F1=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.F1.File=detail.log 
log4j.appender.F1.DatePattern=‘.’yyyy-MM-dd-HH-mm’.log’ 
log4j.appender.F1.layout=org.apache.log4j.HTMLLayout 
 Codice 
import org.apache.log4j.*; 
… 
static Logger log=Logger.getRootLogger(); // getLogger(“name”); 
… 
log.info(“…start”); 
log.warn(“…warning”); 
log.debug(“messaggio di debug”); 
log.error(“…errore”); 
log.fatal(“… fatal error”);
Java Advanced Bari, 2002 9 
Antonio Furone 
J2EE 
La piattaforma Java 2
Java Advanced Bari, 2002 10 
Antonio Furone 
J2EE: Application Model
Java Advanced Bari, 2002 11 
Antonio Furone 
J2EE: Vantaggi 
 Architettura e sviluppo semplificati 
• modello di sviluppo basato sui componenti 
• paradigma “Write Once, Run Anywhere” 
 Scalabilità 
• I container forniscono meccanismi che 
permettono di ottenere un alto livello di 
scalabilità senza richiedere l’intervento dello 
sviluppatore 
• E’ possibile configurare i container in modo 
che le applicazioni vengano distribuite su più 
calcolatori (load balancing) 
 Integrazione di SI preesistenti 
• La piattaforma include un insieme di API 
standard per accedere a SI aziendali: JDBC, 
Java Transaction API, Java Naming and 
Directory Service, Java Message Service 
(IBM MQ Series, TIBCO), Java Mail, Java 
IDL, Connector Architecture 
 Scelta di server strumenti e 
componenti 
• Server sviluppati da più produttori 
• IDE che facilitano sviluppo, deployment e 
gestione delle applicazioni 
• Riuso dei componenti (anche di mercato) 
 Modello per la sicurezza flessibile
Java Advanced Bari, 2002 12 
Antonio Furone 
Java Server Page / Servlet 
Tecnologia per la costruzione di pagine web con contenuti dinamici 
<%@ page import=“java.text.*,java.util.*” %> 
<html> 
<body> 
<% Date d=new Date(); 
String today=DateFormat.getDateInstance().format(d); 
%> 
Today is: 
<em><%=today%></em> 
</body> 
</html> 
Compilazione 
Servlet 
public class … extends HttpServlet 
{ 
public void init(ServletConfig config) throws ServletException {…} 
public String getServletInfo() {…} 
protected void doGet(HttpServletRequest request, HttpServletResponse response){…} 
protected void doPost(HttpServletRequest request, HttpServletResponse response){…} 
… 
}
 Commenti 
<%-- Commento JSP --%> 
Java Advanced Bari, 2002 13 
Antonio Furone 
JSP/Servlet 
 Dichiarazioni 
<%! int i=0; %> 
<%! public void jspInit() {…} %> 
jspInit() 
_jspService() 
jspDestroy() 
…extends HttpJspBase 
 Direttive 
<%@ page import=“java.text.*,java.util.*” buffer=“16k” %> 
<%@ page include=“copyright.html” %> 
<%@ page isThreadSafe=“true” %> 
<%@ page isErrorPage=“false” errorPage=“error.jsp” %> 
<%@ page isErrorPage=“true” %> 
<%@ page session=“false” %> 
 Object Scopes 
application 
session 
request 
page 
 Oggetti impliciti 
request HttpServletRequest 
response HttpServletResponse 
pageContext pageContext 
application ServletContext 
out JspWriter 
config ServletConfig 
page HttpJspPage 
session HttpSession 
exception Throwable
<% 
Foo foo=new Foo(); 
session.putValue(“foo”,foo); 
%> 
<% 
Foo myFoo=(Foo) session.getValue(“foo”); 
%> 
Java Advanced Bari, 2002 14 
Antonio Furone 
JSP/Servlet 
 Gestione della sessione 
 Utilizzo di bean 
<jsp:useBean id=“user” class=“com.jguru.Person” 
scope=“session” /> 
<jsp:useBean id=“user” class=“com.jguru.Person” 
scope=“session”> 
<% 
user.setDate ….. 
%> 
</jsp:useBean> 
<jsp:getProperty name=“user” property=“name” /> 
<jsp:setProperty name=“user” property=“name” 
value=“<%=expression%>” />
Java Advanced Bari, 2002 15 
Antonio Furone 
Custom Tag 
 Le Custom Tag Libraries sono uno strumento messo a disposizione a 
partire dalle specifiche 1.1 che consentono di costruire contenitori di tag JSP 
riutilizzabili; 
 I Custom Tag interagiscono con la pagina e sono utilizzati per incapsulare 
funzionalità di generazione dinamica di codice HTML; 
 Una Tag Library è composta da: 
• Tag Library Descriptor (TLD): documento XML che descrive la libreria; 
• Tag Handler : classe Java che ne implementa le funzionalità;
 TLD 
<?xml version="1.0" encoding="ISO-8859-1" ?> 
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" 
"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd"> 
Java Advanced Bari, 2002 16 
Antonio Furone 
Custom Tag 
 Dichiarazione Tag Library (web.xml) 
<taglib> 
<taglib-uri>http://www.platnet.it/taglib</taglib-uri> 
<taglib-location>/WEB-INF/platnet.tld</taglib-location> 
</taglib> 
<taglib> 
<tlibversion>1.0</tlibversion> 
<jspversion>1.1</jspversion> 
<shortname>platnetlib</shortname> 
<uri>http://www.platnet.it/taglib</uri> 
<info>Plat-net Tag Library</info> 
<!--Un semplice Tag --> 
<tag> 
<name>wellcome</name> 
<tagclass>SAMMIT.server.tag.Wellcome </tagclass> 
<!--Body content può avere I seguenti valori: 
empty: no body 
JSP: Il contenuto di body è valutato dal container e processato dal Tag Handler 
tagdependent: : Il contenuto di body viene processato solo dal Tag Handler; il codice JSP contenuto in 
body non viene valutato dal container . 
--> 
<bodycontent>empty</bodycontent> 
<info> 
Il classico esempio "Hello World" rivisitato con I Tag. 
</info> 
<attribute> 
<name>name</name> 
<required>false</required> 
<rtexprvalue>true</rtexprvalue> 
</attribute> 
</tag> 
</taglib>
Java Advanced Bari, 2002 17 
Antonio Furone 
Custom Tag 
 Tag Handler : per ogni attributo è necessario implementare i metodi get/set 
… 
import javax.servlet.jsp.*; 
import javax.servlet.jsp.tagext.*; 
public class Wellcome extends TagSupport { 
private String name=null; 
public void setName(String value){ 
name = value; 
} 
public String getName(){ 
return(name); 
} 
// doStartTag viene chiamato dal JSP container quando 
// il TAG viene trovato. 
public int doStartTag() { 
try { 
JspWriter out = pageContext.getOut(); 
out.println("<table border="1">"); 
if (name != null) 
out.println("<tr><td> Benvenuto/a " + name 
+ "</td></tr>"); 
else 
out.println("<tr><td> Benvenuto a chi? </td></tr>"); 
} 
catch (Exception ex) { 
throw new Error(“Si è verificato un errore."); 
} 
// Dovrò ritornare SKIP_BODY perché comunque il 
body è vuoto 
// come è stato specificato nel file TLD. 
return SKIP_BODY; 
} 
// doEndTag() viene chiamato dal JSP container quando viene 
// trovato il segno di chiusura del tag 
public int doEndTag(){ 
try { 
JspWriter out = pageContext.getOut(); 
out.println("</table>"); 
} 
catch (Exception ex){ 
throw new Error(" Si è verificato un errore."); 
} 
} 
} 
 Utilizzo 
<%@ taglib uri="http://www.platnet.it/taglib" prefix=“plat" %> 
<html> 
<head> 
<title>Utilizzo Tag</title> 
</head> 
<body bgcolor="#ffffff"> 
<hr /> 
<plat:wellcome name=“Paperino"/> 
<hr /> 
</body> 
</html>
JSP Standard Tag Library (JSTL) 
Insieme di tag, sviluppati in seno al Java Comunity Process dell’Apache Group, consiste in una 
collezione di Custom Tag Library, organizzate e suddivise per categorie funzionali. Diverrà 
standard con la specifica JSP 2.0. 
Java Advanced Bari, 2002 18 
Antonio Furone 
 Componenti fondamentali 
http://java.sun.com/products/jsp/jstl/ 
Libreria URI Namespace Funzionalità 
core http://java.sun.com/jstl/core c Programmazione 
XML 
http://java.sun.com/jstl/xml x XML e XLST 
processing 
I18N http://java.sun.com/jstl/fmt fmt Localizzazione 
RDB access http://java.sun.com/jstl/sql sql Accesso a RDBMS 
 EL (Expression Language) 
Linguaggio per l’accesso immediato ad oggetti e loro proprietà all’interno di pagine JSP 
${customer.id}$ 
${customer.[“id”]}$ 
${customer.[propertyName]}$ 
${customerList[0]}$
Java Advanced Bari, 2002 19 
Antonio Furone 
EL: Operatori 
Operatore Sinonimo Funzione 
+ Somma 
- Differenza 
* Moltiplicazione 
/ div Divisione 
% mod Modulo 
== eq Uguaglianza 
empty Riferimento a null, stringa di lunghezza 0, array 
o collection privo di elementi 
!= ne Differenza 
> gt Maggioranza 
>= ge Maggioranza o uguaglianza 
< lt Minoranza 
<= le Minoranza o uguaglianza 
&& and And 
|| or Or 
! not Not
Java Advanced Bari, 2002 20 
Antonio Furone 
EL: Oggetti Impliciti 
Oggetto Semantica 
pageContext Oggetto pageContext corrente 
pageScope Un vettore associativo le cui chiavi corrispondono ai nomi degli attributi con 
scope di pagina, ed i cui valori corrispondono ai valori dei rispettivi attributi 
requestScope “” ma riferito alla richiesta http 
sessionScope “” ma riferito alla sessione 
applicationScope “” ma riferito allo scope application 
param “” ma riferito ai parametri come da ServletRequest.getParameterValues() 
paramValues “” ma riferito ai parametri sotto forma di String[] 
header “” ma riferito ai valori dei request header come da 
HttpServletRequest.getHeader() 
headerValues 
cookie “” ma riferito ai cookie (javax.servlet.http.Cookie 
initParam “” ma riferito ai parametri di inizializzazione come da 
ServletContext.getInitParameter()
Java Advanced Bari, 2002 21 
Antonio Furone 
JSTL:Esempi 
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> 
… 
<table border="1"> 
<tr> 
<td>Contatto</td> 
</tr> 
<c:forEach var="contact" items="${addressBook.contacts}$"> 
<tr> 
<td> 
<c:out value="${contact.name}$" /> 
</td> 
</tr> 
</c:forEach> 
</table> 
Ogni oggetto definito in uno scope JSP valido (pagina, request, session, application) viene 
automaticamente riconosciuto e può essere utilizzato nelle espressioni EL.
Java Advanced Bari, 2002 22 
Antonio Furone 
JSTL:Esempi 
<form method="post" name="nodesbyidForm" action="/netview/main"> 
<input type="hidden" name="action" value="nodesbycatid" /> 
<select name="catId" onChange="document.nodesbyidForm.submit();" > 
<c:forEach var="category" items="{informationSystem.allCategories}"> 
<option value="<c:out value='{category.id}'/>"> 
<c:out value="{category.desc}" /> 
</option> 
</c:forEach> 
</select> 
</form> 
<title>NetView - 
<c:choose> 
<c:when test="{action=='allnodes'}"> 
Tutti i nodi 
</c:when> 
<c:when test="{action=='nodesbycatid'}"> 
Nodi per categoria 
</c:when> 
</c:choose> 
</title> 
<c:forEach var="node" items="{nodes}"> 
<tr> 
<td><a href="/netview/main?action=nodeform&subaction=edit&id=<c:out value='{node.id}' />" title="Modifica"><img src="Open24.gif" 
border="0" alt="Apri" /></a> 
</td> 
<td><a href="javascript:deleteNode(<c:out value='{node.id}' />);" title="Cancella"> 
<img src="Remove24.gif" alt="Cancella" border="0" /></a> 
</td> 
<td><c:out value="{node.id}"/></td> 
<td><c:out value="{node.desc}"/></td> 
<td><c:out value="{node.catDesc}"/></td> 
<td><c:out value="{node.state}"/></td> 
<td><c:out value="{node.load}"/></td> 
<td><c:out value="{node.lstRdLoad}"/></td> 
<td><c:out value="{node.tdsLoad}"/></td> 
<td><c:out value="{node.building}/{node.floor}/{node.room}"/></td> 
</tr> 
</c:forEach>
Java Advanced Bari, 2002 23 
Antonio Furone 
EJB: Vantaggi 
 Semplificazione del processo di sviluppo 
 Riusabilità del codice e modularità 
 Robustezza 
 Gestione automatica di: 
• transazioni (Commit, Rollback e Recovery); 
• scalabilità: aumentando l’hw, le prestazioni aumentano in modo lineare; 
• sicurezza; 
 Alte prestazioni 
• bilanciamento dei carichi di lavoro; 
• caching delle connessioni al database;
Java Advanced Bari, 2002 24 
Antonio Furone 
EJB: Esempio 
Web Server EJB Container 
Client Servlet 
DBMS 1 
DBMS 2 
Shopping 
Cart 
Credit 
Order 
Transaction 
Server 
Begin 
Commit 
Application Server
Enterprise 
Bean 
Instance 
Java Advanced Bari, 2002 25 
Antonio Furone 
EJB: L’architettura 
Client 
EJB Server 
EJB Container 
 EJB Server: Application Server 
 EJB Container: Gestore di EJB
Java Advanced Bari, 2002 26 
Antonio Furone 
EJB: Server 
 Permette di utilizzare i componenti da client remoti 
 Fornisce ai container i seguenti servizi: 
 Gestione delle risorse di sistema 
 Mantenimento dello stato 
 Gestione/attivazione di processi/thread 
 Sicurezza 
 Gestisce le politiche di ottimizzazione delle prestazioni: 
 Pooling e caching delle connessioni a DB 
 clustering 
 fault tollerance 
 caching dei bean 
Web Logic - Bea 
Websphere AS – IBM 
Orbix – Iona 
Oracle AS – Oracle 
JBoss
Java Advanced Bari, 2002 27 
Antonio Furone 
EJB: Container 
 Ospita ed esegue gli EJB 
Client 
EJB Container 
Bean 
EJB Server 
home 
remote
Java Advanced Bari, 2002 28 
Antonio Furone 
EJB: Enterprise Bean 
 E’ il componente vero e proprio 
 Classe Java specializzata in cui risiede la logica di business 
dell’applicazione 
 Deve essere installato (deployment) sull’application server 
 Fa uso di servizi offerti dall’ambiente di esecuzione EJB: 
• Transazioni 
• Sicurezza 
• Persistenza
 Non è persistente 
 Implementa l’interfaccia javax.ejb.SessionBean 
 In genere implementa la logica di business dell’applicazione 
 Può essere stateless o statefull 
Java Advanced Bari, 2002 29 
Antonio Furone 
EJB: Tipologie 
 Session Bean 
 Entity Bean 
 Oggetto persistente (dati memorizzati su DB) 
 Consente di mappare una sorgente dati su una classe Java 
 La lettura modifica di un attributo si traduce nelle corrispondenti 
operazioni sul DB 
 Ciascuna istanza è condivisa da più client 
 Implementa l’interfaccia javax.ejb.EntityBean
• Viene creata una sessione 1:1 con uno specifico client 
• Viene mantenuto lo stato tra l’invocazione di un metodo e un altro 
• Quando il client si disconnette il componente viene rimosso 
Java Advanced Bari, 2002 30 
Antonio Furone 
EJB: Session Bean 
 Stateful 
 Stateless 
• Non viene mantenuto alcuno stato tra l’invocazione di un metodo e 
l’altro 
• Una stessa istanza del bean può servire contemporaneamente più client 
(+ performance)
Java Advanced Bari, 2002 31 
Antonio Furone 
EJB: Entity Bean 
 Fornisce i metodi per agire sui dati che esso stesso rappresenta 
 Ciascuna istanza di un Entity Bean è identificata in modo univoco da 
una chiave primaria (rappresentata da più campi della tabella): la 
PrimaryKey 
 La persistenza dei dati può essere a carico del : 
 Container: Container Managed Persistence (CMP) 
 Bean: Bean Managed Persistence (BMP)
Java Advanced Bari, 2002 32 
Antonio Furone 
EJB: BMP 
 L’interfacciamento alle tabelle del DB è cablato all’interno del codice 
 Lo sviluppatore implementa (tramite JDBC) i metodi di accesso al DB: 
ejbCreate(), ejbLoad(), ejbStore(), ejbRemove() 
 Frequenti modifiche al codice in caso di : cambio DB vendor, 
modifiche allo schema del DB 
 Possibilità di ottimizzare l’accesso al DB
• Genera in automatico il codice SQL per l’accesso alle tabelle del DB 
• L’accesso ai dati da parte del client si traduce in opportune query sul DB 
• La modifica dei dati contenuti nel bean si traduce in opportune update sul DB 
Java Advanced Bari, 2002 33 
Antonio Furone 
EJB: CMP 
 Accesso al DB completamente gestito dal container: 
 Meno performanti rispetto ai BMP 
 EJB più rubusti: meno JDBC implica un gran numero di righe di 
codice in meno: meno errori
EJB: Vista dello sviluppatore 
EJB 
Class 
EJB Container 
Java Advanced Bari, 2002 34 
Antonio Furone 
EJB Server 
EJBHome 
Interface 
EJBObject 
Interface 
EJBHome 
Class 
EJBObject 
Class 
 Le interfacce EJBHome 
e EJBObject incapsulano 
l’accesso all’oggetto 
vero e proprio 
 Il deploy descriptor 
specifica al container gli 
attributi transazionali e di 
sicurezza con cui 
accedere all’oggetto (ejb-jar. 
xml)
Java Advanced Bari, 2002 35 
Antonio Furone 
EJB: Home 
 Fornisce i metodi per ottere riferimenti ad istanze del componente: 
create(), find…() 
 Consente la rimozione di una istanza 
… 
import javax.ejb.*; 
import java.rmi.*; 
public interface DemoHome extends EJBHome 
{ 
public Demo create() throws CreateException, 
RemoteException 
}
Java Advanced Bari, 2002 36 
Antonio Furone 
EJB: Remote 
 Contiene l’elenco dei metodi che il client può invocare 
 E’ il container che deve generare il codice (l’implementazione) per 
questa interfaccia 
… 
import javax.ejb.*; 
import java.rmi.*; 
public interface Demo extends EJBObject 
{ 
public String miaFunzione() throws RemoteException; 
}
Java Advanced Bari, 2002 37 
Antonio Furone 
EJB: JavaBean Class 
 Implementa la logica di business dell’applicazione 
 Può essere di due tipi EntityBean o SessionBean a seconda dell’interfaccia che 
implementa 
 Le interfacce prevedono metodi specifici (invocati esclusivamente dal container) per la 
gestione della creazione, attivazione, passivazione dei bean stessi 
import… 
public class DemoBean implements SessionBean 
{ 
public void ejbActivate(){… } 
public void ejbRemove(){… } 
public void ejbPassivate(){… } 
public void ejbCreate(){… } 
public String miaFunzione() throws RemoteException 
{ 
return new String(“Hello World !”); 
} 
} 
Implementa i metodi della 
SessionBean Interface 
Corrisponde alla create() della 
Home
EJB: JavaBean Class (solo per EntityBean) 
 Incapsula la chiave primaria con cui effettuare la ricerca di specifiche istanza 
Java Advanced Bari, 2002 38 
Antonio Furone 
 Ogni EntityBean deve avere una Primary Key 
 La Primary Key deve essere serializzabile 
public class AssOfPsXContrBMPBean extends AbstractEntityCommonBean implements EntityBean 
{ 
public EntityContext entityContext; 
private AssOfPsXContrBMPPK pk; 
public AssOfPsXContrBMPPK ejbCreate(…) 
throws CreateException, RemoteException, CustomEJBException 
{ 
pk=new AssOfPsXContrBMPPK(); 
…. 
return pk; 
} 
public void ejbPostCreate(…) 
{} 
public AssOfPsXContrBMPPK ejbFindByPrimaryKey(AssOfPsXContrBMPPK primaryKey) throws FinderException, RemoteException 
{} 
public Collection ejbFindAll(…) throws FinderException, RemoteException 
{} 
} 
 Tutti i metodi find…() (es. findByName()) ritornano collection di Primary Key
Client 
EJBHome 
class 
EJB Container 
EJB 
class 
EJB Server 
create() 
Java Advanced Bari, 2002 39 
Antonio Furone 
EJB: Il Client 
private AssOfPsXContrSTLHome home=null; 
private AssOfPsXContrBMP remote = null; 
private AssOfPsXContrBMPPK pk = new AssOfPsXContrBMPPK(); 
… 
Context context=null; 
context = new InitialContext(); // JNDI initial Context (Conn.ne con il servizio di Naming) 
… 
Object object = context.lookup("AssOfPsXContrBMP"); 
home = (AssOfPsXContrBMPHome)PortableRemoteObject.narrow(object, 
AssOfPsXContrBMPHome.class); 
… 
remote= home.create(…);
classes 
lib 
Java Advanced Bari, 2002 40 
Antonio Furone 
Un applicazione web 
<root> 
WEB-INF 
web.xml 
images 
public_html 
… 
<?xml version = '1.0' encoding = 'windows-1252'?> 
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" 
"http://java.sun.com/j2ee/dtds/web-app_2_2.dtd"> 
<web-app> 
<description>….</description> 
<servlet> 
<servlet-name>main</servlet-name> 
<servlet-class>SAMMIT.server.servlet.Main</servlet-class> 
</servlet> 
… 
<servlet-mapping> 
<servlet-name>main</servlet-name> 
<url-pattern>/public_html/main</url-pattern> 
</servlet-mapping> 
… 
<session-config> 
<session-timeout> 
30 
</session-timeout> 
</session-config> 
… 
<welcome-file-list> 
<welcome-file> 
public_html/index.jsp 
</welcome-file> 
</welcome-file-list> 
… 
<taglib> 
<taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri> 
<taglib-location>/WEB-INF/struts-bean.tld</taglib-location> 
</taglib> 
… 
</web-app>
Java Advanced Bari, 2002 41 
Antonio Furone 
Deploy di un applicazione 
 Il deploy di un applicazione viene effettuata sugli application server attraverso 
appositi jar files contenenti (tra l’altro) i descriptor relativi alle applicazioni web 
e agli ejb. 
.war .ear 
.jar
Java Advanced Bari, 2002 42 
Antonio Furone 
ANT 
 E’ un tool per il building delle applicazioni (es. make, gnumake, nmake, jam,…) 
 Differenze con gli altri tool: 
 Configurazione basata su documenti XML 
 E’ possibile creare delle dipendenze (multiple) tra task 
 Estendibile tramite classi java (no shell command) 
 Running 
ant (esecuzione build.xml dalla directory corrente) 
ant –buildfile test.xml 
ant deploy
Java Advanced Bari, 2002 43 
Antonio Furone 
ANT: Esempi 
<target name="prepare" 
description="Creates the build and dist directories" > 
<echo message="Creating the required directories...." /> 
<mkdir dir="${build}/client/${example}" /> 
<mkdir dir="${build}/server/${example}" /> 
<mkdir dir="${build}/shared/${example}" /> 
<mkdir dir="${build}/wsdeploy-generated" /> 
<mkdir dir="dist" /> 
<mkdir dir="${build}/WEB-INF/classes/${example}" /> 
</target> 
<target name="compile-server" depends="prepare" 
description="Compiles the server-side source code"> 
<echo message="Compiling the server-side source code...."/> 
<javac 
srcdir="." 
destdir="${build}/shared" 
includes="*.java" 
excludes="*Client.java" 
/> 
</target> 
<taskdef name="start" classname="org.apache.catalina.ant.StartTask" /> 
… 
<target name="start" 
description="Starts a Web application"> 
<echo message="Starting the application...."/> 
<start 
url="${url}" 
username="${username}" 
password="${password}" 
path="/${context-path}" 
/> 
</target>
Java Advanced Bari, 2002 44 
Antonio Furone 
Web Service 
 E’ un servizio offerto via web (attraverso il protocollo http) 
 In uno scenario tipico : una business application invia una richiesta ad uno 
specifico URL (identifica il servizio) utilizzando il protocollo SOAP. Il WS riceve 
la richiesta, la processa e ritorna un risultato. 
 Tipologie di WS e API utilizzate: 
 Java API for XML-based RPC (JAX-RPC); 
 Java API for XML-messaging (JAXM) : infrastruttura per l’invio di messaggi XML via Web; 
 Java API for XML-registries (JAXR) : infrastruttura utilizzata per il building, il deployment, 
discovery di WS;
Java Advanced Bari, 2002 45 
Antonio Furone 
WS: JAX-RPC
package hello; import java.rmi.Remote; 
import java.rmi.RemoteException; 
public interface HelloIF extends Remote { 
public String sayHello(String s) throws RemoteException; 
} 
Java Advanced Bari, 2002 46 
Antonio Furone 
WS: JAX-RPC 
 Interfaccia 
 Implementazione 
package hello; 
public class HelloImpl implements HelloIF 
{ 
public String message ="Hello"; 
public String sayHello(String s) { return message + s; } 
}
 Client 
try { Stub stub = createProxy(); 
HelloIF hello = (HelloIF)stub; 
System.out.println(hello.sayHello("Duke!")); 
} 
catch (Exception ex) { ex.printStackTrace(); } 
Java Advanced Bari, 2002 47 
Antonio Furone 
WS: JAX-RPC 
 Client: Dinamic Proxy 
try { 
String UrlString = "http://localhost:8080/ProxyHelloWorld.wsdl"; 
String nameSpaceUri = "http://proxy.org/wsdl"; 
String serviceName = "HelloWorld"; 
String portName = "HelloIFPort"; 
URL helloWsdlUrl = new URL(UrlString); 
ServiceFactory serviceFactory = ServiceFactory.newInstance(); 
Service helloService = serviceFactory.createService(helloWsdlUrl, new QName(nameSpaceUri, serviceName)); 
HelloIF myProxy = (HelloIF) helloService.getPort( new QName(nameSpaceUri, portName), proxy.HelloIF.class); 
System.out.println(myProxy.sayHello("Buzz")); 
} 
catch (Exception ex) { ex.printStackTrace(); }
Java Advanced Bari, 2002 48 
Antonio Furone 
Modello MVC 
BROWSER 
JSP/Servlet 
request 
JSP/Servlet 
response 
forward 
bean
Java Advanced Bari, 2002 49 
Antonio Furone 
Framework: STRUTS 
 Progetto open source per lo sviluppo di applicazione web attraverso 
Servlet e JSP 
 Implementazione dell’architettura MVC 
 Funzionalità principali: 
• Dispatching delle request attraverso appropriate Action class 
• Custom Tag Library per il supporto alla creazione form interattive 
• Classi di utility : Parsing XML, Popolamento automatico di JavaBeans, 
Internazionalizzazione, …
Java Advanced Bari, 2002 50 
Antonio Furone 
STRUTS: struts-config.xml 
<struts-config> 
… 
<form-beans> 
<form-bean name="UserList“ type="SAMMIT.server.bo.dati.UserListForm"/> 
… 
</form-beans> 
<action-mappings> 
<action path="/public_html/utenti/UserListAction" 
type="SAMMIT.server.servlet.UserListAction" 
name="UserList" 
scope="session" 
input="/public_html/utenti/userList.jsp"> 
<forward name="ok" 
path="/public_html/utenti/userList.jsp"/> 
<forward name="nok" 
path="/public_html/common/errorPage.jsp"/> 
</action> 
… 
</action-mappings> 
</struts-config>
Java Advanced Bari, 2002 51 
Antonio Furone 
STRUTS: Tag Libraries 
<%@taglib uri="/WEB-INF/struts-html.tld" prefix="html"%> 
<html:form action="/public_html/utenti/UserListAction.do"> 
<html:text property="cognome" size="25" maxlength="30" styleClass="text"/> 
<html:text property="nome" size="25" maxlength="30" styleClass="text"/> 
<html:select property="organizzazione" size="1" styleClass="text"> 
<html:options collection="org_list" property="id” labelProperty="nome"/> 
</html:select> 
… 
<html:button property="ricerca" value="Ricerca" styleClass="button" onclick="on_click_ricerca()"/> 
</html:form> 
…
Java Advanced Bari, 2002 52 
Antonio Furone 
STRUTS: Action 
import org.apache.struts.action.*; 
… 
public class UserListAction extends SMActionBase{ // Action 
public ActionForward perform(ActionMapping mapping, 
ActionForm actionForm, 
HttpServletRequest request, 
HttpServletResponse response 
)throws IOException,ServletException 
{ 
SMTrace.writeTrace("UserListAction.perform()"); 
ActionForward forward=null; 
Vector v=null; 
try 
{v=((UserListForm)actionForm).find();} 
catch (SMException e) 
{ 
request.getSession().setAttribute("exception",e); 
forward=mapping.findForward(SMActionBase.FORWARD_NOK); 
return forward; 
} 
request.getSession().setAttribute("user_list",v); 
forward=mapping.findForward(SMActionBase.FORWARD_OK); 
return forward; 
}
Java Advanced Bari, 2002 53 
Antonio Furone 
STRUTS: ActionForm 
import org.apache.struts.action.*; 
… 
public class UserListForm extends SMFormBase{ // ActionForm 
public void setNome(String nome){…} 
public String getNome(){…} 
…. 
public void reset(ActionMapping mapping, HttpServletRequest request) {} 
public ActionErrors validate(ActionMapping mapping, 
HttpServletRequest request) { 
ActionErrors errors = new ActionErrors(); 
/* 
if ((nome == null) || (username.length() < 1)) 
errors.add("username", new ActionError("error.username.required")); 
… 
*/ 
return errors; 
} 
public Vector find() throws SMException {..} 
}
STRUTS: Advanced (LAYOUT) 
Java Advanced Bari, 2002 54 
Antonio Furone 
<%@taglib uri="/WEB-INF/struts-layout.tld" prefix="layout"%> 
… 
<layout:pager maxPageItems="15" styleClass="pager"> 
<layout:collection id="elem" name="user_list" selectName="uid" selectProperty="uid" 
selectType="radio" styleClass="collection1" styleClass2="collection2" width="100%" align="center"> 
<layout:collectionItem title="UID" property="uid" /> 
<layout:collectionItem title="Cognome" property="cognome" /> 
<layout:collectionItem title="Nome" property="nome"/> 
<layout:collectionItem title="Mail" property="mail"/> 
<layout:collectionItem title="Organizzazione" property="org"/> 
</layout:collection> 
</layout:pager> 
…
Java Advanced Bari, 2002 55 
Antonio Furone 
Documentazione 
JDK 1.4.1 http://plat1a.netsiel.it:8080/jdk141-api/index.html 
J2EE 1.3.1 http://plat1a.netsiel.it:8080/j2ee-api/index.html 
Tomcat http://plat1a.netsiel.it:8080/tomcat-docs/index.html 
JWS Tutorial http://plat1a.netsiel.it:8080/jws-tutorial/index.html 
Struts http://plat1a.netsiel.it:8080/struts-documentation/index.html 
Layout http://plat1a.netsiel.it:8080/struts-layout-doc/index.html

More Related Content

What's hot (10)

Panoramica su Ant
Panoramica su AntPanoramica su Ant
Panoramica su Ant
 
XPages Tips & Tricks, #dd13
XPages Tips & Tricks, #dd13XPages Tips & Tricks, #dd13
XPages Tips & Tricks, #dd13
 
Design Pattern
Design PatternDesign Pattern
Design Pattern
 
RESTful APIs (ITA) - /w WebMachine
RESTful APIs (ITA) - /w WebMachineRESTful APIs (ITA) - /w WebMachine
RESTful APIs (ITA) - /w WebMachine
 
DDive - 8.5.2 Xpages - L'evoluzione continua
DDive - 8.5.2 Xpages - L'evoluzione continuaDDive - 8.5.2 Xpages - L'evoluzione continua
DDive - 8.5.2 Xpages - L'evoluzione continua
 
September 2010 - Gatein
September 2010 - GateinSeptember 2010 - Gatein
September 2010 - Gatein
 
Xamarin.android
Xamarin.androidXamarin.android
Xamarin.android
 
PHP Object Injection
PHP Object InjectionPHP Object Injection
PHP Object Injection
 
Modern web development with python and Web2py
Modern web development with python and Web2pyModern web development with python and Web2py
Modern web development with python and Web2py
 
Inversion of control e Dependency Injection (ITA)
Inversion of control e Dependency Injection (ITA)Inversion of control e Dependency Injection (ITA)
Inversion of control e Dependency Injection (ITA)
 

Viewers also liked (18)

Urbanbot
UrbanbotUrbanbot
Urbanbot
 
Programmazione Funzionale per tutti
Programmazione Funzionale per tuttiProgrammazione Funzionale per tutti
Programmazione Funzionale per tutti
 
Jpnde
JpndeJpnde
Jpnde
 
Google AdWords 101 (Versione Aggiornata)
Google AdWords 101 (Versione Aggiornata)Google AdWords 101 (Versione Aggiornata)
Google AdWords 101 (Versione Aggiornata)
 
Corso di servlet jsp e pattern
Corso di servlet jsp e patternCorso di servlet jsp e pattern
Corso di servlet jsp e pattern
 
Corso c++
Corso c++Corso c++
Corso c++
 
Corso Java 3 - WEB
Corso Java 3 - WEBCorso Java 3 - WEB
Corso Java 3 - WEB
 
Corso web services
Corso web servicesCorso web services
Corso web services
 
Corso Java 2 - AVANZATO
Corso Java 2 - AVANZATOCorso Java 2 - AVANZATO
Corso Java 2 - AVANZATO
 
Corso Java
Corso JavaCorso Java
Corso Java
 
Corso Java 1 - BASE
Corso Java 1 - BASECorso Java 1 - BASE
Corso Java 1 - BASE
 
Corso Java - Introduzione
Corso Java - IntroduzioneCorso Java - Introduzione
Corso Java - Introduzione
 
Eccezioni in java
Eccezioni in javaEccezioni in java
Eccezioni in java
 
Java Web Application Security - Denver JUG 2013
Java Web Application Security - Denver JUG 2013Java Web Application Security - Denver JUG 2013
Java Web Application Security - Denver JUG 2013
 
The Modern Java Web Developer - Denver JUG 2013
The Modern Java Web Developer - Denver JUG 2013The Modern Java Web Developer - Denver JUG 2013
The Modern Java Web Developer - Denver JUG 2013
 
Java programming course for beginners
Java programming course for beginnersJava programming course for beginners
Java programming course for beginners
 
Core java slides
Core java slidesCore java slides
Core java slides
 
Core java complete notes - Contact at +91-814-614-5674
Core java complete notes - Contact at +91-814-614-5674Core java complete notes - Contact at +91-814-614-5674
Core java complete notes - Contact at +91-814-614-5674
 

Similar to Java Advanced

Rich Ajax Web Interfaces in Jquery
Rich Ajax Web Interfaces in JqueryRich Ajax Web Interfaces in Jquery
Rich Ajax Web Interfaces in JqueryAlberto Buschettu
 
breve introduzione a node.js
breve introduzione a node.jsbreve introduzione a node.js
breve introduzione a node.jsnetmeansnet
 
April 2010 - Seam unifies JEE5
April 2010 - Seam unifies JEE5April 2010 - Seam unifies JEE5
April 2010 - Seam unifies JEE5JBug Italy
 
Seam unifies Java EE by Massimiliano Ciccazzo
Seam unifies Java EE by Massimiliano CiccazzoSeam unifies Java EE by Massimiliano Ciccazzo
Seam unifies Java EE by Massimiliano CiccazzoJava User Group Roma
 
Matteo Bicocchi - Introducing HTML5
Matteo Bicocchi - Introducing HTML5Matteo Bicocchi - Introducing HTML5
Matteo Bicocchi - Introducing HTML5Pietro Polsinelli
 
JSP Tag Library
JSP Tag LibraryJSP Tag Library
JSP Tag Libraryjgiudici
 
JSP Tag Library
JSP Tag LibraryJSP Tag Library
JSP Tag Libraryjgiudici
 
JSP Tag Library
JSP Tag LibraryJSP Tag Library
JSP Tag Libraryjgiudici
 
Abusing HTML 5 Client-side Storage
Abusing HTML 5 Client-side StorageAbusing HTML 5 Client-side Storage
Abusing HTML 5 Client-side Storageameft
 
jQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerjQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerMatteo Magni
 
jQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerjQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerMatteo Magni
 
Webbit 2004: Tiger, java
Webbit 2004: Tiger, javaWebbit 2004: Tiger, java
Webbit 2004: Tiger, javaMatteo Baccan
 
Write less do more...with jQuery
Write less do more...with jQueryWrite less do more...with jQuery
Write less do more...with jQueryXeDotNet
 

Similar to Java Advanced (20)

Rich Ajax Web Interfaces in Jquery
Rich Ajax Web Interfaces in JqueryRich Ajax Web Interfaces in Jquery
Rich Ajax Web Interfaces in Jquery
 
breve introduzione a node.js
breve introduzione a node.jsbreve introduzione a node.js
breve introduzione a node.js
 
Java lezione 14
Java lezione 14Java lezione 14
Java lezione 14
 
April 2010 - Seam unifies JEE5
April 2010 - Seam unifies JEE5April 2010 - Seam unifies JEE5
April 2010 - Seam unifies JEE5
 
Seam unifies Java EE by Massimiliano Ciccazzo
Seam unifies Java EE by Massimiliano CiccazzoSeam unifies Java EE by Massimiliano Ciccazzo
Seam unifies Java EE by Massimiliano Ciccazzo
 
Matteo Bicocchi - Introducing HTML5
Matteo Bicocchi - Introducing HTML5Matteo Bicocchi - Introducing HTML5
Matteo Bicocchi - Introducing HTML5
 
JSP Tag Library
JSP Tag LibraryJSP Tag Library
JSP Tag Library
 
JSP Tag Library
JSP Tag LibraryJSP Tag Library
JSP Tag Library
 
JSP Tag Library
JSP Tag LibraryJSP Tag Library
JSP Tag Library
 
SCBCD 1. generic ejb
SCBCD 1. generic ejbSCBCD 1. generic ejb
SCBCD 1. generic ejb
 
Abusing HTML 5 Client-side Storage
Abusing HTML 5 Client-side StorageAbusing HTML 5 Client-side Storage
Abusing HTML 5 Client-side Storage
 
jQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerjQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesigner
 
Xml annessi e connessi
Xml annessi e connessiXml annessi e connessi
Xml annessi e connessi
 
Ddive Xpage852
Ddive Xpage852Ddive Xpage852
Ddive Xpage852
 
Java lezione 15
Java lezione 15Java lezione 15
Java lezione 15
 
jQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerjQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesigner
 
Novità di Asp.Net 4.0
Novità di Asp.Net 4.0Novità di Asp.Net 4.0
Novità di Asp.Net 4.0
 
Webbit 2004: Tiger, java
Webbit 2004: Tiger, javaWebbit 2004: Tiger, java
Webbit 2004: Tiger, java
 
react-it.pdf
react-it.pdfreact-it.pdf
react-it.pdf
 
Write less do more...with jQuery
Write less do more...with jQueryWrite less do more...with jQuery
Write less do more...with jQuery
 

Java Advanced

  • 1. Bari, Dicembre 2002 Java Advanced Java Advanced Antonio Furone
  • 2. Java Advanced Bari, 2002 2 Antonio Furone Contenuti  Advanced API : JDBC, Mailing, Interoperabilità, Log4j  J2EE: JSP, Servlet, EJB, Custom Tag Library, JSTL, EJB  Web Services  ANT  Framework applicativi: Modello MVC,Struts (base e advanced)
  • 3. Java Advanced Bari, 2002 3 Antonio Furone JDBC
  • 4. Java Advanced Bari, 2002 4 Antonio Furone Mailing
  • 5. Java Advanced Bari, 2002 5 Antonio Furone Interoperabilità  Java to COM : J-Integra, Jacob  COM to Java: JavaBeans ActiveX Bridge  WebServices  CORBA
  • 6. Java Advanced Bari, 2002 6 Antonio Furone Interoperabilità: Esempio //Jacob import com.jacob.com.*; import com.jacob.activeX.*; …. private final String ACTIVEX="DENIC.xldap"; private ActiveXComponent activeX_comp=null; private String org_group="o=telecom italia group"; …. activeX_comp = new ActiveXComponent(ACTIVEX); Variant org=new Variant(org_group); Dispatch.call(activeX_comp,"setOrganization", org); …. Variant usr = new Variant(user); Variant psw = new Variant(password); Variant info = new Variant(""); Variant v = Dispatch.call(activeX_comp,"chkUtente0", usr,psw,info); …. Variant usr = new Variant(user); Variant info = new Variant("mail"); Variant v = Dispatch.call(activeX_comp,"getValue", usr,info);
  • 7. Log delle applicazioni (Log4J)  Elementi cardine della libreria: i logger, gli appender, i layout e i livelli  Logger: Componente che il programma utilizza per registrare gli eventi. Sono organizzati ad albero gerarchico la cui radice (log root) può essere recuperata attraverso il metodo statico getInstance();  Appender: Deposito nel quale si possono registrare gli eventi. Esistono diversi tipi di appender, ma i più utili sono quelli basati su file, su console, su DB, mail, socket …  Layout: Forma con la quale vengono registrati i messaggi (Html, Xml, …)  Livelli : Ogni messaggio ha un livello di gravità dell’errore (DEBUG, INFO, WARN, ERROR, FATAL) Java Advanced Bari, 2002 7 Antonio Furone
  • 8. Java Advanced Bari, 2002 8 Antonio Furone Log4J  Esistono due modalità per configurare Log4j all’interno di una applicazione: via codice o attraverso un file di property import org.apache.log4j.PropertyConfigurator; … PropertyConfigurator.configure(“path/to/file.properties”);  File di properties log4j.rootLogger=DEBUG, F1 … log4j.appender.F1=org.apache.log4j.DailyRollingFileAppender log4j.appender.F1.File=detail.log log4j.appender.F1.DatePattern=‘.’yyyy-MM-dd-HH-mm’.log’ log4j.appender.F1.layout=org.apache.log4j.HTMLLayout  Codice import org.apache.log4j.*; … static Logger log=Logger.getRootLogger(); // getLogger(“name”); … log.info(“…start”); log.warn(“…warning”); log.debug(“messaggio di debug”); log.error(“…errore”); log.fatal(“… fatal error”);
  • 9. Java Advanced Bari, 2002 9 Antonio Furone J2EE La piattaforma Java 2
  • 10. Java Advanced Bari, 2002 10 Antonio Furone J2EE: Application Model
  • 11. Java Advanced Bari, 2002 11 Antonio Furone J2EE: Vantaggi  Architettura e sviluppo semplificati • modello di sviluppo basato sui componenti • paradigma “Write Once, Run Anywhere”  Scalabilità • I container forniscono meccanismi che permettono di ottenere un alto livello di scalabilità senza richiedere l’intervento dello sviluppatore • E’ possibile configurare i container in modo che le applicazioni vengano distribuite su più calcolatori (load balancing)  Integrazione di SI preesistenti • La piattaforma include un insieme di API standard per accedere a SI aziendali: JDBC, Java Transaction API, Java Naming and Directory Service, Java Message Service (IBM MQ Series, TIBCO), Java Mail, Java IDL, Connector Architecture  Scelta di server strumenti e componenti • Server sviluppati da più produttori • IDE che facilitano sviluppo, deployment e gestione delle applicazioni • Riuso dei componenti (anche di mercato)  Modello per la sicurezza flessibile
  • 12. Java Advanced Bari, 2002 12 Antonio Furone Java Server Page / Servlet Tecnologia per la costruzione di pagine web con contenuti dinamici <%@ page import=“java.text.*,java.util.*” %> <html> <body> <% Date d=new Date(); String today=DateFormat.getDateInstance().format(d); %> Today is: <em><%=today%></em> </body> </html> Compilazione Servlet public class … extends HttpServlet { public void init(ServletConfig config) throws ServletException {…} public String getServletInfo() {…} protected void doGet(HttpServletRequest request, HttpServletResponse response){…} protected void doPost(HttpServletRequest request, HttpServletResponse response){…} … }
  • 13.  Commenti <%-- Commento JSP --%> Java Advanced Bari, 2002 13 Antonio Furone JSP/Servlet  Dichiarazioni <%! int i=0; %> <%! public void jspInit() {…} %> jspInit() _jspService() jspDestroy() …extends HttpJspBase  Direttive <%@ page import=“java.text.*,java.util.*” buffer=“16k” %> <%@ page include=“copyright.html” %> <%@ page isThreadSafe=“true” %> <%@ page isErrorPage=“false” errorPage=“error.jsp” %> <%@ page isErrorPage=“true” %> <%@ page session=“false” %>  Object Scopes application session request page  Oggetti impliciti request HttpServletRequest response HttpServletResponse pageContext pageContext application ServletContext out JspWriter config ServletConfig page HttpJspPage session HttpSession exception Throwable
  • 14. <% Foo foo=new Foo(); session.putValue(“foo”,foo); %> <% Foo myFoo=(Foo) session.getValue(“foo”); %> Java Advanced Bari, 2002 14 Antonio Furone JSP/Servlet  Gestione della sessione  Utilizzo di bean <jsp:useBean id=“user” class=“com.jguru.Person” scope=“session” /> <jsp:useBean id=“user” class=“com.jguru.Person” scope=“session”> <% user.setDate ….. %> </jsp:useBean> <jsp:getProperty name=“user” property=“name” /> <jsp:setProperty name=“user” property=“name” value=“<%=expression%>” />
  • 15. Java Advanced Bari, 2002 15 Antonio Furone Custom Tag  Le Custom Tag Libraries sono uno strumento messo a disposizione a partire dalle specifiche 1.1 che consentono di costruire contenitori di tag JSP riutilizzabili;  I Custom Tag interagiscono con la pagina e sono utilizzati per incapsulare funzionalità di generazione dinamica di codice HTML;  Una Tag Library è composta da: • Tag Library Descriptor (TLD): documento XML che descrive la libreria; • Tag Handler : classe Java che ne implementa le funzionalità;
  • 16.  TLD <?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd"> Java Advanced Bari, 2002 16 Antonio Furone Custom Tag  Dichiarazione Tag Library (web.xml) <taglib> <taglib-uri>http://www.platnet.it/taglib</taglib-uri> <taglib-location>/WEB-INF/platnet.tld</taglib-location> </taglib> <taglib> <tlibversion>1.0</tlibversion> <jspversion>1.1</jspversion> <shortname>platnetlib</shortname> <uri>http://www.platnet.it/taglib</uri> <info>Plat-net Tag Library</info> <!--Un semplice Tag --> <tag> <name>wellcome</name> <tagclass>SAMMIT.server.tag.Wellcome </tagclass> <!--Body content può avere I seguenti valori: empty: no body JSP: Il contenuto di body è valutato dal container e processato dal Tag Handler tagdependent: : Il contenuto di body viene processato solo dal Tag Handler; il codice JSP contenuto in body non viene valutato dal container . --> <bodycontent>empty</bodycontent> <info> Il classico esempio "Hello World" rivisitato con I Tag. </info> <attribute> <name>name</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib>
  • 17. Java Advanced Bari, 2002 17 Antonio Furone Custom Tag  Tag Handler : per ogni attributo è necessario implementare i metodi get/set … import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; public class Wellcome extends TagSupport { private String name=null; public void setName(String value){ name = value; } public String getName(){ return(name); } // doStartTag viene chiamato dal JSP container quando // il TAG viene trovato. public int doStartTag() { try { JspWriter out = pageContext.getOut(); out.println("<table border="1">"); if (name != null) out.println("<tr><td> Benvenuto/a " + name + "</td></tr>"); else out.println("<tr><td> Benvenuto a chi? </td></tr>"); } catch (Exception ex) { throw new Error(“Si è verificato un errore."); } // Dovrò ritornare SKIP_BODY perché comunque il body è vuoto // come è stato specificato nel file TLD. return SKIP_BODY; } // doEndTag() viene chiamato dal JSP container quando viene // trovato il segno di chiusura del tag public int doEndTag(){ try { JspWriter out = pageContext.getOut(); out.println("</table>"); } catch (Exception ex){ throw new Error(" Si è verificato un errore."); } } }  Utilizzo <%@ taglib uri="http://www.platnet.it/taglib" prefix=“plat" %> <html> <head> <title>Utilizzo Tag</title> </head> <body bgcolor="#ffffff"> <hr /> <plat:wellcome name=“Paperino"/> <hr /> </body> </html>
  • 18. JSP Standard Tag Library (JSTL) Insieme di tag, sviluppati in seno al Java Comunity Process dell’Apache Group, consiste in una collezione di Custom Tag Library, organizzate e suddivise per categorie funzionali. Diverrà standard con la specifica JSP 2.0. Java Advanced Bari, 2002 18 Antonio Furone  Componenti fondamentali http://java.sun.com/products/jsp/jstl/ Libreria URI Namespace Funzionalità core http://java.sun.com/jstl/core c Programmazione XML http://java.sun.com/jstl/xml x XML e XLST processing I18N http://java.sun.com/jstl/fmt fmt Localizzazione RDB access http://java.sun.com/jstl/sql sql Accesso a RDBMS  EL (Expression Language) Linguaggio per l’accesso immediato ad oggetti e loro proprietà all’interno di pagine JSP ${customer.id}$ ${customer.[“id”]}$ ${customer.[propertyName]}$ ${customerList[0]}$
  • 19. Java Advanced Bari, 2002 19 Antonio Furone EL: Operatori Operatore Sinonimo Funzione + Somma - Differenza * Moltiplicazione / div Divisione % mod Modulo == eq Uguaglianza empty Riferimento a null, stringa di lunghezza 0, array o collection privo di elementi != ne Differenza > gt Maggioranza >= ge Maggioranza o uguaglianza < lt Minoranza <= le Minoranza o uguaglianza && and And || or Or ! not Not
  • 20. Java Advanced Bari, 2002 20 Antonio Furone EL: Oggetti Impliciti Oggetto Semantica pageContext Oggetto pageContext corrente pageScope Un vettore associativo le cui chiavi corrispondono ai nomi degli attributi con scope di pagina, ed i cui valori corrispondono ai valori dei rispettivi attributi requestScope “” ma riferito alla richiesta http sessionScope “” ma riferito alla sessione applicationScope “” ma riferito allo scope application param “” ma riferito ai parametri come da ServletRequest.getParameterValues() paramValues “” ma riferito ai parametri sotto forma di String[] header “” ma riferito ai valori dei request header come da HttpServletRequest.getHeader() headerValues cookie “” ma riferito ai cookie (javax.servlet.http.Cookie initParam “” ma riferito ai parametri di inizializzazione come da ServletContext.getInitParameter()
  • 21. Java Advanced Bari, 2002 21 Antonio Furone JSTL:Esempi <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> … <table border="1"> <tr> <td>Contatto</td> </tr> <c:forEach var="contact" items="${addressBook.contacts}$"> <tr> <td> <c:out value="${contact.name}$" /> </td> </tr> </c:forEach> </table> Ogni oggetto definito in uno scope JSP valido (pagina, request, session, application) viene automaticamente riconosciuto e può essere utilizzato nelle espressioni EL.
  • 22. Java Advanced Bari, 2002 22 Antonio Furone JSTL:Esempi <form method="post" name="nodesbyidForm" action="/netview/main"> <input type="hidden" name="action" value="nodesbycatid" /> <select name="catId" onChange="document.nodesbyidForm.submit();" > <c:forEach var="category" items="{informationSystem.allCategories}"> <option value="<c:out value='{category.id}'/>"> <c:out value="{category.desc}" /> </option> </c:forEach> </select> </form> <title>NetView - <c:choose> <c:when test="{action=='allnodes'}"> Tutti i nodi </c:when> <c:when test="{action=='nodesbycatid'}"> Nodi per categoria </c:when> </c:choose> </title> <c:forEach var="node" items="{nodes}"> <tr> <td><a href="/netview/main?action=nodeform&subaction=edit&id=<c:out value='{node.id}' />" title="Modifica"><img src="Open24.gif" border="0" alt="Apri" /></a> </td> <td><a href="javascript:deleteNode(<c:out value='{node.id}' />);" title="Cancella"> <img src="Remove24.gif" alt="Cancella" border="0" /></a> </td> <td><c:out value="{node.id}"/></td> <td><c:out value="{node.desc}"/></td> <td><c:out value="{node.catDesc}"/></td> <td><c:out value="{node.state}"/></td> <td><c:out value="{node.load}"/></td> <td><c:out value="{node.lstRdLoad}"/></td> <td><c:out value="{node.tdsLoad}"/></td> <td><c:out value="{node.building}/{node.floor}/{node.room}"/></td> </tr> </c:forEach>
  • 23. Java Advanced Bari, 2002 23 Antonio Furone EJB: Vantaggi  Semplificazione del processo di sviluppo  Riusabilità del codice e modularità  Robustezza  Gestione automatica di: • transazioni (Commit, Rollback e Recovery); • scalabilità: aumentando l’hw, le prestazioni aumentano in modo lineare; • sicurezza;  Alte prestazioni • bilanciamento dei carichi di lavoro; • caching delle connessioni al database;
  • 24. Java Advanced Bari, 2002 24 Antonio Furone EJB: Esempio Web Server EJB Container Client Servlet DBMS 1 DBMS 2 Shopping Cart Credit Order Transaction Server Begin Commit Application Server
  • 25. Enterprise Bean Instance Java Advanced Bari, 2002 25 Antonio Furone EJB: L’architettura Client EJB Server EJB Container  EJB Server: Application Server  EJB Container: Gestore di EJB
  • 26. Java Advanced Bari, 2002 26 Antonio Furone EJB: Server  Permette di utilizzare i componenti da client remoti  Fornisce ai container i seguenti servizi:  Gestione delle risorse di sistema  Mantenimento dello stato  Gestione/attivazione di processi/thread  Sicurezza  Gestisce le politiche di ottimizzazione delle prestazioni:  Pooling e caching delle connessioni a DB  clustering  fault tollerance  caching dei bean Web Logic - Bea Websphere AS – IBM Orbix – Iona Oracle AS – Oracle JBoss
  • 27. Java Advanced Bari, 2002 27 Antonio Furone EJB: Container  Ospita ed esegue gli EJB Client EJB Container Bean EJB Server home remote
  • 28. Java Advanced Bari, 2002 28 Antonio Furone EJB: Enterprise Bean  E’ il componente vero e proprio  Classe Java specializzata in cui risiede la logica di business dell’applicazione  Deve essere installato (deployment) sull’application server  Fa uso di servizi offerti dall’ambiente di esecuzione EJB: • Transazioni • Sicurezza • Persistenza
  • 29.  Non è persistente  Implementa l’interfaccia javax.ejb.SessionBean  In genere implementa la logica di business dell’applicazione  Può essere stateless o statefull Java Advanced Bari, 2002 29 Antonio Furone EJB: Tipologie  Session Bean  Entity Bean  Oggetto persistente (dati memorizzati su DB)  Consente di mappare una sorgente dati su una classe Java  La lettura modifica di un attributo si traduce nelle corrispondenti operazioni sul DB  Ciascuna istanza è condivisa da più client  Implementa l’interfaccia javax.ejb.EntityBean
  • 30. • Viene creata una sessione 1:1 con uno specifico client • Viene mantenuto lo stato tra l’invocazione di un metodo e un altro • Quando il client si disconnette il componente viene rimosso Java Advanced Bari, 2002 30 Antonio Furone EJB: Session Bean  Stateful  Stateless • Non viene mantenuto alcuno stato tra l’invocazione di un metodo e l’altro • Una stessa istanza del bean può servire contemporaneamente più client (+ performance)
  • 31. Java Advanced Bari, 2002 31 Antonio Furone EJB: Entity Bean  Fornisce i metodi per agire sui dati che esso stesso rappresenta  Ciascuna istanza di un Entity Bean è identificata in modo univoco da una chiave primaria (rappresentata da più campi della tabella): la PrimaryKey  La persistenza dei dati può essere a carico del :  Container: Container Managed Persistence (CMP)  Bean: Bean Managed Persistence (BMP)
  • 32. Java Advanced Bari, 2002 32 Antonio Furone EJB: BMP  L’interfacciamento alle tabelle del DB è cablato all’interno del codice  Lo sviluppatore implementa (tramite JDBC) i metodi di accesso al DB: ejbCreate(), ejbLoad(), ejbStore(), ejbRemove()  Frequenti modifiche al codice in caso di : cambio DB vendor, modifiche allo schema del DB  Possibilità di ottimizzare l’accesso al DB
  • 33. • Genera in automatico il codice SQL per l’accesso alle tabelle del DB • L’accesso ai dati da parte del client si traduce in opportune query sul DB • La modifica dei dati contenuti nel bean si traduce in opportune update sul DB Java Advanced Bari, 2002 33 Antonio Furone EJB: CMP  Accesso al DB completamente gestito dal container:  Meno performanti rispetto ai BMP  EJB più rubusti: meno JDBC implica un gran numero di righe di codice in meno: meno errori
  • 34. EJB: Vista dello sviluppatore EJB Class EJB Container Java Advanced Bari, 2002 34 Antonio Furone EJB Server EJBHome Interface EJBObject Interface EJBHome Class EJBObject Class  Le interfacce EJBHome e EJBObject incapsulano l’accesso all’oggetto vero e proprio  Il deploy descriptor specifica al container gli attributi transazionali e di sicurezza con cui accedere all’oggetto (ejb-jar. xml)
  • 35. Java Advanced Bari, 2002 35 Antonio Furone EJB: Home  Fornisce i metodi per ottere riferimenti ad istanze del componente: create(), find…()  Consente la rimozione di una istanza … import javax.ejb.*; import java.rmi.*; public interface DemoHome extends EJBHome { public Demo create() throws CreateException, RemoteException }
  • 36. Java Advanced Bari, 2002 36 Antonio Furone EJB: Remote  Contiene l’elenco dei metodi che il client può invocare  E’ il container che deve generare il codice (l’implementazione) per questa interfaccia … import javax.ejb.*; import java.rmi.*; public interface Demo extends EJBObject { public String miaFunzione() throws RemoteException; }
  • 37. Java Advanced Bari, 2002 37 Antonio Furone EJB: JavaBean Class  Implementa la logica di business dell’applicazione  Può essere di due tipi EntityBean o SessionBean a seconda dell’interfaccia che implementa  Le interfacce prevedono metodi specifici (invocati esclusivamente dal container) per la gestione della creazione, attivazione, passivazione dei bean stessi import… public class DemoBean implements SessionBean { public void ejbActivate(){… } public void ejbRemove(){… } public void ejbPassivate(){… } public void ejbCreate(){… } public String miaFunzione() throws RemoteException { return new String(“Hello World !”); } } Implementa i metodi della SessionBean Interface Corrisponde alla create() della Home
  • 38. EJB: JavaBean Class (solo per EntityBean)  Incapsula la chiave primaria con cui effettuare la ricerca di specifiche istanza Java Advanced Bari, 2002 38 Antonio Furone  Ogni EntityBean deve avere una Primary Key  La Primary Key deve essere serializzabile public class AssOfPsXContrBMPBean extends AbstractEntityCommonBean implements EntityBean { public EntityContext entityContext; private AssOfPsXContrBMPPK pk; public AssOfPsXContrBMPPK ejbCreate(…) throws CreateException, RemoteException, CustomEJBException { pk=new AssOfPsXContrBMPPK(); …. return pk; } public void ejbPostCreate(…) {} public AssOfPsXContrBMPPK ejbFindByPrimaryKey(AssOfPsXContrBMPPK primaryKey) throws FinderException, RemoteException {} public Collection ejbFindAll(…) throws FinderException, RemoteException {} }  Tutti i metodi find…() (es. findByName()) ritornano collection di Primary Key
  • 39. Client EJBHome class EJB Container EJB class EJB Server create() Java Advanced Bari, 2002 39 Antonio Furone EJB: Il Client private AssOfPsXContrSTLHome home=null; private AssOfPsXContrBMP remote = null; private AssOfPsXContrBMPPK pk = new AssOfPsXContrBMPPK(); … Context context=null; context = new InitialContext(); // JNDI initial Context (Conn.ne con il servizio di Naming) … Object object = context.lookup("AssOfPsXContrBMP"); home = (AssOfPsXContrBMPHome)PortableRemoteObject.narrow(object, AssOfPsXContrBMPHome.class); … remote= home.create(…);
  • 40. classes lib Java Advanced Bari, 2002 40 Antonio Furone Un applicazione web <root> WEB-INF web.xml images public_html … <?xml version = '1.0' encoding = 'windows-1252'?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd"> <web-app> <description>….</description> <servlet> <servlet-name>main</servlet-name> <servlet-class>SAMMIT.server.servlet.Main</servlet-class> </servlet> … <servlet-mapping> <servlet-name>main</servlet-name> <url-pattern>/public_html/main</url-pattern> </servlet-mapping> … <session-config> <session-timeout> 30 </session-timeout> </session-config> … <welcome-file-list> <welcome-file> public_html/index.jsp </welcome-file> </welcome-file-list> … <taglib> <taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri> <taglib-location>/WEB-INF/struts-bean.tld</taglib-location> </taglib> … </web-app>
  • 41. Java Advanced Bari, 2002 41 Antonio Furone Deploy di un applicazione  Il deploy di un applicazione viene effettuata sugli application server attraverso appositi jar files contenenti (tra l’altro) i descriptor relativi alle applicazioni web e agli ejb. .war .ear .jar
  • 42. Java Advanced Bari, 2002 42 Antonio Furone ANT  E’ un tool per il building delle applicazioni (es. make, gnumake, nmake, jam,…)  Differenze con gli altri tool:  Configurazione basata su documenti XML  E’ possibile creare delle dipendenze (multiple) tra task  Estendibile tramite classi java (no shell command)  Running ant (esecuzione build.xml dalla directory corrente) ant –buildfile test.xml ant deploy
  • 43. Java Advanced Bari, 2002 43 Antonio Furone ANT: Esempi <target name="prepare" description="Creates the build and dist directories" > <echo message="Creating the required directories...." /> <mkdir dir="${build}/client/${example}" /> <mkdir dir="${build}/server/${example}" /> <mkdir dir="${build}/shared/${example}" /> <mkdir dir="${build}/wsdeploy-generated" /> <mkdir dir="dist" /> <mkdir dir="${build}/WEB-INF/classes/${example}" /> </target> <target name="compile-server" depends="prepare" description="Compiles the server-side source code"> <echo message="Compiling the server-side source code...."/> <javac srcdir="." destdir="${build}/shared" includes="*.java" excludes="*Client.java" /> </target> <taskdef name="start" classname="org.apache.catalina.ant.StartTask" /> … <target name="start" description="Starts a Web application"> <echo message="Starting the application...."/> <start url="${url}" username="${username}" password="${password}" path="/${context-path}" /> </target>
  • 44. Java Advanced Bari, 2002 44 Antonio Furone Web Service  E’ un servizio offerto via web (attraverso il protocollo http)  In uno scenario tipico : una business application invia una richiesta ad uno specifico URL (identifica il servizio) utilizzando il protocollo SOAP. Il WS riceve la richiesta, la processa e ritorna un risultato.  Tipologie di WS e API utilizzate:  Java API for XML-based RPC (JAX-RPC);  Java API for XML-messaging (JAXM) : infrastruttura per l’invio di messaggi XML via Web;  Java API for XML-registries (JAXR) : infrastruttura utilizzata per il building, il deployment, discovery di WS;
  • 45. Java Advanced Bari, 2002 45 Antonio Furone WS: JAX-RPC
  • 46. package hello; import java.rmi.Remote; import java.rmi.RemoteException; public interface HelloIF extends Remote { public String sayHello(String s) throws RemoteException; } Java Advanced Bari, 2002 46 Antonio Furone WS: JAX-RPC  Interfaccia  Implementazione package hello; public class HelloImpl implements HelloIF { public String message ="Hello"; public String sayHello(String s) { return message + s; } }
  • 47.  Client try { Stub stub = createProxy(); HelloIF hello = (HelloIF)stub; System.out.println(hello.sayHello("Duke!")); } catch (Exception ex) { ex.printStackTrace(); } Java Advanced Bari, 2002 47 Antonio Furone WS: JAX-RPC  Client: Dinamic Proxy try { String UrlString = "http://localhost:8080/ProxyHelloWorld.wsdl"; String nameSpaceUri = "http://proxy.org/wsdl"; String serviceName = "HelloWorld"; String portName = "HelloIFPort"; URL helloWsdlUrl = new URL(UrlString); ServiceFactory serviceFactory = ServiceFactory.newInstance(); Service helloService = serviceFactory.createService(helloWsdlUrl, new QName(nameSpaceUri, serviceName)); HelloIF myProxy = (HelloIF) helloService.getPort( new QName(nameSpaceUri, portName), proxy.HelloIF.class); System.out.println(myProxy.sayHello("Buzz")); } catch (Exception ex) { ex.printStackTrace(); }
  • 48. Java Advanced Bari, 2002 48 Antonio Furone Modello MVC BROWSER JSP/Servlet request JSP/Servlet response forward bean
  • 49. Java Advanced Bari, 2002 49 Antonio Furone Framework: STRUTS  Progetto open source per lo sviluppo di applicazione web attraverso Servlet e JSP  Implementazione dell’architettura MVC  Funzionalità principali: • Dispatching delle request attraverso appropriate Action class • Custom Tag Library per il supporto alla creazione form interattive • Classi di utility : Parsing XML, Popolamento automatico di JavaBeans, Internazionalizzazione, …
  • 50. Java Advanced Bari, 2002 50 Antonio Furone STRUTS: struts-config.xml <struts-config> … <form-beans> <form-bean name="UserList“ type="SAMMIT.server.bo.dati.UserListForm"/> … </form-beans> <action-mappings> <action path="/public_html/utenti/UserListAction" type="SAMMIT.server.servlet.UserListAction" name="UserList" scope="session" input="/public_html/utenti/userList.jsp"> <forward name="ok" path="/public_html/utenti/userList.jsp"/> <forward name="nok" path="/public_html/common/errorPage.jsp"/> </action> … </action-mappings> </struts-config>
  • 51. Java Advanced Bari, 2002 51 Antonio Furone STRUTS: Tag Libraries <%@taglib uri="/WEB-INF/struts-html.tld" prefix="html"%> <html:form action="/public_html/utenti/UserListAction.do"> <html:text property="cognome" size="25" maxlength="30" styleClass="text"/> <html:text property="nome" size="25" maxlength="30" styleClass="text"/> <html:select property="organizzazione" size="1" styleClass="text"> <html:options collection="org_list" property="id” labelProperty="nome"/> </html:select> … <html:button property="ricerca" value="Ricerca" styleClass="button" onclick="on_click_ricerca()"/> </html:form> …
  • 52. Java Advanced Bari, 2002 52 Antonio Furone STRUTS: Action import org.apache.struts.action.*; … public class UserListAction extends SMActionBase{ // Action public ActionForward perform(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response )throws IOException,ServletException { SMTrace.writeTrace("UserListAction.perform()"); ActionForward forward=null; Vector v=null; try {v=((UserListForm)actionForm).find();} catch (SMException e) { request.getSession().setAttribute("exception",e); forward=mapping.findForward(SMActionBase.FORWARD_NOK); return forward; } request.getSession().setAttribute("user_list",v); forward=mapping.findForward(SMActionBase.FORWARD_OK); return forward; }
  • 53. Java Advanced Bari, 2002 53 Antonio Furone STRUTS: ActionForm import org.apache.struts.action.*; … public class UserListForm extends SMFormBase{ // ActionForm public void setNome(String nome){…} public String getNome(){…} …. public void reset(ActionMapping mapping, HttpServletRequest request) {} public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) { ActionErrors errors = new ActionErrors(); /* if ((nome == null) || (username.length() < 1)) errors.add("username", new ActionError("error.username.required")); … */ return errors; } public Vector find() throws SMException {..} }
  • 54. STRUTS: Advanced (LAYOUT) Java Advanced Bari, 2002 54 Antonio Furone <%@taglib uri="/WEB-INF/struts-layout.tld" prefix="layout"%> … <layout:pager maxPageItems="15" styleClass="pager"> <layout:collection id="elem" name="user_list" selectName="uid" selectProperty="uid" selectType="radio" styleClass="collection1" styleClass2="collection2" width="100%" align="center"> <layout:collectionItem title="UID" property="uid" /> <layout:collectionItem title="Cognome" property="cognome" /> <layout:collectionItem title="Nome" property="nome"/> <layout:collectionItem title="Mail" property="mail"/> <layout:collectionItem title="Organizzazione" property="org"/> </layout:collection> </layout:pager> …
  • 55. Java Advanced Bari, 2002 55 Antonio Furone Documentazione JDK 1.4.1 http://plat1a.netsiel.it:8080/jdk141-api/index.html J2EE 1.3.1 http://plat1a.netsiel.it:8080/j2ee-api/index.html Tomcat http://plat1a.netsiel.it:8080/tomcat-docs/index.html JWS Tutorial http://plat1a.netsiel.it:8080/jws-tutorial/index.html Struts http://plat1a.netsiel.it:8080/struts-documentation/index.html Layout http://plat1a.netsiel.it:8080/struts-layout-doc/index.html