Java Advanced
-
Upload
antonio-furone -
Category
Software
-
view
142 -
download
5
Transcript of Java Advanced
Bari, Dicembre 2002
Java Advanced
Antonio Furone
Java Advanced
2Antonio Furone
Java Advanced Bari, 2002
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)
3Antonio Furone
Java Advanced Bari, 2002
JDBC
4Antonio Furone
Java Advanced Bari, 2002
Mailing
5Antonio Furone
Java Advanced Bari, 2002
Interoperabilità
Java to COM : J-Integra, Jacob
COM to Java: JavaBeans ActiveX Bridge
WebServices
CORBA
6Antonio Furone
Java Advanced Bari, 2002
Interoperabilità: Esempio
//Jacobimport 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);
7Antonio Furone
Java Advanced Bari, 2002
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)
8Antonio Furone
Java Advanced Bari, 2002
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.DailyRollingFileAppenderlog4j.appender.F1.File=detail.loglog4j.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”);
9Antonio Furone
Java Advanced Bari, 2002
J2EELa piattaforma Java 2
10Antonio Furone
Java Advanced Bari, 2002
J2EE: Application Model
11Antonio Furone
Java Advanced Bari, 2002
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
12Antonio Furone
Java Advanced Bari, 2002
Java Server Page / ServletTecnologia 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>
<%@ 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
ServletServlet
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){…}… }
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){…}… }
13Antonio Furone
Java Advanced Bari, 2002
JSP/Servlet Dichiarazioni
<%! int i=0; %><%! public void jspInit() {…} %>
jspInit()jspInit()
_jspService()_jspService()
jspDestroy()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
<%-- Commento JSP --%> Commenti
application
session
request
page
Oggetti impliciti
request HttpServletRequest
response HttpServletResponse
pageContext pageContext
application ServletContext
out JspWriter
config ServletConfig
page HttpJspPage
session HttpSession
exception Throwable
14Antonio Furone
Java Advanced Bari, 2002
JSP/Servlet Gestione della sessione
Utilizzo di bean
<%Foo foo=new Foo();session.putValue(“foo”,foo);%>
<%Foo myFoo=(Foo) session.getValue(“foo”); %>
<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%>” />
15Antonio Furone
Java Advanced Bari, 2002
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à;
16Antonio Furone
Java Advanced Bari, 2002
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>
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">
<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 Handlertagdependent: : 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>
17Antonio Furone
Java Advanced Bari, 2002
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>
18Antonio Furone
Java Advanced Bari, 2002
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.
Componenti fondamentalihttp://java.sun.com/products/jsp/jstl/
Libreria URI Namespace Funzionalità
core http://java.sun.com/jstl/core c Programmazione
XML processing
http://java.sun.com/jstl/xml x XML e XLST
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]}$
19Antonio Furone
Java Advanced Bari, 2002
EL: OperatoriOperatore 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
20Antonio Furone
Java Advanced Bari, 2002
EL: Oggetti ImplicitiOggetto 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()
21Antonio Furone
Java Advanced Bari, 2002
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.
22Antonio Furone
Java Advanced Bari, 2002
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>
<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>
<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>
<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>
23Antonio Furone
Java Advanced Bari, 2002
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;
24Antonio Furone
Java Advanced Bari, 2002
EJB: Esempio
Web Server EJB Container
ClientClient ServletServlet
DBMS 1DBMS 1
DBMS 2DBMS 2
ShoppingCart
ShoppingCart
CreditCredit
OrderOrder
TransactionServer
TransactionServer
BeginCommit
Application Server
25Antonio Furone
Java Advanced Bari, 2002
EJB: L’architettura
ClientClient
EJB Server
EJB Container
EnterpriseBean
Instance
EJB Server: Application Server
EJB Container: Gestore di EJB
26Antonio Furone
Java Advanced Bari, 2002
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 - BeaWebsphere AS – IBMOrbix – IonaOracle AS – OracleJBoss
27Antonio Furone
Java Advanced Bari, 2002
EJB: Container Ospita ed esegue gli EJB
ClientClient
EJB Container
Bean
EJB Server
home
remote
28Antonio Furone
Java Advanced Bari, 2002
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
29Antonio Furone
Java Advanced Bari, 2002
EJB: Tipologie Session Bean
Entity Bean
Non è persistente
Implementa l’interfaccia javax.ejb.SessionBean
In genere implementa la logica di business dell’applicazione
Può essere stateless o statefull
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
30Antonio Furone
Java Advanced Bari, 2002
EJB: Session Bean
Stateful
Stateless
• 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
• 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)
31Antonio Furone
Java Advanced Bari, 2002
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)
32Antonio Furone
Java Advanced Bari, 2002
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
33Antonio Furone
Java Advanced Bari, 2002
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
• 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
34Antonio Furone
Java Advanced Bari, 2002
EJB: Vista dello sviluppatore
EJB Server
EJB Container
EJB Class
EJB
Ho
me
Interface
EJB
Ob
jectIn
terface
EJB
Ho
me
Class
EJB
Ob
jectC
lass
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)
35Antonio Furone
Java Advanced Bari, 2002
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
}
…import javax.ejb.*;import java.rmi.*;
public interface DemoHome extends EJBHome{
public Demo create() throws CreateException,RemoteException
}
36Antonio Furone
Java Advanced Bari, 2002
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;}
…import javax.ejb.*;import java.rmi.*;
public interface Demo extends EJBObject{
public String miaFunzione() throws RemoteException;}
37Antonio Furone
Java Advanced Bari, 2002
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 !”);}
}
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 dellaSessionBean Interface
Corrisponde alla create() dellaHome
38Antonio Furone
Java Advanced Bari, 2002
EJB: JavaBean Class (solo per EntityBean) Incapsula la chiave primaria con cui effettuare la ricerca di specifiche istanza
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
39Antonio Furone
Java Advanced Bari, 2002
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(…);
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(…);
ClientClient
EJB Container
EJBclass
EJB Server
EJBHomeclass
create()
40Antonio Furone
Java Advanced Bari, 2002
Un applicazione web<root><root>
WEB-INFWEB-INF
web.xmlweb.xml
liblib
classesclasses
imagesimages
public_htmlpublic_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>
<?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>
41Antonio Furone
Java Advanced Bari, 2002
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.war .ear.ear
.jar.jar
42Antonio Furone
Java Advanced Bari, 2002
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.xmlant deploy
43Antonio Furone
Java Advanced Bari, 2002
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="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>
<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>
<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>
44Antonio Furone
Java Advanced Bari, 2002
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;
45Antonio Furone
Java Advanced Bari, 2002
WS: JAX-RPC
46Antonio Furone
Java Advanced Bari, 2002
WS: JAX-RPC Interfaccia
Implementazione
package hello; import java.rmi.Remote;import java.rmi.RemoteException; public interface HelloIF extends Remote { public String sayHello(String s) throws RemoteException;}
package hello; public class HelloImpl implements HelloIF { public String message ="Hello"; public String sayHello(String s) { return message + s; } }
47Antonio Furone
Java Advanced Bari, 2002
WS: JAX-RPC
Client: Dinamic Proxy
Client
try { Stub stub = createProxy(); HelloIF hello = (HelloIF)stub; System.out.println(hello.sayHello("Duke!")); } catch (Exception ex) { ex.printStackTrace(); }
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(); }
48Antonio Furone
Java Advanced Bari, 2002
Modello MVC
BR
OW
SE
R
JSP/ServletJSP/Servletrequest
JSP/ServletJSP/Servletresponse
forward
beanbean
49Antonio Furone
Java Advanced Bari, 2002
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, …
50Antonio Furone
Java Advanced Bari, 2002
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>
51Antonio Furone
Java Advanced Bari, 2002
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>
…
<%@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>
…
52Antonio Furone
Java Advanced Bari, 2002
STRUTS: Actionimport 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; }
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; }
53Antonio Furone
Java Advanced Bari, 2002
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 {..}}
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 {..}}
54Antonio Furone
Java Advanced Bari, 2002
STRUTS: Advanced (LAYOUT) <%@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>…
<%@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>…
55Antonio Furone
Java Advanced Bari, 2002
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