55
Bari, Dicembre 2002 Java Advanced Antonio Furone Java Advanced

Java Advanced

Embed Size (px)

Citation preview

Page 1: Java Advanced

Bari, Dicembre 2002

Java Advanced

Antonio Furone

Java Advanced

Page 2: 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)

Page 3: Java Advanced

3Antonio Furone

Java Advanced Bari, 2002

JDBC

Page 4: Java Advanced

4Antonio Furone

Java Advanced Bari, 2002

Mailing

Page 5: Java Advanced

5Antonio Furone

Java Advanced Bari, 2002

Interoperabilità

Java to COM : J-Integra, Jacob

COM to Java: JavaBeans ActiveX Bridge

WebServices

CORBA

Page 6: Java Advanced

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);

Page 7: Java Advanced

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)

Page 8: Java Advanced

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”);

Page 9: Java Advanced

9Antonio Furone

Java Advanced Bari, 2002

J2EELa piattaforma Java 2

Page 10: Java Advanced

10Antonio Furone

Java Advanced Bari, 2002

J2EE: Application Model

Page 11: Java Advanced

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

Page 12: Java Advanced

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){…}… }

Page 13: Java Advanced

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

Page 14: Java Advanced

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%>” />

Page 15: Java Advanced

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à;

Page 16: Java Advanced

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>

Page 17: Java Advanced

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>

Page 18: Java Advanced

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]}$

Page 19: Java Advanced

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

Page 20: Java Advanced

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()

Page 21: Java Advanced

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.

Page 22: Java Advanced

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>

Page 23: Java Advanced

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;

Page 24: Java Advanced

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

Page 25: Java Advanced

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

Page 26: Java Advanced

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

Page 27: Java Advanced

27Antonio Furone

Java Advanced Bari, 2002

EJB: Container Ospita ed esegue gli EJB

ClientClient

EJB Container

Bean

EJB Server

home

remote

Page 28: Java Advanced

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

Page 29: Java Advanced

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

Page 30: Java Advanced

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)

Page 31: Java Advanced

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)

Page 32: Java Advanced

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

Page 33: Java Advanced

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

Page 34: Java Advanced

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)

Page 35: Java Advanced

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

}

Page 36: Java Advanced

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;}

Page 37: Java Advanced

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

Page 38: Java Advanced

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

Page 39: Java Advanced

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()

Page 40: Java Advanced

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>

Page 41: Java Advanced

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

Page 42: Java Advanced

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

Page 43: Java Advanced

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>

Page 44: Java Advanced

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;

Page 45: Java Advanced

45Antonio Furone

Java Advanced Bari, 2002

WS: JAX-RPC

Page 46: Java Advanced

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; } }

Page 47: Java Advanced

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(); }

Page 48: Java Advanced

48Antonio Furone

Java Advanced Bari, 2002

Modello MVC

BR

OW

SE

R

JSP/ServletJSP/Servletrequest

JSP/ServletJSP/Servletresponse

forward

beanbean

Page 49: Java Advanced

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, …

Page 50: Java Advanced

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>

Page 51: Java Advanced

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>

Page 52: Java Advanced

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; }

Page 53: Java Advanced

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 {..}}

Page 54: Java Advanced

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>…

Page 55: Java Advanced

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