1 documents > j2se apis > j2ee apisj2se apisj2ee apis

Post on 04-Apr-2015

115 Views

Category:

Documents

2 Downloads

Preview:

Click to see full reader

TRANSCRIPT

1

Documents

http://ltiwww.epfl.ch/ProgrammationInternet> J2SE APIs > J2EE APIs

http://ltiwww.epfl.ch/WebLang>  Bibliographical references> Description of All Components

2

Applications Web

3

JavaJavascript

JSPtaglib

XML

RMI

Struts

HTML

MDBean

Entity BeanServlet

Cookie

Visual Age

Eclipse

Tomcat

JBoss

ant

CVSWebsphere

Weblogic

php

.net

MySQL

JDOHybernate

J2EE

http://www.topjobs.ch/Rechercher: J2EE, PHP, Apache

JSF

4

LAMP (pas présenté)

Browser

PHP<html> <head>  <title>Test PHP</title> </head> <body> <?php echo ‘Bonjour '; ?></body></html>

Network

ClientServer

DB

Linux, Apache, MySQL, PHP

5

JBossTomcat

Application Web sur J2EE

EntityEJB

Browser EntityEJB

SessionEJB

x.htmlNetwork

Client

Server

DB

Servlet

proxy

proxy

proxy

6

Pages HTML et Servlettes

Livre Software EngineeringSections 7.5, 7.7

7

Page HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

    <head>

        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

        <title>Tests/test</title>

        <script type="text/javascript">

         function init() { // Javascript

             alert("Bonjour")

         }

       </script>

    </head>

    <body onload="init()">

Contenu de la page

    </body>

</html>

8

Elements HTML

        <h1>Un grand titre</h1>

        <p>Un paragraphe</p>

        <table cellspacing="6" cellpadding="6" 

border="1" bgcolor="yellow">

            <tr>

                <td bgcolor="#FFE0E0">

ligne1 <br>

 colonne 1</td>

                <td bgcolor="#E0E0FF">

ligne1, colonne 2</td>

            </tr>

        </table>

9

Elements actifs dans une form

        <form method="get" name="record" action="http://localhost:8080/xxxx">

            <input type="text" name="txInput1"/> <br>

            <input type="text" name="txInput2" value="initial"/>

            <input type="button" name="something" value="button"/>

            <input type="checkbox" name="checkB1" value="aaa"/>AAA

            <input type="checkbox" name="checkB2" value="bbb"/>BBB

            <input type="radio" name="radioB" value="ccc"/>CCC

            <input type="radio" name="radioB" value="ddd"/>DDD

10

Sélections            <p>

                <select name="simpleSelection">

                    <option value="eee">EEE

                    </option>

                    <option value="fff">FFF

                    </option>

                </select>

            </p>

            <p>

                <select multiple name="multipleSelection">

                    <option value="hhh">HHH

                    </option>

                    <option value="jjj">JJJ

                    </option>

                </select>

            </p>

11

Autres éléments            <p><input type="hidden" name="myValue" value="not_seen"/>            </p>            <p>                <textarea name="thetext" rows="8" cols="80">                    ha ! ha ! ha !                </textarea>            </p>            <p>                <button name="button" value="button" type="button"/> Click<br>                 <img width="100" src="green.gif“ alt="wow"> </button>            </p>            <p><input type="submit" name="button"/>  <input type="reset"/>            </p>        </form>

12

Form

       <form method="get" name="record" action="http://localhost:8080/xxxx">

. . . elements des pages précédentes . . .

        </form>

Envoyé au serveur (une seule ligne)

http://localhost:8080/xxxx?txInput1=

&txInput2=initial

&simpleSelection=eee

&myValue=not_seen

&thetext=+++++ha+!+ha+!+ha+!%0D%0A++

&button=Envoyer

13

Upload de fichiers

        <form method="post" name="upform" 

action="http://localhost:8080/check"

             enctype="multipart/form-data">

            <input type="file" name="uploading"/>

            <input type="submit"/>

        </form>

14

HTML: Test.html

Tomcat, Apache . . .(serveur)

Browser(client)

Accès au serveur HTML

<A HREF="URL">link</a>

Internet

15

Servlet

• Objet généralisé• Possède une méthode doGet• Est exécuté dans un serveur Web• Appelé par un browser

Browser ServletdoGet() { …}

Serveur Web

URL avec paramètres

16

Servletqui lit les données entrées dans des champs

Bouton submit

17

Formulaire HTML

<form action=“http://localhost:8080/test">

<input type=“submit” name=“add“>

<input type=“text” name=“val">

</form>

18

Formulaire HTML

(Paragraphe 7.5.2)

<form action=“http://localhost:8080/test">

add: <input type=“submit” name=“add"> <p> val: <input type=“text” name=“val">

</form>

19

HTML page

<form action="URL"> <input type = "text" name="field"></form>

servlet: Test.java

Serveur JBossBrowser

Appeler une servlette

Internet

page HTML

Exécutionde Java

20

Servlette: traitement des données

public class Test extends HttpServlet {

public void doGet ( HttpServletRequest request,

HttpServletResponse response )

throws ServletException, IOException {

PrintWriter out = response.getWriter();

response.setContentType("text/html");

out.println ("<html><body>");

out.println ("<h1>Title</h1></body>");

}

} La page html est produite automatiquement quand la méthode se termine.

Javadoc J2EE

22

Décodage d’un paramètre dans une servlette(voir J2EE Javadoc)

<input type = text name = "txtInp">

yyy

Servlette

<form action="http:www.epfl.ch/servletName//">

http://www.epfl.ch/servletName?txtInp=yyy

23

Décodage d’un paramètre dans une servlette(voir J2EE Javadoc)

valueParam = request.getParameter("txtInp"); dans la servlette

valueParam.equals("yyy") Java

http://www.epfl.ch/servletName?txtInp=yyy

Navigateur

24

Production du contenu d’une page HTMLpar une servlette

java.io.PrintWriter out = response.getWriter();

out.println(“<h1>Titre</h1>”);

25

WebLang

Crée les sources des composants, les fichiers auxiliaires et les fichiers ant

26

Fichier .cg

@@deploypath="C:/jboss-4.2.3.GA/server/default/deploy/"

servlet SomeServlet {

package servletPack;

public void someCall (PrintWriter out,

String name,

double number) {

out.println(name + " " + number);

}

}

http://ltiwww.epfl.ch/WebLang/Modules.html#servlets

27

Module servlet en WebLang

servlet TestServlet {

package packageName;

int attribute; // dangereux

public void add ( PrintWriter out, int number) { attribute += number; out.println(attribute); }

public void sub (int number) {

attribute = number; }}

determine la form HTML

28

WebLang génère les fichiers:

servlet: Test.java

doGet() { . . .}

m1(int a, String b) { ... } m2(String c, long d) { ... }

html: InputForms

<FORM action= "test">ab

m1

cb

m2

29

Avec plus de détails

servlette: Test.java

doGet() { a = getParameters(“a”); m1(a, b); or m2(c, d); }

m1(int a, String b) { ... } m2(String c, long d) { ... }

html: InputForms

<form action= "test"> <input ... name="a"> <input ... name="b"> <submit name="m1"></form>

<form action= "test"> <input ... name="c"> <input ... name="b"> <submit name="m2"></form>

30

Préparation et chargement d’une servlette

Serveur

web.xmlmyServlet.javamyPage.html

Navigateur

Eclipsefichier.cg CodeGenmyServlet.java@webdoGet() { }

xdoclet packagingweb.xml projet.ear

WebLang

31

bouton droit de la souris

Compilation d’un fichier.cg

32

Déploiement d’un projet

WebLang

Run As… > CGxdoclet.xml

Run As… > CGpackaging.xml

33

Démarrer le serveur JBoss

http://ltiwww.epfl.ch/WebLang/JBossInit

Il est possible de gérer le serveur JBoss, ou d’autres serveurs à partir d’Eclipse. Les manipulations de préparation sont présentées ci-dessous.

Ces manipulations préparent en même temps les librairies nécessaires aux projets J2EE

34

Nettoyer les programmes dans JBoss

Eliminez les programmes et structures laissés par l'étudiant précédent.

Pensez à le faire dans les leçons suivantes également !

1. Effacez les répertoires tmp, data, log et work qui se trouvent dans C:\jboss-4.2.3.GA\server\default

2. Effacez tous les fichiers se terminant par .ear (pour archive) ou .war se trouvant dans C:\jboss-4.2.3.GA\server\default\deploy

Pour arrêter JBoss, cliquer le carré rouge dans la fenêtre serveur et attendez qu’il se termine!

35

Singleton (pour l’exercice)

public class BD { private static BD localBD = null;

public static BD getBD() {if (localBD==null) {

localBD = new BD();}return localBD;

}

private String name; // autres paramètres}

// utilisationBD.getBD().list();

Une seule instanciation, à la première utilisation.

36

Définition d’une classe en WebLang

class MyClass { package aPackage; import java.util; access remote; // optional, default is local outputchannel myCh (queue, A); // future Bean bean; public void aMethod() throws Exception { System.out.println("a method called"); Bean b = beanHome.create(); // future b.method(); }}

Génère une classe habituelle et introduit les références et fonctions qui permettront de la charger dans le serveur.

37

Affichage pour dépanner

System.out.print(“xxx”);

affiche ses sorties dans la console d’Eclipse

38

Exercice 1: une application Web

Singleton

(à la place d’une base de données)

Servlet

store(String x)list()quit()

Page HTML

entrée

Servlet

login()cancel()

correct

nom incorrect

Page HTML

entrée

transition entre états

introduction de données

39

Structure et scripts d’un projet JEE

40

Structure d’un projet JEE

servlets

librairies JEE

fichier d’appel de tous les objets générés

fichiers d’appel des méthodes des servlets

JSP

définition des servlets

scripts ant de préparation

tout est génére à partir de ce fichier

41

xDoclets

Outil standard pour créer une partie des fichiers indiqués dans les pages précé-dentes

http://xdoclet.sourceforge.net/xdoclet/index.html

42

xDoclet crée le fichier web.xml

import javax.rmi.PortableRemoteObject; . . ./** * @web.servlet * name = "MyServletServlet" * display-name = "TestServlet" * description = "A simple Servlet" * @web.servlet-mapping * url-pattern = "/MyServlet" */public class TestServlet extends HttpServlet {

public void doGet (HttpServletRequest request, . . .

43

Script ant pour appeler XDocletgénéré automatiquement par WebLang

<?xml version="1.0" encoding="UTF-8" ?> <project default="N2" name="XDoclet Generator">

<path id="xdoclet.classpath"><pathelement location="C:/jboss-4.0.4.GA/server/default/lib/javax.servlet.jar"/> <fileset dir="C:\eclipse\xdoclet_lib/">

<include name="*.jar" /> </fileset>

</path><target name="N2" description="Servlet/Taglib">

<taskdef classpathref="xdoclet.classpath“ classname="xdoclet.modules.web.WebDocletTask“

name="webdoclet" /> <webdoclet destDir="WEB-INF" verbose="true" mergeDir="WEB-INF/merge">

<fileset dir="src"> <include name="package/AServlet.java" /> </fileset> <deploymentdescriptor Servletspec="2.3" />

</webdoclet></target>

</project>

44

<servlet> <servlet-name>MyServletServlet</servlet-name> <display-name>MyServlet</display-name> <description><![CDATA[A simple Servlet]]></description> <servlet-class>serv.MyServlet</servlet-class></servlet>

<servlet-mapping> <servlet-name>MyServletServlet</servlet-name> <url-pattern>/MyServlet</url-pattern></servlet-mapping>

<!-- look for "servlet-name" tutorial in Google! -->

Contenu de web.xml généré automatiquement par xdoclet

45

CGPackaging.xml<!--********************WEB class*******************--> <target name="WEB" description="Lecon3.war"> <jar destfile="lib/Lecon3.war"> <zipfileset dir="WebContent/WEB-INF" prefix="WEB-INF"> <include name="*.xml"/> <include name="*.wsdd"/> </zipfileset> <zipfileset dir="WebContent/WEB-INF/lib" prefix="WEB-INF/lib" includes="**/*.jar"/> <zipfileset dir="bin" prefix="WEB-INF/classes"> <include name="applicationWeb/Login*.class"/> <include name="applicationWeb/Manage*.class"/> </zipfileset> <zipfileset dir="lib" prefix="WEB-INF/lib"> <include name="Lecon3-CL.jar"/> </zipfileset> <zipfileset dir="WebContent" prefix=""> <include name="appliWeb/Manager.jsp"/> </zipfileset> <zipfileset dir="WebContent" prefix=""> <include name="applicationWeb/Login.html"/> <include name="applicationWeb/Manage.html"/> </zipfileset> </jar></target>

46

Session de client

(Paragraphe 7.8.5)

• Chaque client a une zone pour ses variables

• Lié à la session par les cookies• La servlette retrouve les variables de

l’appelant automatiquement

47

Serveur

Objets de session dans des servlettes

Client 1(cookie)

Client 2(cookie)

Java bean

Client 2

Servlet

y = session.getAttribute("xx");

Java bean

Client 21

“xx”

“xx”

48

Trouver les Java beans dans la session

public public void doGet ( HttpServletRequest request, HttpServletResponse response) {

HttpSession session = request.getSession();

MyObject myObject = new MyObject ();

session.setAttribute("myObject", myObject);

x = session.getAttribute("myObject");

. . .

49

JSP: Java Server Page

(Section 7.8)

• JSP (exécuté sur le serveur)

≠ Javascript (exécuté dans le browser)

http://java.sun.com/products/jsp/docs.htmlvoir Servlets and JavaServer Pages: A Tutorial

50

Comparaison servlettes - JSPs

public class Test extends HttpServlet {public void doGet (request, response) {

out.println ("<html><body>");out.println ("<h1>");out.println ( x.toString() );out.println ("</h1></body>");

} }

<html><body><h1><%= x.toString() %></h1></body

Servlette

JSP

51

Création d’une JSP

JSP

( code )( + )( html )

htmlServlet

Java code

serveur browser

http://www.ch/xxxx.jsp

html

Servlet

Java source

JSP compilateur Java compilateur Exécution

Réseau

52

<html><head><title>File</title></head><body><h1>Example</h1>

<%! declarations %><% code Java%>

Nouvelle valeur de l'attribut: <%= attribute %><p>

<form action="http://localhost:8080/Exercice3-WEB/File.jsp"> <input type="text" name="attribute"/> <input type="submit"/></form>

</body></html>

Exemple d’une page JSP

(Vue globale)

53

<%! declarations %>

<!-- déclaration d’attributs Attention, le même objet servlette est partagé par tous les clients -->

Page JSP: déclaration

54

Affichage d’une valeur de variable: <%= variable %>

Affichage du retour d’une méthode: <%= myClass.text() %>

<% // Java code out.println( "Text <p>" );%>

Page JSP: affichage

55

Conditional statements

<% if (error!=null) { %>

<b>Error: <

%=error.message()%><b>

<% } %>

56

Conditional statements(code généré)

if (error!=null) {

out.print(“<b>Error:”);

out.print(error.message();

}

57

http://localhost:8080/Exercice3/File.jsp

URL d’une JSP

58

<%@ pageimport="packName.*" %>

request, response et session sont définis par défaut dans une JSP

Autres instructions JSP

59

Standard Tags JSP

jsp:include jsp:useBeanjsp:setProperty jsp:getProperty jsp:forward jsp:plugin

http://java.sun.com/products/jsp/docs.htmlVoir 2.0 PDF ou HTMLet Servlets and JavaServer Pages: A Tutorial

60

<jsp:plugin type="applet"

code="package.HorlogeApplet"

width="370"

height="50">

</jsp:plugin>

Applet

61

Session / Java bean<jsp:useBean id = "myForm"

scope = "session"class = "app.InputForm" />

<jsp:setProperty name = "myForm"property = "attribute"value ="<%= x %>" />

class InputForm { int attribute; // getter/setter créés au moyen d’Eclipse}

62

Définition:<%@ taglib uri = "pack/myTag.tld" prefix = "tag"%>

Utilisation:

<tag:myTag/>

Utiliser un tag non standard

63

package pack;

import java.io.IOException;

/**

* @jsp.tag

* name = "myTag"

* description = "A test class for tags"

*/

public class myTag extends TagSupport {

public int doStartTag() {

JspWriter out = pageContext.getOut();

out.println("I am a tag");

return 33;

} }

Classe tag Correspondante

64

?xml version="1.0" encoding="UTF-8"?><!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">

<taglib> <tlib-version>1.0</tlib-version> <jsp-version>1.2</jsp-version> <short-name>xdoclet-build</short-name>

<tag> <name>myTag</name> <tag-class>pack.myTag</tag-class> <description><![CDATA[A test class for tags]]></description> </tag></taglib>

Créé par les xDocletsDescription d’un tag: MyTag.tld

65

Où se retrouve le fichier JSP compilé en Java?

C:\jboss-4.0.0\server\default\work…

(n’est compilé que lorsqu’on l’appelle)

66

Java beanpackage p;

public class Result implements Serializable {

public Result() { } // optionnel

int xxx;

public int getXxx() {

return xxx;

}

public void setXxx(int xxx) {

this.xxx = xxx;

}

}

Dans Eclipse:

sélectionner int xxx

clic-droit sur la sélection

Source > Generate Getter…

67

Utilisation d’une session et d’un Java bean

Page HTML Servlet Page JSP Servlet

Java bean Java bean Java bean

sendRedirect

Session client (cookies)

68

Java Bean

Résultat

Architecture de l’exercice 1

Page.jsp

Affichage résultat

Nouvelle entrée

Servlette.java

Calcul

69

Même Page.jsp

Java bean

Résultat

Architecture de l’exercice 2

Page.jsp

Calcul +

Affichage résultat

Nouvelle entrée

Page.jsp

Calcul +

Affichage résultat

Nouvelle entrée

70

Database access with the helpof persistent objects

EJB: Enterprise Java Beans

71

Web Application (J2EE)

JBoss

Container

Container

Container

EntityEJB

Browser EntityEJB

SessionEJB

Tomcat

x.htmlNetwork

Client

Server

DB

Servlet

proxies

72

Client-server Application (J2EE)

JBoss

Container

Container

Container

EntityEJB

Client

EntityEJB

SessionEJB

Network

Server

Client

DB

proxies

73

CMP entity beans

(Container Managed Persistency)

BMP, Bean Managed Persistency will not be studied as there are better alternatives

74

Specification of CMP entity

beans in WebLang

CMP bean: relations

methods

attributes

finders / creators

75

Definition of an object in WebLang

cmpbean Town {package geo;String name; // DB attributesint numero;public void myMet (String s) {

System.out.println(s);}

// creators - finders}

76

cmpbean Person { package beans; String firstName; String lastName; // attributes = DB columns int age; public Person createPerson ( String firstName, String lastName ); // age not initialised }// the arguments of the create must correspond // to the attributes. They are stored in the latter.

CMP Bean: method create

77

Creation and use of an object in WebLang

Town t ;

Country c ;

t = townHome.create("Lausanne");

c = countryHome.create("Switzerland");

System.out.println( t.getName() );

c.setName( "Suisse" );

78

CMP Bean: finder method

Town findByName (String s) {

query = "SELECT OBJECT(o) FROM Town o

WHERE o.name=?1"}

// more details later

79

Find an object in WebLang

Town t ;

try {

t = townHome.findByName("Lausanne");

} catch (javax.ejb.FinderException fe) {

t = townHome.create("Lausanne");

}

System.out.println( t.getNumber() );

80

Servlet using a beanservlet myservlet { package servlets;

public void newPerson ( PrintWriter out, String firstName, String lastName, int age)

throws Exception { Person aPers; aPers = personHome.createPerson (firstName, lastName);

aPers.setAge(age);}

} // it is a simple means to test CMP beans, an html // file that calls this servlet is created automatically

81

Java Client (remote)jclient Ouf {

package clientPack;

public void method1 (String s1, String s2) {

Person aPers;

Course aCourse;

aPers = personHome.createPerson("a", s1);

aCourse = courseHome.createCourse("prof", s2);

}

}

// WebLang generates automatically a remote access

82

Reading the HSQLDB database

http://localhost:8080/jmx-console

Select: service=Hypersonic (fifth line under jboss)

Select invoke (below startDatabaseManager)

Look at the task bar and let the DB window appear.

Click View/Refresh tree in this window

Examine the tables (Command > Select …)

83

Fichiers auxiliaires des CMP entity beans

(générés par WebLang et par XDoclet)

84

Files generatedby WebLang

and by the xDoclets

src/control

Game.java

GameCMP.java

GameLocalHome.java

GameLocal.java

GameHome.java

GameUtil.java

sources of the beans

interfaces of the proxies

85

servlet

other EJB

Parts of a CMP entity bean

XxxxLocal userMethods

XxxxLocalHome

create findByPrimaryKey

EJBContainer

XxxxEntityBean

Xxxx

ejbCreate ejbPostCreate

ejbFindByPrimaryKey ejbLoad ejbStore

userMethods

86

XxxxHomeProxy

create findByPrimaryKey

EJBXxxxObjectProxy

userMethods

Instantiation of a persistent object

client

servlet

bean

InitialContext lookup

EJBXxxxObjectProxy

userMethods

XxxxObjectProxy

userMethodsEJB

1

2

3

87

Lookup to get a home proxy

TownLocalHomeProxy townLocalHomeProxy = null;

Context context = new InitialContext();

Object ref = context.lookup("store_PersonLocal");

townLocalHomeProxy = (TownLocalHomeProxy)

PortableRemoteObject.narrow (

ref, TownLocalHomeProxy.class

);

// narrow = cast from object to TownLocalHomeProxy

88

Class specifying a CMP entity bean

package store.ejb;import javax.ejb.EntityBean;import javax.rmi.PortableRemoteObject;/** * @ejb.bean * name = "Customer" * display-name = "CMP Entity Bean" * description = "Description of the CMP Entity Bean" * view-type = "both" * type = "CMP" * primkey-field = "pk" * jndi-name = "store_CustomerRemote"  * local-jndi-name = "store_CustomerLocal" * @ejb.pk * class ="java.lang.Long" */public abstract class Customer implements EntityBean {

EntityContext entityContext; . . .

89

CMP entity bean (primary key)

/** * Attribute Pk is used as primary key by default. * @ejb.persistent-field */public abstract java.lang.Long getPk();public abstract void setPk(java.lang.Long pk);/** * Default remove method * @throws RemoveException * @ejb.remove-method */public void ejbRemove() throws RemoveException { }

90

CMP entity bean: Attributes/** * A pair of getter / setter for each attribute * * @ejb.persistent-field * @ejb.interface-method * view-type = "both" */ public abstract String getAtt() ; /** * @ejb.interface-method * view-type = "both" */public abstract void setAtt(String att) ;

91

Control files generated by the xDoclets

META-INF

ejb-jar.xml

jboss.xml

jbosscmp-jdbc.xml

92

Extrait de ejb-jar.xml

(src/META-INF)

<display-name>CMP Entity Bean</display-name>

<ejb-name>Patient</ejb-name>

<home>predimed.PatientHome</home>

<remote>predimed.Patient</remote>

<local-home> predimed.PatientLocalHome </local-home>

93

Fichier.ear deploy

application.xml // références les fichiers ci-dessous

Fichier.jar // contient les EJBs

Fichier.war // contient les servlettes, passé à Tomat

<module><ejb>Test.jar</ejb>

</module><module> data/jboss-app/application.xml

<web><web-uri>Test.war</web-uri><context-root>/Test</context-root>

</web></module>

Fichier.ear

94

Session beans(Pattern de façade)

95

Collections gérées par une session bean

collection

JBoss

EntityEJB

Browser

EntityEJB

SessionEJB

Network

Client

Server

Servlet

proxiesproxies

proxies

EntityEJB

EntityEJB

Les collections (relations) doivent être gérées dans des session ou CMP beans

96

Une session bean en WebLang

sbean ControllerSession {

package beans;

state Stateful; // optionnel

String st;

public ControllerSession create (String st);

public void newPerson (String firstName, String lastName, int age) throws Exception {

Person aPers;

aPers = personHome.createPerson(firstName, lastName, age);

}}

97

Bean Managed Transactionsbean ControllerSession {

package beans; (Container managed transaction)

transaction Bean; // optionnel, par défaut une CMT est créée

state Stateful; // optionnel

String st;

public ControllerSession create (String st);

public void newPerson (String firstName, String lastName, int age) throws Exception {

Person aPers;

beanContext.getUserTransaction().begin(); // optionnel

aPers = personHome.createPerson(firstName, lastName, age);

beanContext.getUserTransaction().commit(); // abort() }}

98

Relations entre CMP beans

99

1:N Relation

23

4

8

5

23

23

23

WebLang, object view:cmpbean X { relation <hasY 1:N hasX> Y;}

X

Y

N

1

100

1:1 Relation (bidirectionnelle)

23 423

WebLang:cmpbean X { relation <hasY 1:1 target hasX> Y;}cmpbean Y { relation <hasX 1:1 hasY> X;}

X Y

101

N:M Relation

23 4

8

5

X Y27

24

424

827

823

523

102

N:M Relation (toujours bidirectionnelle)

WebLang:cmpbean X { relation <possessesY N:M hasX> Y; …attributes…}

cmpbean Y { relation <hasX N:M possessesY> X; …attributes…}

103

xdocletspour les relations

/** * Implementation of the relationship: getCollection * @ejb.interface-method * view-type = "local"  * @ejb.relation * name="Courses-Students-NM" * role-name="Courses-N-role" * target-ejb="Students" * target-role-name="Students-M-role" * target-multiple="yes" * @jboss.relation-mapping * style="relation-table" * @jboss.relation-table * table-name="CoursesXStudents" * @jboss.relation * related-pk-field = "pk" * fk-column="students_pk" * fk-constraints = "false" * @jboss.target-relation * related-pk-field = "pk" * fk-column = "courses_pk" * fk-constraints = "false" */ public abstract java.util.Collection getStudentsN();

104

Operations concernant les relations entre beans

(WebLang)

105

Relations utilisées dans les pages suivantes

cmpbean Country {

relation <hasCapital 1:1 isCapitalOf> Town;

relation <hasTown 1:N isLocatedIn> Town;

}

cmpbean Town {

relation <isCapitalOf 1:1 hasCapital> Country;

relation <isLocatedIn N:1 hasTown> Country;

}

106

Utilisation d’une référence bidirectionnelle 1:1

Town t = townHome.create("Bern");

Country c = countryHome.create("Switzerland");

t.setIsLocatedIn(c);

System.out.println( t.getIsLocatedIn().getName() );

// setIsLocatedIn est automatiquement définie

quand on spécifie la relation isLocatedIn

Country-Capital

107

Addition d’un élément à une relation

Town v ;

Country c ;

t = townHome.create("Lausanne");

c = countryHome.create("Switzerland");

t.setIsLocatedIn(c); // 1:1 side

t = townHome.create("Bern");

c.addHasTown(t); // 1:N side

Country (1) – Town (N)

108

Déposer une relation et y accéder

Collection collection = aCountry.getHasTown();

Iterator it = collection.iterator();

while (it.hasNext()) { // Java 1.4

System.out.println(

( (Town) it.next() ) .getName() );}

109

Déposer une relation et y accéder

Collection collection = aCountry.getHasTown();

for (Object o: collection) { // Java 1.6

System.out.println(

( (Town) o ) .getName() );}

110

addHasTown est introduit par WebLang

void addHasTown(t) {

getHasTown().add(t);

}// standard add et remove de Collections// ajouté automatiquement par WebLang

removeHasTown(t) {

getHasTown().remove(t);

}

Les collections doivent être manipulées à l’intérieur de transactions

111

Résumé des relations et de leurs méthodesindication

in Xxxx

Other end

in Yyyy

methods available

in Xxxx

<elemY 1:1 elemX> Yyyy no relation<elemX 1:1 target elemY> Xxxx

<collX 1:N elemY> Xxxx

Yyyy y = getElemX() setElemX(yyyy)

<elemY 1:1 target elX> Yyyy no relation<elX 1:1 elemY> Xxxx

Yyyy y = getElemY()setElemY(yyyy)

<collY 1:N elemY> Yyyy no relation<elemX N:1 collY> Xxxx

Collection y = getCollY()setCollY(collection)addCollY(yyyy), removeCollY(yyyy)

<collY N:M collX> Yyyy no relation<collX N:M collY> Xxxx

Collection y = getCollY()setCollY(collection)addCollY(yyyy), removeCollY(yyyy)

112

Comparaisons entre objets

CB h1 = cBHome.create("5");

CB h2 = cBHome.findH("5");

if (h1 == h2) ; // pas valable !

if (h1.getPrimaryKey().equals(h2.getPrimaryKey()) System.out.println("2 x the same bean");

if ( ((Long)h1.getPrimaryKey()).intValue() ==

((Long)h2.getPrimaryKey()).intValue())

System.out.println("2 x the same bean");

113

Finders

http://ltiwww.epfl.ch/~petitpie/ProgrammationInternet/ejb-2_1-fr-spec.pdf

(voir exemple du paragraphe 11.2.6.8)

114

Finder retournant un objet( WebLang )

Course findCourse (java.lang.String name) {

query = "SELECT OBJECT(o)

FROM Course o

WHERE o.courseName=?1"

}

115

Source d’un finder/** * Pays CMP Entity Bean * * @ejb.bean * name = "Pays" * display-name = "CMP Entity Bean" * description = "Description of the CMP Entity Bean" * view-type = "both" * type = "CMP" * primkey-field = "pk" * jndi-name = "geo_PaysRemote" * local-jndi-name = "geo_PaysLocal" * @ejb.pk * class ="java.lang.Long" * @ejb.finder * signature = "java.util.Collection findByVilleAvecM (java.lang.String s)" * query = "SELECT OBJECT (p) FROM Pays p, IN (p.contient) v WHERE v.nom LIKE CONCAT(?1, '%')" * @generated */public abstract class PaysBean implements EntityBean {

116

Build/classes/META-INF/ejb-jar.xml . . .

<query>

<query-method>

<method-name>findVille</method-name>

<method-params>

<method-param>java.lang.String</method-param>

</method-params>

</query-method>

<ejb-ql><![CDATA[SELECT OBJECT(v) FROM Ville v

WHERE v.nom=?1]]>

</ejb-ql>

</query> . . .

117

Tester si un objet existe en WebLang

Country c = null;

try {

c = countryHome.findByName("Switzerland");

} catch (javax.ejb.FinderException fe) {

c = countryHome.create("Switzerland");

}

118

Finder retournant une collection

java.util.Collection findCourses () {

query = "SELECT OBJECT(o)

FROM Course o"

}

Note: les collections retournées par les finders peuvent être manipulées dans servlets.

(ici la table entière)

119

Références cascadées 1:1

Option findOptionByProf (java.lang.String profName) {

query = "SELECT OBJECT(s)

FROM Option o

WHERE o.course.profName=?1"

}

// le finder doit être inclus dans le CMP bean

// qui définit l’objet retourné

120

Relation 1:1 retournant une collectionde membres appartenant à la relation

public java.util.Collection findCountryByCapital

(java.lang.String capital) {

query = "SELECT c.capital

FROM Country c

WHERE c.capital.name LIKE

CONCAT('_', CONCAT(?1, '%‘)) "

}// On utilise une collection, parce qu’on suppose que // plusieurs beans peuvent correspondre au même critère

121

Relation 1:N Country <contains 1:N isIn> Town

public java.util.Collection

findCountryByTownName (java.lang.String name) {

query = Country

"SELECT OBJECT(c)

FROM Country c, IN (c.contains) t

WHERE t.name=?1"

}

122

Relations 1:N cascadées Country : contains Town : hasNb Number

public java.util.Collection findCountryByNumber

(int number, java.lang.String name) { 

query = "SELECT OBJECT(n)

FROM Country c,

IN (c.contains) t,

IN (t.hasNb) n

WHERE c.name = CONCAT("%", ?2)

AND n.value < ?1"

}

123

Relations cascadées

A   1:1  B   1:1   C   1:1   D  -  dd

public A findAByX (java.lang.String name) {

query = "SELECT OBJECT (o)

FROM A o

WHERE o.b.c.d.dd=?1" 

}

124

Relations cascadées

An  1:N  Bn   1:N   Cn   1:N Dn  -  dd

public java.util.Collection findA(java.lang.String name) {

query = "SELECT OBJECT (o)

FROM An o, IN(o.bnN) bx, IN(bx.cnN) cx, IN(cx.dnN) dx

WHERE dx.dd=?1"

}

125

Relations en cascade

An  1:1  Bn   1:N   Cn   1:1 Dn  -  dd

public java.util.Collection findAn (java.lang.String name) { query = "SELECT OBJECT (o) FROM An o, IN(o.bn.cnN) cx WHERE cx.dn.dd=?1" }

// à introduire dans un bean An

(la query retourne un An)

126

Relations en cascade

An  1:1  Bn   1:N   Cn   1:1 Dn  -  dd

public java.util.Collection findBn (java.lang.String s) { query = "SELECT o.bn FROM An o, IN(o.bn.cnN) cx WHERE o.aa=?1"}

// à introduire dans un bean Bn car il retourne une // collection de Bn

(la query retourne un Bn)

127

Transactions

128

Transactions dans les session beans

transaction Bean;

La transaction n’est pas gérée automatiquement,

le développeur doit insérer le code qui la gère.

129

Relation N:M manipulée depuis une session bean

Cours EtudiantsN M

Expérience:

• Enregistrer un étudiant dans un cours

• Voir si l’étudiant est visible depuis le cours

130

beanContext.getUserTransaction().begin();

s1.addCourse(c1); // s1, s2 are students and

s1.addCourse(c2); // c1,c2 courses

s1.addCourse(c3);

s2.addCourse(c3);

System.out.println("Additions terminées");

Thread.sleep(10000); // suspendue pendant 10 sec pour voir

// dans la base de données

for (Students s : c3.getStudentsN()) {

System.out.println("c3.collection"+s.getName());

}

beanContext.getUserTransaction().commit();

131

CMP Bean A

CMP Bean B

Transaction présente avant d’entrer B

Transaction crée par le conteneur pour B

Transactions

132

Dans le CMP bean (WebLang)

transaction RequiresNew;

Dans la méthode du CMP bean

beanContext.setRollbackOnly();

133

Type de transaction

Transaction avant

l’exécution

Réaction

du conteneur

Required présente

aucune

est gardée

une nouvelle

RequiresNew présente

aucune

une nouvelle

une nouvelle

Mandatory présente

aucune

est gardée

erreur

Types de transaction

134

Appels locaux/distants

• Les programmes situés sur des ordinateurs autres que le serveur peuvent accéder à une session beans ou une CMP entity beans de la même manière que les servlets ( mais par le biais de XxxRemoteHomeProxy )

• Il ne peuvent pas manipuler les relations des CMP beans(pour plusieurs raisons)

135

Classes / jclients de WebLang• WebLang gèrent les home interfaces, les

entités CMP et les noms des classes des session beans de même que les input/output channels dans la plupart des modules

• En particulier dans les jclients et dans les classes.

Note: les classes doivent contenir l’indication access Remote; si elles ne sont pas dans le serveur.

136

class or jclient Modulejclient Ouf {

package clientPack;

inputchannel varName (topic, "TopicName") { … }

void method1 (String s) {

Person aPers;

Course aCourse;

aPers = personHome.createPerson(s+"pers"); // CMP bean

aCourse = courseHome.createCourse(s+"course");

}

void method2 () {

List aList;

String str = "Text = "+listHome.create().text(); // session bean

System.out.println(str);

} }

137

Struts

138

Servlet ServletJSP JSP

PersonManagement SportManagement

person sport

personName

personForm

sportNamelocation

Basic structure of struts

sportForm

• The forms are saved in the HTTP session

• Under the name derived from the class !

Servlet Servlet

139

Output of data (same for input)

Struts

sportForm.setLocation("xxx")

JSP

<bean:write name="sportForm" property="location"/>

<html:text name="location"/>

sportForm location

No direct connection !

140

Servlet ServletJSP JSP

PersonManagement SportManagement

person sport

personName

personForm

sportNamelocation

2

1

3

Basic structure of struts

sportForm

• The forms are saved in the client session

• Under the name derived from the class !

Servlet Servlet

141

/**

* @struts.form name="personForm"

*/

public final class PersonForm extends ActionForm {

private String name;

public String getName() {

return (this.name);

}

public void setName(String name) {

this.name = name;

}

} // ActionForm has code to fill in the form from the URL

1 Librairies Struts: Action Form ( = java bean )

142

JSP: input.jsp

<h3>personForm.sportForm</h3>

<html:form action="/personManagement">

sportName <html:text property="name"/>

<html:submit/>

</html:form> // Plusieurs paramètres de l’action sont définis dans struts-config.xml

// en particulier une form est attribuée à cette action et name est le nom d’un

// champ de cette form

2 Librairie JSP pour Struts: HTML Form

143

public final class PersonManagement extends Action {

PersonForm f;

public ActionForward execute (ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response) {

try {

f = (PersonForm) form;

f.getName();

return (mapping.findForward("sport"));

}

catch(Exception e) { // trap exceptions that may occur in your servlet

e.printStackTrace(); // you will get better error messages !

return (mapping.findForward("error"));

} } }

// L’action form passèe comme argument est automatiquement

// remplie à partir des arguments de l’URL

3 Struts: Action Servlet

144

<action-mappings>

<action path="/personManagement" type="management.PersonManagement"  // servlet class name="personForm" // name in HTTP session scope="session" input="/pages/Error.jsp" unknown="false" validate="true" > <forward name="sport" // name that can be used as next page path="/pages/sport.jsp" redirect="false" /> </action><action-mappings>

(généré par xDoclet)Fichier auxiliaire: struts-config.xml

145

Action Forms CMP Beans

PersonForm

Main

personForm[]

Person

Course

Person[]

finder ou getCollection

Recrée une collection et copie ses éléments dans l’autre collection

// code prochaine page

Action forms

CMP beans

146

Action Forms CMP Beans

PersonForm

Main

personForm[] per

Person

Course

Person[] per

Pseudo-code

course.setPer( new ArrayList() )

for (each main.per[]) {

x = personHome.create(per[].attributes)

course.addPer(x)

}

PersonForm Person

147

- Action forms,- arrays of action forms,- trees of action forms

148

Action Action

In/out

Input

In/out

PersonManagement SportManagement

job

person

sport

personName

personName

personForm

jobNamelocation

sportForm[ ]

jobForm[ ]

jobForm[]

jobNamelocation

jobNamelocation

sportForm

Java beans composés

jobNamelocation

jobNamelocation

sportNamelocation

Pas supportéjobNamelocation

jobNamelocation

jobNamelocation

sportNamelocation

// Toutes les Action Form envoyées à // une action doivent avoir le même type

149

/**

* @struts.form name="personForm"

*/

public final class PersonForm extends ActionForm {

. . .

private SportForm sportForm; // sub-form

public SportForm getSportForm () {

return (this.sportForm);

}

public void setSportForm (SportForm sportForm) {

this.sportForm = sportForm;

}

}

Tree of action forms

150

( x[ ] or Collection or Set )

/**

* @struts.form name="personForm"

*/

public final class PersonForm extends ActionForm {

. . .

private Collection sportForms;

public Collection getSportForms () {

return (this.sportForms);

}

public void setSportForms (Collection sportForms) {

this.sportForms = sportForms;

}

}

Array of sub-action forms

151

In the action servlet

f.getName();

In the JSP

<html:text property="name"/>

the form in which name is looked for is linked to the JSP by a definition introduced in struts-config.xml

Reference to an attribute of an Action Form

152

In the action servlet

f.getSportForm().getName();

In the JSP

<html:text property="sportForm.name"/>

the form is linked to the JSP within struts-config.xml

Reference to an attribute of a Sub-Action Form

153

In the action servlet (first element ! )

o = ((ArrayList) f.getSportForms();

name = ((SportForm) o.get(0)).getName();

// f is linked to the JSP in struts-config.xml

In the JSP

<html:text property="sportFormN[0].name"/>

// The element passed to the property can be // an ArrayList or an array such as String[]

Reference to an array of Sub-Action Forms

154

Tags in the JSP and the Struts

<jsp:useBean id="managementForm"  scope="session" class="man.ManagementForm"/>

<bean:write name="managementForm" property="warning" filter="false"/> // prints the value of the property on the page

http://localhost:8080/struts-documentation

http://ltiwww.epfl.ch/WebLang/references.html

155

HTML form in a JSP

<h3>PetForm</h3>

<html:form action="/Supplier_State_0_Action" >

<html:hidden name="petForm"property="<%= page_prop_token %>" value="<%= pageId %>" />

<table border=0><tr><tr><td> &nbsp; &nbsp; &nbsp; name &nbsp; &nbsp;

<td><html:text property="name"/><tr><td colspan=2 align=center><html:submit property="submit">submit</html:submit>

</table>

</html:form>

156

Array in an HTML form

<html:form action="/Supplier_State_0_Action" ><html:hidden name="petForm"

property="<%= page_prop_token %>" value="<%= pageId %>" />

<table border="0" cellspacing="1"><tr><td> <table border="0" width="100%"><td>subName</table><td> <table border="0" width="100%"><td>number</table><td> <table border="0" width="100%"><td>check</table><tr><td> <table border="0" cellspacing="1"></table>

<!-- tableau transparent suivant

<tr><td colspan=10 align=center> <html:submit property="submit">submit</html:submit> </table></html:form>

157

Iteration on the array (or collection)

<logic:iterate name="petForm"property="thingN"id="item1"indexId="index1">

<tr><td><table border="0" width="100%"<%=color[index1.intValue()%2]%>>

<td> &nbsp;<bean:write name="item1" property="subName"/></table>

<td><table border="0" width="100%"<%=color[index1.intValue()%2]%>>

<td><bean:write name="item1" property="number"/></table>

<td><table border="0" width="100%" <%=color[index1.intValue()%2]%>>

<td><html:checkbox property='<%="thingN["+index1.intValue()+"].check"%>'/></table>

</logic:iterate> cette valeur est retournée dans l’URL

158

Internationalization (a.k.a. i18n)

• Properties defined in resources/application.properties resources/application_fr.properties

• Introduced in the JSPs by <bean:message key=“struts.page.form.text"/> (see the file for details)

• If the browser is set to French application_fr.properties is used

159

Translation of the properties

Copy

resources/application.properties

to

resources/application_fr.properties

and edit the content of the new file

160

Struts in WebLang

Architecture pour:

Machine à états finie

Gestion des pages

161

Assurer une confirmation!

• L’utilisateur clique le bouton Confirm

• L’ordre est exécuté par le serveur

• L’utilisateur clique le bouton BACK du browser

• Il reclique Confirm erreur: double entrée

• Comment le serveur évite-t-il le doublon ?

162

Eviter le doublon

• Chaque page contient un hidden field avec un numéro unique

• Avant de lire les paramètres de la page, on vérifie que le numéro est celui de la dernière page envoyée

• Cela implique un code homogène

163

State Machine

• Login Register

• Fill a cart

• Confirm the cart

• Show the bill

• Confirm the order (only once)

164

state == 1transition from state 1state = 2

JSP JSP

personName sportNamelocation

WebLang use of the JSPs and servlets

state == 2transition from state 2state = 1

State_2State_1

165

FSM bean FSM beanJSP JSP

personName

sportNamelocation

Same bean,but different states

WebLang use of the JSPs and servlets

Where to start ? In the bean!

166

Finite State Machine in a Struts

Struts

0

1

showBasket

notconfir-med

2

confirmed

OK

page_0

page_1

page_2

167

struts PersonManagement {

package management;

stateMachine

state State_0 > person;

state State_1 > job;

. . . FSM . . .

page person {

personForm;

personForm.sportForm[ ];

personForm ("Comment", submitName) ;

}

}

WebLang Module : states and pages

168

// Pure Java code

WebLang Module : Finite State Machine

stateMachine { state State_0 > supply; state State_1 > supplyConfirmation; switch (sessionState) { case State_S: sessionState = State_0; break; case State_0: Pet pet = petHome.create( petForm.getName() ); sessionState = State_1; break; case State_1: if (supplyConfirmation.getConfirmation()) sessionState = State_0; }}

169

form SportForm { package fmPack; String sportName; int location);}form PersonForm { // sub-form package fmPack; String name ; JobForm jobForm; SportForm sportFormN [ ] ;} form JobForm { String jobName; int location;}

WebLang Module : Forms (Java beans)

170

Different display formats

page SomePage {

petForm; // displays all the fields

petForm.thingN[ ];

petForm.bbb (MySubmit); // displays a MySubmit button

petForm.ccc (Cancel); // display a button

petForm.aaa (); // displays no button

}

171

Struts JSP

struts Supplier { . . . page supply { petForm; petForm.thingN[ ]; } }form PetForm { package fp; String name; Thing thingN[];}form Thing { package fp; String subName, int number, boolean check;}

172

Selection of the visible fields

page SomePage {

petForm () { readwrite nom; hidden age; }

petForm.thingN[ ];

petForm.bbb (MySubmit); }

173

Selection of the visible fields

page SomePage {

petForm () ;

petForm2<PetForm> ()

petForm.thingN[ ];

petForm3<PetForm>.bbb (MySubmit); }

174

Characteristics of the fields

hiddenmessagereadonlyreadwriteradio (aaa,bbb)combo (aaa,bbb) password

readonly radio (aaa,bbb) | readwrite | combo (aaa,bbb)

| password

// last lines: one of each group, e.g. readwrite radio

175

Struts

browseForm.petForm[ ] (form)

basket.petFrom[ ] (form)

PetOrder status = ordered OrderItems* (CMP+CMR)

0

1

showBasket

notconfir-med

browser (JSP)

order-registered

(JSP)

showBasket (JSP)

2

confirmed

OK

Struts in WebLang

JSPs Action Servlet

Action Forms

CMP bean

176

Administrator

Struts

Three tiers (overview)

browseForm.petForm[ ] (form)

basket.petFrom[ ] (form)

PetOrder status = ordered OrderItems* (CMP+CMR)

PetOrder status = awaitInvoice OrderItems* (CMP+CMR)

PetOrder status = toBeChecked OrderItems* (CMP+CMR)

file

OrderForm.petForm[ ]not accept

(form)

Buying

Struts

0

1

showBasket

notconfir-med

browser (JSP)

order-registered

(JSP)

showBasket (JSP)

2

SendSupplierPO

MDBean

0

select

login

confirmed

1confirmed

OK

areYouThe-Administrator

(JSP)

checkOrders (JSP)

Display Business Layer Database

+ Dataflow

DisplayBusiness Layer

Queue

177

Struts

out print println

0

JSP

Prints in WebLang

print

In the Struts, WebLang automatically defines a stream named out, which contains methods

out.print(“xxx”); and out.println(“yyy”);

the text produced is automatically printed on the next JSP

1

178

Sub-FSMs

02

1

displayapplicationenter

start

enter

display_francs

next

ignore

ignore

display_euros

previous

timeoutdisplayapplication

display

enter

start

ignore

timeout

179

Sub-FSM

Struts A Struts B

State_0

State_S(start)

State_S(start)

State 0State_R(redirect)

1st return

1st call

subsequent calls

State_1

Goto B

Continue

State_1State_3

Goto B

Continue

State_3

Return

Continue

2nd return

State_R(redirect)

180

Page_0

Introduirepersonnes/groupes

Lister/formergroupes

Nom groupe

Personnes

Page_2

nomP NomG v

Quitter

Entrer

Groupe

Personnes

Page_1

Quitter

EntrerGroupe

EntrerPersonne

EntrerGroupe

EntrerPersonne

Quitter

EntrerGroupe

EntrerPersonne

181

JMS: Java Message Services

• Channels (queues, topics, durable topics)

• Message driven beans

• Architecture

182

Server

queuetopic

Sender

Listener

SynReceiver

queue/topic

Message Driven Beanqueue, topic

MDBeanClients

183

Types de canaux

QueuesEach message is rec-eived by a single client

TopicsEach client receives all messages

Durable Topics

Each client receives all messages, even if it is temporarily discon-nected

Requires (only in input)

subscription name

username, passwd

184

Création de queues et topics

• Queolques queues et topics sont créés quand le serveur

JBoss est démarré: A, B, C, D, testTopic (lire les

informations imprimées quand JBoss démarre)

• La queue ou le topic d’un MDBean est créé à la création

du MDBean.

• On peut créer d’autres queues et topics en modifiant les

fichiers qui définissent l’environment de JBoss selon

http://ltiwww.epfl.ch/WebLang/JBossQueues.html

185

Canaux disponibles dans WebLang:

• MDBeans (1 input / 0-n outputs)

• Servlets, (0-n outputs)JSPs, Struts

• CMP beans (0-n outputs)

• jclient, class (0-n inputs / 0-n outputs)

186

Listener de queue / topic

queuetopicListener

Client

inputchannel ch {

}

Serveur

Object

operation1()operation2()

Needs C:\jboss-4.0.0\client\jbossall-client.jar

187

Client

outputchannel ch {

}

Envoyer des messante à une queue ou un topic

queuetopicproxy

Server

Object

ch.send(message)

188

jclient MyClient { // or class

package myPackage;

inputchannel inputName (topic, "MDBTopic") { String s = ((TextMessage)msg).getText());

varName.publish(msg);

}

outputchannel varName (topic, "testTopic");

public void method(String s) { . . . }

}

Module client ou classe en WebLang

189

Listener généré par WebLang

public class alarmChListener implements javax.jms.MessageListener {

public void onMessage(javax.jms.Message msg) {

try {

System.out.print ((javax.jms.TextMessage)msg).getText();

} catch (Exception t) {

t.printStackTrace();

} } } Text specifié dans l’inputchannelText specifié dans l’inputchannel

190

Lecture synchrone

// Lire la queue en mode synchrone

// (attente de 5 secondes au plus)

tmpQueue = (javax.jms.Queue) queueCtx.lookup("queue/C");

queueObj = queueSession.createReceiver(tmpQueue);

for (;;) {

Message msg = (Message) queueObj.receive(5000);

if (msg == null)

System.out.println("Timed out");

else

System.out.println(msg.getText());

}

191

Message driven bean

192

// executed when a message arrives

Module MDBean en WebLang

Pas de nom (à la diférence des autres)mdbean MyMDB {

package myPackage;

inputchannel (queue, "MDBQueue") {

String s = ((TextMessage) msg).getText());

varName.send(msg); }

outputchannel varName (queue, "B");

}

193

servlet MyClient {

package myPackage;

// pas d’inputchannel possible !

outputchannel varName (queue, "A");

public void method(String s) {

TextMessage tm =

queueSession.createTextMessage(s);

varName.send(tm); } }

Module servlet en WebLang

194

Proxy d’un topic

public void newTopicEnv(String name, String passwd)

throws Exception {

Object tmp = initCtx.lookup("UIL2ConnectionFactory");

TopicConnectionFactory tcf = (TopicConnectionFactory) tmp;

topicConn = tcf.createTopicConnection(name, passwd);

topicSession = topicConn.createTopicSession(

false, javax.jms.TopicSession.AUTO_ACKNOWLEDGE

);

topicConn.start(); }

(généré by WebLang, similaire pour les queues)

195

Connexion à un topic

tmpTopic = (javax.jms.Topic) initCtx.lookup("topic/testTopic");

fromTopic = topicSession.createSubscriber(tmpTopic);

fromTopic.setMessageListener(new fromTopicListener());

(généré by WebLang)

196

Exemples d’architecture

197

Server

CMP beans(nom de partie)

Java client

Java client

Java client

topic

ServletBrowserInitialise le jeu game

Exemple d’environnement pour un jeu dans lequel un dé tourne parmis les joueurs (une fois qu’ils se sont enregistrés)

198

GUI Listeners

actionPerformed() {

}

Business layer

FSM () {

}

Message Listener

onMessage () {

}

GUI

setUsername ()getUsername ()setPosition ()setError ()

topic

Java client

invokeLater

199

Classes in WebLang

class Business {

package ppp;

outputchannel ch (topic, “testTopic”);

access Remote;

public Business(LoterieGUI gui) {

this();

this.gui = gui;

}

}

200

La machine d’état est exécutéesur le thread du GUI et le sur le thread qui gère le topic

java.awt.EventQueue.invokeLater( new Runnable() { public void run() { // access to the GUI } });

201

public void transition(String source) { try { switch (state) { case 0: if (source != "username") return; game = gameHome().findByName(gui.getGameName()); . . . state = 1; break; case 1: if (source != "nextmove") return; state = 2; break; case 2: if (source != "done") return; game.moveTerminated(); state = 1; } } catch (Exception e) { } }

Machine à états finie

202

Web Services

• SOAPSimple Object Access Protocol ou Service Oriented Architecture ProtocolHTTP remote call

• SOAService oriented architecture

• WSDLWeb Services Description Language

• UDDIUniversal Description Discovery and Integration ( tombe dans l’oubli )

203

Schéma d’un web service

Application(standalone)

stub

Application(sur serveur)

stub

Serveur

remote object== Java bean

204

Documentation sur la création des Web Services

Help > Help Contents >

Documentation

205Bottom Up: Java bean service

package web;public class Test {

public Person grow(Person p){p.setSize(p.getSize()+1);return p;

}}

. . .<wsdl:types> <schema elementFormDefault="qualified" <element name="grow"> <complexType> <sequence> <element name="p" type="impl:Person"/> </sequence> </complexType> </element> . . .

WSDL

206

Web Services Description Language (WSDL)

<?xml version="1.0" encoding="UTF-8"?><wsdl:definitions targetNamespace="http://web" /" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" <!--WSDL created by Apache Axis version: 1.3Built on Oct 05, 2005 (05:23:37 EDT)--> <wsdl:types> <schema elementFormDefault="qualified" <element name="grow"> <complexType> <sequence> <element name="p" type="impl:Person"/> </sequence> </complexType> </element> . . . <wsdl:port binding="impl:TestSoapBinding" name="Test"> <wsdlsoap:address location="http://

</wsdl:port> </wsdl:service></wsdl:definitions>

207

Creation d’un Web Service

L’accès à une application est

fait au moyen de servlettes

développées dans le projet Axis

et qui appellent l’objet désigné

par l’utilisateur

208

Test du service (après avoir compilé la classe)

• Service ExplorerWebContent/wsdl/Xxx.wsdl > right click > Web Services > Test with Web Services Explorer

• JSP de testclasse.java > right click > Web Services > Generate Sample JSPs

209

Top Down: Java bean service

• WSDL file (par exemple sur une page WEB qui décrit le service)

• On obtient un squelette à compléter

210

Web service en WebLang(seuls les types simples supportés)

webservice Simple {package xxx;public int add (int i, int j) {

return i+j;}

}

211

Transfer of data

From an action form to a CMP bean

and vice-versa

212

Action Forms CMP Beans

PersonForm

Main

resultFormN

Person

Course

personN

finder or getCollection

Recreates a collection and copies one into the other member by member

// code next page

Action forms

CMP beans

213

Action Forms CMP Beans

String courseName = result.getCourseForm().getName(); // reads an action formjava.util.Collection<Person> coll = personHome.findPersonInCourse(courseName);

java.util.Collection<PersonForm> c = new ArrayList<PersonForm> ();

for (Person aPerson: coll) { // scan the collection of CMP beans PersonForm personF = new PersonForm(); personF.setFirstName(aPerson.getFirstName()); personF.setLastName(aPerson.getLastName()); c.add(personF); // creates the collection of action forms}result.setPersonFormN( c );

214

Checking which submit has been clicked

If (submit.equals(“OK”)) { . . . }

page supply {          petForm.thingN [ ] (OK, Cancel)           readwrite name;      }  }

215

Generated automatically WebLang

modules

• Lottery application implemented with Struts• Draw first a diagram with the html forms, the

action forms, the state machine and the database

CMP bean: Customer

namestruts: Lottery

- register(String) - login() - displayResults()

CMP bean: Token

number

Exercise

html: lottery

Start struts

216

EJB - Hibernate 3

• Hibernate 3 allows the beans to be either attached to or detached from the database

• The beans can thus be used as action forms too, which avoids the tedious transfers from the beans to the action forms

• The version we will use is based on the @annotations introduced in Java 1.5

See the page WebLang about Hibernate

217

Annotations (replace xDoclets)

/** * @struts.form name="jeton" */@Entitypublic class Jeton implements java.io.Serializable { . . .@Id(generate = GeneratorType.AUTO)public long getId() { return id;} . . . @ManyToOne public loterie.Client getClient() { return (client);}

Note: En WebLang, tous les ejb3 doivent se trouver

dans le même package

218

WebLang module(same as cmpbean, but no finders, no creators: they are made in the user’s space)

ejb3 MyCountry { package myPackage; relations (Town=1:N); String name; int number; public Country(String name) throws Exception { this.name = name; } public String toString() { String str = "Country id=" + getId() + " name=" + getName(); java.util.Collection<Town> tlist = getTownN(); for (Town town: tlist) { str = str + "\n Town=" + town; } return (str); }}

219

Configuration parameters

config {

deploypath = "C:/jboss-4.0.0/server/standard/deploy/";

hibernate_driver = "org.hsqldb.jdbcDriver";

hibernate_url = "jdbc:hsqldb:hsql://localhost:1701";

// for the JBoss database as prepared here

hibernate_username = "sa";

hibernate_password = "";

hibernate_dialect = "org.hibernate.dialect.HSQLDialect";

hibernate_dbauto = "create-drop"; // if present,

// recreates the tables at each restart

}

220

Use of a Hibernate bean

javax.persistence.EntityManager em;

javax.persistence.EntityTransaction tx;

em = hibernate_utility.Manager.open();

tx = em.getTransaction();

tx.begin();

Country c = new Country("Switzerland");

em.persist(c);

c.setNumber(1291); // DB updated at commit

tx.commit(); // tx.commit() or tx.rollback();

hibernate_utility.Manager.close();

221

Finding objects with Hibernate

javax.persistence.Query qt;

qt = em.createQuery( "select t from Town t where t.name=?");qt.setParameter(1, name);try {      town = (Town)qt.getSingleResult();} catch (javax.persistence.EntityNotFoundException enf) { town = new Town(name);       em.persist(town);}

222

Finding lists of objects with Hibernate

javax.persistence.Query qt;

qt = em.createQuery("select t from Town t");

try {

townN = (Collection)qt.getResultList();

} catch (Exception e) {

// some error

}

223

Using Hibernate objects (size() not written - lazy evaluation)

tx.begin();

. . .

proprietaire = qt.getSingleResult();

Collection c = proprietaire.getVoitureN(); // The elements of the

. . . // collection are retrieved only when needed

tx.commit();

for (Voiture v: proprietaire.getVoitureN()) {

out.println(v.getName()); // accessed outside the transaction}

09:22:28,774 INFO [STDOUT] org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: package.Proprietaire.voitureN, no session or session was closed

224

Using the objects of a Hibernate relationship outside the transaction

tx.begin();

. . .

owner = qt.getSingleResult();

owner.getCarN().size();

. . .

tx.commit(); required to force the computation

(other functions may also be used)

for (Car c: owner.getCarN()) { otherwise not available

out.println(v.getName()); }

Owner Car

1 N

225

Both Action form and Hibernate bean

ejb3 MyCountry

extends strutsStateMachine.StateForm {

package myPackage;

relations (Town=1:N);

String name;

int number;

}

226

Create and Persist an Action Form

// town is assumed to be a form filled in by the user

      town.setId(0); // be sure it has not been left // attached by some previous action javax.persistence.EntityManager em; javax.persistence.EntityTransaction tx; em = hibernate_utility.Manager.open(); tx = em.getTransaction(); tx.begin();

      em.persist(town); tx.commit(); hibernate_utility.Manager.close();

}

227

Transaction

store into the DB

Transaction

Transactions and display

get from the DB

display,let the user modify the

data

No transaction

Java bean

(ActionForm/EJB)

Must reconnect the bean to a transaction

228

Reconnect an EJB3 to the DB

tx.begin(); // a first call to a servlet

em.persist(x);

tx.commit();

…Displaying…

tx.begin(); // a subsequent call

y = em.merge(x); // copy x to a new y

y.setName(“new value”); // and persists y

tx.commit();

229

Handling a relationship

tx.begin();

em.persist(owner);

for (Car c: cars) {

em.persist(c)

owner.add(c);

c.setCar(owner); // indispensable to introduce it into the DB

} // because the reference is defined in table car

tx.commit();

Owner Car

1 N

230

Merging a relationship(could be done by using cascade)

tx.begin(); x = em.merge(owner);

for (Car c: owner.getCarN()) { x.add(em.merge(c)); // reintroduce the merged } // objects into the new object owner = x; // optional: remettre l’objet dans son pointeur request.getSession().setAttribute(“owner”, owner); // et

tx.commit(); // dans la servlet-session

Owner Car

1 N

x : Owner c : Car

1 N

231

SQL beans

• SQL beans have been devised at the EPFL: they present the same structure as Hibernate 3 (particularly within WebLang), but they only use JDBC and the standard SQL

• Much simpler to debug, as all statements may be traced within the debugger

• No home, the object must be created to hold the finder (instantiation by new)

232

SQL Bean Example

sqlbean Town extends strutsStateMachine.StateForm { package appliT; relations ( Country = N:1, <isCapitalOf 1:1 hasCapital> Country); String name; public long findPK_OfTown() throws Exception {

query = "SELECT * FROM Town WHERE name=$name;" }}TownN { public void findN_TownList(String s) throws Exception {

query = "SELECT * FROM Town WHERE name>$s"}

233

Use of an SQL bean

// we assume that country has been created // and filled by the Struts mechanism

case State_1:

long pkC = country.findPK_OfCountry();

if (pkC!=0) { country.reloadAll(pkC); } else { country.store(); } country.addTownN(town); // town.setCountry(country); // either this line or the line // above; the second one is

// called automatically

234

FindersTownN tn = new TownN();

try { tn.findTownList(“N”);} catch (weblangUtils.SQLException we) { System.out.println(“Not found”);}

for (Town t: tn) { System.out.println(“t.getName());}

……………………………………………………………..

TownN { String name; public void findTownList (String s) throws Exception { query = "SELECT * FROM Town WHERE name>$s" }}

235

Detached object

Attached object

pk!=0

Attached + linked + connected object

pk!=0 rel!=0

Linked object

pk==0

o.delete()

o.findXx()

o.store() o.set(null)o.remove(o1)

o.set(o1)o.add(o1)

o.set(null)o.remove(o1)

o.set(o1)o.add(o1)

o.reload(0)

o.reloadAll() o.storeAll()

o.deleteAll()

o.reload()o.reloadAll()o.update()o.updateAll()

o.delete()

o.store()

o.delete()

o = new Xxx()

FSM of the SQL beans

o.reload(pk)

pk=o.findPKXx()

236

States of the SQL objects

Detached: The object has been instantiated

Attached: The object has a corresponding set of data in the database

Linked: The object is embedded in a structure, but it has no primary key

Attached, linked The object is available in the database, and connected: as well as in memory, within some

relationship

237

Operations of the SQL beans

store Copies the data of the object into the database, new primary key inserted in the object

findXxx Query method returning a DB row, the objectmust be instantiated before the method is called

findPKXxx Returns the value of the primary key (or 0),method may also throw an exception

reload(pk) Method copies the data of the object into a DB row with primary key pk

update Dual of the reload, updates the database row that has the PK found in memory

238

More Operations

delete Removes the data in the database, not the memory, resets the object’s primary key

set, add Establishes connections between

remove the objects, the two directions of the relationship are handled

storeAll Call all the objects bound by

deleteAll a relationship (not recursively)

reloadAll

updateAll

239

RMI Application

ClientServer

Xxxx(stub)

RemoteXxxx

interfaceXxxx

Xxxx(skeleton)

interfaceXxxx

240

RMI: inverse communication (by transmitting the stub)

Client Server

MyRemote(skeleton)

MyRemote(stub)

rmiregistry

Transfer(stub)

1

2

3

Transfer(skeleton)

myRemStub

241

RMI Modulermi Test { package rmis; public void print (String s) { System.out.println("X "+s); }}

jclient Client { package rmis; Test x; // as Test corresponds to an rmi interface,

// x is automatically initialized RemoteTest y; // y is not automatically initialized, the client // must call new RemoteConnection(true) public void print (String s) { try { x.print(s); } catch (Exception e) { e.printStackTrace(); } }}

242

Software Engineering

243

Application / implementation

Craig: (http://www.codegeneration.net/tiki-read_article.php?articleId=27)

Specifying software means components, interfaces, archit-ectures, or what is sometimes referred to as the "How".

Specifying applications means features, capabilities, options, or what is sometimes referred to as the "What".

So, it seems odd to me (i.e., Craig ) to use UML (a "how" language) as a universal specification language.

244

My View

Library

(Librarian, book shelves, quiet room)

Soft Library (simulator)

(terminals, server, software)

Each time a book is borrowed in the real library, the librarianborrows a book here

Software application

(terminals, server, software)

=

Borrow a book

Look for a user

A book has been lost

Check differences

Sort books

Reserve a book

Actually, you want to describe the software, the how. The customer can often not read any schema and will require a fast prototype, which is indeed the software.

245

Administrator

Struts

Three tiers (overview)

browseForm.petForm[ ] (form)

basket.petFrom[ ] (form)

PetOrder status = ordered OrderItems* (CMP+CMR)

PetOrder status = awaitInvoice OrderItems* (CMP+CMR)

PetOrder status = toBeChecked OrderItems* (CMP+CMR)

file

OrderForm.petForm[ ]not accept

(form)

Buying

Struts

0

1

showBasket

notconfir-med

browser (JSP)

order-registered

(JSP)

showBasket (JSP)

2

SendSupplierPO

MDBean

0

select

login

confirmed

1confirmed

OK

areYouThe-Administrator

(JSP)

checkOrders (JSP)

Display Business Layer Database

+ Dataflow

DisplayBusiness Layer

Queue

246

Exercise of Software Engineering (8)

• Creation of a stock exchange application.Customers are connected to the bank. The bank keeps a portfolio for each client, transmits the customer orders to the stock exchange. The stock exchange keeps an “order book” that contains the stocks that customers want to buy or sell, with the prices (or price range) they are willing to pay or get.

• Create a diagram that specifies a customer, a bank and a stock exchange, with CMP beans, queues, session beans…

• Create a diagram of the software system that will run the application, not of the application itself.

247

Exercice:

• Compléter la loterie pour que le client voie une annonce quand le manager a sélectionné les jetons

• Créer les fonctions qui permettent d’entrer des jetons depuis le client Java (rich client)

248

Client Serveur

cmpbean: Client

String nom

cmpbean: Jeton

int numero

attenteint etat gagnant

perdant

sbean: AccesJetons

- addJeton(Client, Jeton)

- listeResultats(Client)

1

N

html: display_Enregistrement

- enregistre(String)

- login(String)

html: display_Manager

- tireJetons(int)

servlet: Manager

- tireJetons(int)

- afficheJetons()

servlet: GestionJeton

- remplitJeton(int)

- afficheResultats()

servlet: Enregistrement

- enregistre(String)

- login(String)

html généré

Loterie

Java bean: LotteryData

- constantes générales

- client

html: display_GestionJeton

- remplitJeton(int)

- afficheResultats()

249

Loterie

Browser

Serveur

cmpbean: Client

String nom

cmpbean: Jeton

int numero

attenteint etat gagnant

perdant

1

N

html: display_Manager

- tireJetons(int) servlet: Manager

- tireJetons(int)

- afficheJetons()

Java bean: LotteryData

- constantes générales

- client

Client

topic: testTopic

listener:class: LoterieGUI

(created with Visual Editor)

250

Loterie

Browser

Serveur

cmpbean: Client

String nom

cmpbean: Jeton

int numero

attenteint etat gagnant

perdant

1

N

html: display_Manager

- tireJetons(int) servlet: Manager

- tireJetons(int)

- afficheJetons()

Java bean: LotteryData

- constantes générales

- client

Client

topic: testTopic

listener:

class: LoterieGUI

- display: TextArea

- login: TextField

- tireJeton: TextField

display(String)

class: Business

- login(String)

- tireJeton(int)

invokeLatersbean: ClientBean

- login(String)

- tireJeton(int)

top related