UV J2EE Module Java Expert

Slides:



Advertisements
Présentations similaires
Serveur d’applications JEE
Advertisements

JEE 5 - JSF F.Pfister 2 institut eerie Les technologies du web Servlets JSP MVC Model 1 : servlets + JSP MVC Model.
Cours 5 : XML et les architectures N-tier Janvier Version 1.0 -
Serveur jeu Le serveur fait partie d'un logiciel de jeu en ligne multi joueur en architecture client serveur. Il répond à des demandes.
Serveurs web pour JSP et Servlets
Architecture. Architecture Enjeux Les Enjeux Trouver une solution e-Business Accessible à partir d’un navigateur Web Accédant au système via un Portail.
Cours MIAGE « Architectures Orientées Services » Henry Boccon-Gibod 1 Architectures Orientées Services Composants de Service Exemple pratique de développement.
Exposé de Système - Informatique et Réseau
Programmation Web Les JSP.
Cours 5.3 : XML et les architectures N-tiers – Tier Présentation
51 Les technologies XML Cours 6 : XML et les architectures N-tiers – Tier Métier Janvier Version 1.0 -
Cours 6 : XML et les architectures N-tiers – Tier Applicatif
51 Les technologies XML Cours 7 : Utilisations dXML Janvier Version 1.0 -
LICENCE MIAGE Introduction Programmation Orientée Objet JAVA philippe

Design Pattern MVC En PHP5.
CURSUS DE FORMATION AUX NOUVELLES TECHNOLOGIES DE DEVELOPPEMENT UV EJB Entité Module Java Expert.
CURSUS DE FORMATION AUX NOUVELLES TECHNOLOGIES DE DEVELOPPEMENT UV EJB Session Module Java Expert.
UV JSP JSP : Java Server Page
UV J2EE Module Java Expert
UV Servlets Les Servlets
CURSUS DE FORMATION AUX NOUVELLES TECHNOLOGIES DE DEVELOPPEMENT UV Borland JBuilder 7 Module WSAD.
TP 3-4 BD21.
JSP Java Server Pages. Introduction Afin dimplémenter les règles métiers, coté serveur dans une application Web, larchitecture Java propose trois solutions.
Servlet JAVA.
ESIEE Paris © Denis BUREAU I N Initiation à la programmation avec le langage Java.
JOME, un Composant Logiciel pour le Télé-Enseignement des Mathématiques via le WEB, Compatible OpenMath et MathML Laurent DIRAT OVE / I3S-UNSA.
Introduction aux Session Beans
Common Gateway Interface
Oct.-2000DESS IIDEE © B. BAH 1 ASP Caractéristiques dun fichier ASP Son extension : « *.asp » La balise: Son indépendance vis à vis de toute plate–forme,
LOG 02 Bases de Données Avancées Rappels sur JSP / Servlet
Université de Versailles-Saint-Quentin
Etude des Technologies du Web services
XML-Family Web Services Description Language W.S.D.L.
M2 – MIAGE/SID Servlet M2 – MIAGE/SID
SERVLETS PRESENTATION
Serveurs Partagés Oracle
ASP.NET Par: Hugo St-Louis. C ARACTÉRISTIQUES A SP. NET Évolution, successeur plus flexible quASP (Active Server Pages). Pages web dynamiques permettant.
Gestion des bases de données
Composants web (web tiers)
Création d'un projet Web avec Netbeans
Programmation concurrente
PhP-MySQL Pagora 2012/2013 CTD 1 - Presentation de moi ^^
JSP (Java Server Pages)
1 CSI 2532 Lab6 Application Web et DB Février 27, 2012.
Document élaboré à Centrale Paris par Pascal Morenton LES TECHNOLOGIES DU WEB 1. LES PHASES D UN DEPLOIEMENT DE RESEAUX 2. LE LANGAGE HTML 3. LE LANGAGE.
J2EE vs .NET Réaliser par : SEIF ENNACER BADRA && CHETOUI RIM.
JEE 5 F.Pfister 2 institut eerie JEE – Une plateforme serveur  Développement et exécution d'applications réparties.
L’architecture J2EE
M2 – MIAGE/SID Servlet M2 – MIAGE/SID
‘‘Open Data base Connectivity‘‘
Les servlets Java Les bases de la génération dynamique HTML en Java Sébastien Limet etGérard Rozsavolgyi Licence Professionnelle
Module I-C3 : Applications Web IUT R&T 2e année
Présentation de CORBA et de IIOP
1 Architecture orientée service SOA Architecture orientée service SOA (Service Oriented Architecture)
Java Enterprise Edition, anciennement J2EE
Content Management System CMS. Pourquoi ? Obligation de ressaisir des contenus publiés à plusieurs endroits Pas d’outils de gestion de qualité de l’information.
Outil de gestion des cartes grises
Chapitre 2 Développement Web avec les technologies JSP/Servlets
Enterprise Java Beans 3.0 Cours INF Bases de Données Hiver 2005, groupe 10 Stefan MARTINESCU.
Architecture J2EE gfgfgfggf Khin Chhoung LAO, Cnam.
Le web service
Struts.
Module 3 : Création d'un domaine Windows 2000
Cours MIAGE « Architectures Orientées Services »Henry Boccon-GibodCours MIAGE « Architectures Orientées Services »Henry Boccon-Gibod 1 Architectures Orientées.
Les Servlets Présentation Cycle de vie Principe de fonctionnement
Les Java Server Pages Dans ce chapitre, nous allons :
CPI/BTS 2 Programmation Web Les sites dynamiques Prog Web CPI/BTS2 – M. Dravet – 02/10/2003 Dernière modification: 02/10/2003.
IFT 6800 Atelier en Technologies d’information Chapitre 5 Introduction aux Servelets & JSP.
Parquet Geoffrey 3 ARIL EXIA.CESI ARRAS. Présentation du MLD Présentation de la persistance Présentation récapitulatif du projet JSP/SERVLET MVC Cycle.
Transcription de la présentation:

UV J2EE Module Java Expert CURSUS DE FORMATION AUX NOUVELLES TECHNOLOGIES DE DEVELOPPEMENT UV J2EE

Module Java Vue d’ensemble de la technologie J2EE Les serveurs d’applications J2EE (JBoss)‏ Les applications Web Les JSP Les Servlets Les JavaBeans Le framework Struts ActionForm et Action Le fichier struts-config.xml Les Enterprise JavaBeans Les EJB Session L’accès aux sources de données Présentation de l’IDE Eclipse et des plugins J2EE Exercice : gestion d’un catalogue de produits en ligne

Présentation de J2EE Java 2 Platform, Enterprise Edition est une spécification parue officiellement à la conférence JavaOne en 1998 en même temps que les Enterprise JavaBeans. Il est né de besoins des entreprises pour développer des applications complexes distribuées et ouvertes sur l’Internet, exploitables dans un Intranet. Il possède une infrastructure d’ exécution appelée serveurs d’applications

Présentation de J2EE Java 2 Platform, Enterprise Edition inclut les API fondamentales Java suivantes: Les Enterprise JavaBeans (EJB) : composants métiers Les JavaServer Pages (JSP) et les Servlets : composants Web Java DataBase Connectivity (JDBC) pour l’accès aux bases de données relationnelles.

Présentation de J2EE Java Transaction Service (JTS) permet d’accéder à un service de transactions réparties. L’API Java Transaction (JTA) fournit une démarcation des transactions dans une application. Java Message Service (JMS) : pour accéder à divers services de messageries intra-applications et inter-applications. Java Naming and Directory Interface (JNDI) fournit un accès aux services de dénomination, DNS, LDAP. Remote Method Invocation (RMI) sur Internet Inter-ORB Protocol (IIOP) permet une invocation de méthodes à distance au-dessus du protocole IIOP de CORBA.

La plate-forme J2EE Serveurs d’applications J2EE : Un serveur d'applications est un serveur sur lequel sont installées les applications utilisées par les usagers. Ces applications sont chargées sur le serveur d'applications et accédées à distance, souvent par réseau. Les IHM (Interfaces Hommes-Machines) sont distribuées sur les postes clients ou via un client léger Dans une infrastructure N-tiers régulière, on peut déployer plusieurs serveurs d'applications: répartir la charge lorsque le nombre élevé de postes clients est une exigence critique redonder lorsque leur disponibilité est une exigence critique

La plate-forme J2EE Les serveurs d'applications sont des logiciels occupant la couche centrale dans une architecture multicouche: Une architecture classique 3-tiers (postes clients, serveur de données, serveur d'applications) Une architecture étendue (n-tiers) lorsqu'elle intègre des serveurs d'acquisition (données de terrain, données de process, de back-office, de gateways, de systèmes coopérants externes, etc.).

La plate-forme J2EE Environnement d'exécution de J2EE J2EE regroupe un certain nombre d'API, mais il présente également la caractéristique remarquable de faire abstraction de l'infrastructure d'exécution => Juste une spécification, ensuite implantée par les éditeurs logiciels qui mettent au point les serveurs d'applications Informatique distribuée "traditionnelle" = souvent problèmes liés non pas à la logique propre à l'application mais à la mise en œuvre de services complexes (threading, transactions, sécurité…)‏ J2EE introduit la notion de conteneur, et via les API J2EE, il élabore un contrat entre le conteneur et les applications C'est le vendeur du conteneur qui se charge de mettre en œuvre les services pour les développeurs d'applications J2EE, dans le respect des standards

J2EE dans les architectures à quatre niveaux Tiers Services Web Tiers Métier Tiers Données Tiers Interface Conteneur Applet Navigateur Conteneur EJB Conteneur Web Serveur Web Serveur Métier Serveur de bases de données Internet Bean Enterprise Applet/ HTML Application Web/JSP

Architecture J2EE - Conteneurs Un conteneur J2EE est un environnement d'exécution chargé de gérer des composants applicatifs et de donner un accès aux API J2EE Conteneur Web Conteneur EJB Servlets Java Entreprise Java Beans Entreprise Java Beans Entreprise Java Beans Clients Applicatifs Pages JSP RMI/IIOP JNDI JTA JDBC JMS JavaMail JAF RMI/IIOP JNDI JTA JDBC JMS JavaMail JAF Serveur d'applications J2EE BDDs et autres ressources

Le container Web Il fournit un environnement pour le développement, le déploiement et la gestion de l’exécution des Servlets et des JSP. Les Servlets et les JSP sont regroupés dans des unités de déploiement baptisées applications Web (webapp). Les WebApp implémentent la logique de présentation d’une application.

Les services du container EJB L’EJB Container est responsable de la fourniture de services aux beans, quelque soit leurs implémentations : Le support du mode transactionnel : spécifié lors de la déclaration du bean sans ajout de codes. La granularité pouvant descendre au niveau de la méthode. La gestion des multiples instances : les EJB sont développés de façon mono-client et exécutée en mode multi-clients: gestion de pool d’instances, gestion de cache, optimisation des accès ressources et données, etc. La persistance (obligatoire dans la spécification EJB 2.0). La sécurité par les ACL (Access Control List) au niveau du bean ou pour chaque méthode. Gestion de versions et administration des EJBs.

Les conteneurs via Java RMI Structure de répertoire qui permet d’obtenir des notions de transparence de la localisation des objets -- le code client utilise un nom pour trouver le serveur Code Client Implémente les “Factories” en utilisant des descriptions des objets activables Service Nommage Daemon Activation Client Stub réseau JVM associée au Groupe d’Activation Server Skeleton So this was what RMI provides out of the box. Pretty nice for small scale applications. But we saw that it was somewhat limited for larger scale applications. The registry is flat; the thread model is fixed; you have to provide a lot of services yourself. Objet Server Une JVM par ActivationGroup. Automatiquement lancée par le daemon d’Activation et peut contenir des serveurs semi-indépendants qui partagent des ressources (comme un pool de connexions) et qui ont les mêmes restrictions de sécurité

Architecture J2EE - Conteneurs Quelques services des conteneurs Gestion de la durée de vie des composants applicatifs Cette gestion implique la création de nouvelles instances de composants applicatifs ainsi que le pooling et la destruction de ces composants lorsque les instances ne sont plus nécessaires Pooling de ressources Les conteneurs peuvent à l'occasion mettre en œuvre le rassemblement des ressources, sous la forme, par exemple, de pooling d'objets ou de pooling de connections Peuplement de l'espace de noms JNDI avec les objets nécessaires à l'utilisation des API de services des conteneurs Clustering sur plusieurs machines Répartition de charge ou "Load Balancing" Sécurité ...

Développer des applications J2EE Constitution de composants applicatifs en modules Un module sert a empaqueter un ou plusieurs composants du même type L’application J2EE est une archive EAR contenant le descripteur de déploiement (application.xml), les modules Web et EJB Les modules Web incluent : Servlets, JSP, TagLibs, JARs, HTML, XML, Images... Empaquetés dans un fichier d'archive web, WAR Un WAR s'apparente à un JAR avec en plus un répertoire WEB-INF contenant le descripteur de déploiement web.xml Les modules EJB incluent : Les EJB (codes compilés) et leurs descripteurs de déploiement (ejb- jar.xml) Empaquetés dans une archive JAR Les modules Java du client : pour les clients Java, également une archive JAR avec le descripteur de déploiement application-client.xml

Développer des applications J2EE Constitution de modules en application Niveau le plus accompli : celui des applications Appli J2EE = ensemble de modules placés dans un fichier EAR (Entreprise Archive)‏ Appli J2EE (fichier EAR)‏ application.xml Module EJB Module Web Module Java Module EJB (fichier JAR)‏ Module Web (fichier WAR)‏ Module Java (fichier JAR)‏ ejb-jar.xml web.xml application-client.xml EJB EJB Servlet JSP Java Java

Développer des applications J2EE Déploiement d'applications Le déploiement consiste à installer et à personnaliser des modules empaquetés sur une plate-forme J2EE Deux étapes : Préparation de l'application (recopie des fichiers JAR, WAR, EAR..., génération des classes au moyen du conteneur, puis installation sur le serveur Configuration de l'application en utilisant les informations spécifiques au serveur d'applications Création de sources de données, fabriques de connexion...

Les Applications Web J2EE : les servlets Les JSP

Applications Web Serveur Client Serveur Web Internet/Intranet Environnement d ’exécution Source de données Script/programme serveur Client Requête (http,…)‏ 2e niveau Navigateur Web 3e niveau Réponse 1er niveau

Java Servlets Réponse de Java aux CGI Programmes s'exécutant sur le serveur Web et retournant des pages Web dynamiques Peuvent être chargés localement ou dynamiquement à travers le réseau

Gestion des servlets Moteur de Servlets Thread Servlet Créer un pool de threads Servlet Instancier la servlet Appeler la méthode init()‏ Initialisation Requête HTTP 1 Affecter une requête à un thread Appeler la méthode service()‏ Exécution service Requête HTTP 2 Affecter une requête à un thread Appeler la méthode service()‏ Exécution service Réponse HTTP 1 Réponse HTTP 2 Terminer le pool de threads Appeler la méthode destroy()‏

Servlets vs. applets Les servlets sont le pendant des applets du côté serveur mais sans interface graphique utilisateur … elle est limitée à la puissance du langage HTML … par contre, elles ne sont pas astreintes aux mêmes règles de sécurité que les applets peuvent établir une connexion avec d’autres clients (RMI, …)‏ peuvent faire des appels système (utilisation pont JDBC-ODBC)‏ ou manipuler des ressources locales (sur le serveur), ...

Définition d’une Servlet Servlets Les servlets sont des programmes côté serveur permettant d'embarquer la logique applicative dans le processus de réponse aux requêtes HTTP Elles permettent d'étendre les fonctionnalités du serveur Web afin d'intégrer du contenu dynamique dans HTML, XML et autres langages Web Avec J2EE, la spécification relative aux servlets a atteint la version 2.4

Modèle de programmation Une servlet doit implémenter l’interface javax.servlet.Servlet soit directement, soit en dérivant d’une classe implémentant déjà cette interface comme (GenericServlet ou HttpServlet )‏ Cette interface possède les méthodes pour : initialiser la servlet : init()‏ recevoir et répondre aux requêtes des clients : service()‏ détruire la servlet et ses ressources : destroy()‏

Structure de base d'une servlet import javax.servlet.*; public class first implements Servlet { public void init(ServletConfig config)‏ throws ServletException {…} public void service( ServletRequest req, ServletResponse rep)‏ throws ServletException, IOException {…} public void destroy() {…} }

Le cycle de vie 1. la servlet est créée puis initialisée (init() )‏ cette méthode n’est appelée par le serveur qu’une seule fois lors du chargement en mémoire par le moteur de servlet 2. le service du client est implémenté (service() )‏ cette méthode est appelée automatiquement par le serveur à chaque requête de client 3. la servlet est détruite (destroy() )‏ cette méthode n’est appelée par le serveur qu’une seule fois à la fin permet de libérer des ressources (allouées par init() )‏

Une servlet Web : HttpServlet Pour faciliter le traitement particulier des serveurs Web, la classe Servlet est affinée en javax.servlet.http.HttpServlet 2 méthodes remplacent service() de la classe mère : doGet() : pour les requêtes Http de type GET doPost() : pour les requêtes Http de type POST la classe servlet doit obligatoirement contenir l’une ou l’autre de ces 2 méthodes redéfinie, choisie selon le mode d’envoi du formulaire HTML qui l'exécute service() de HttpServlet appelle automatiquement la bonne méthode en fonction du type de la requête HTTP

Squelette d ’une servlet Http (GET)‏ import javax.servlet.*; import javax.servlet.http.*; public class SimpleServlet extends HttpServlet { public void init(HttpServletConfig c)‏ throws ServletException {…} public void doGet(HttpServletRequest req, HttpServletResponse res)‏ throws ServletException, IOException {…} public void destroy() {…} public String getServletInfo() {…} }

Les méthodes doGet() et doPost()‏ Utiliser les objets HttpServletRequest et HttpServletResponse passés en paramètres de ces méthodes pour implémenter le service : HttpServletRequest contient les renseignements sur le formulaire HTML initial (utile pour doPost()) : la méthode getParameter() récupère les paramètres d’entrée HttpServletResponse contient le flux de sortie pour la génération de la page HTML résultat (getWriter() )‏

Manipuler les servlets Web import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class SomeServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)‏ throws ServletException, IOException { // utiliser "request" pour lire les paramètres et cookies request.getParameter("nom du paramètre"); ... // utiliser " response" pour spécifier la réponse HTTP // (i.e. spécifier le content type, les cookies). PrintWriter out = response.getWriter(); // utiliser l’objet "out" pour envoyer du contenu au browser } Structure de base d'une servlet qui gere une requete de type GET : - chaque fois que l'utilisateur tape une URL dans le navigateur - ou clique sur un lien hypertexte

Un exemple package hall; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorld extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)‏ throws ServletException, IOException { PrintWriter out = response.getWriter(); out.println("Hello World"); out.flush(); }

Le descripteur de déploiement : web.xml se situe dans le répertoire WEB-INF/ de l’application Web <?xml version="1.0" encoding="ISO-8859-1"?> <!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> <servlet> <servlet-name>HelloWorld</servlet-name> <servlet-class>fr.ulco.HelloWorld</servlet-class> </servlet> <servlet-mapping> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app>

Les Applications Web J2EE : les servlets Les JSP

Principes de base et architecture JSP But des JSP : simplifier la création et l'administration des pages Web dynamiques, en séparant le contenu de la présentation Les pages JSP ne sont que des fichiers contenant du code HTML ou XML standard et de nouvelles balises de script Converties en servlet lors de leur toute première invocation L'objectif principal consiste à simplifier la couche de présentation dynamique via une architecture multiniveaux

JSP Du java dans une page WWW ! http://www.norsys.fr:8080/jsp/Test.jsp?titre=Les+JSP ... <I> <%= request.getParameter("titre") %> </I> Entre les balises JSP <% … %> On peut mettre des pages .jsp partout où l’on met des pages HTML Elles sont converties "au vol" en servlet par le moteur de JSP Du java dans une page WWW ! JSP combine le langage de marquage (HTML ou XML) avec des fragments de code Java, pour produire une page HTML dynamique. On peut mettre des pages .jsp partout où on met des pages HTML. Elles sont converties "au vol" en servlets En fait, sans le voir réellement, chaque page .jsp est une servlet (comme vous savez maintenant l ’écrire …) avec toute la partie HTML statique simplement renvoyée (écrite vers le flux de sortie) vers le browser client par la méthode « service ». Chaque page est automatiquement compilée en une servlet (par le moteur de JSP), a sa première demande, puis exécutée. Les développeurs appellent eux-même la première fois leurs nouvelles pages .jsp pour s ’assurer que le véritable premier utilisateur n ’attendra pas longtemps son accès a cause de la phase de compilation en servlets qui n ’aura pas été réalisée.

Un exemple simple <html><head><title>Un exemple de page JSP</title></head><body> <!-- définit les informations globales a la page --> <%@page language="java" %> <!-- Déclare la variable c --> <%! String c = ""; %> <!-- Scriplet (code java) %> <% for(int i = 0; i < 26; i++){ for(int j = 0; j < 26; j++){ c = "valeur : " + i*j + "<BR>"; %> <%= c %> <% } <br> <% } </body></html> Cet exemple génère les majuscules de l ’alphabet 26 fois et en change la première. <%= c %> génère la valeur de c.toString() dans la page HTML

Structure d’une page JSP La structure d'une page JSP est le subtil mélange d'une servlet et de balises HTML, auquel a été ajouté une pincée de code Java entre des balises <% et %> et un zeste de balises XML Balises JSP se divisent en trois catégories les éléments de script : permettent d'insérer du code Java dans une page JSP les directives : elles influencent la structure globale de la servlet issue de la conversion les actions : il s'agit de balises spéciales servant à modifier le comportement du code JSP durant son exécution On peut également créer ses propres balises : les taglibs!

Règles générales Certaines règles générales s'appliquent aux pages JSP les balises JSP sont sensibles à la casse les directives et les éléments de script obéissent à une syntaxe qui ne repose pas sur XML (une syntaxe de type XML peut également être utilisée)‏ les valeurs des attributs dans les balises apparaissent toujours entre guillemets les URLs présentes dans les pages JSP respectent les conventions de la servlet si une URL commence par /, nomme chemin relatif de contexte, elle est interprétée en fonction de l'application Web à laquelle la JSP appartient, sinon elle est interprétée en fonction du code JSP courant

Directives JSP Les directives JSP sont des messagers envoyés par le code JSP au conteneur JSP Elles servent à définir les valeurs globales, telles que les déclarations de classes, les méthodes à mettre en œuvre, le type de contenu produit... Elles ne produisent aucune sortie à envoyer au client La portée des directives concerne l'intégralité du fichier JSP Les directives commencent par une balise <%@ et finissent par %> La syntaxe générale est la suivante : <%@ nomdirective attribut="valeur" attribut="valeur" %>

Directives JSP On peut utiliser trois directives principales dans les pages JSP La directive page la directive include la directive taglib

Directives JSP La directive page Elle est utilisée pour définir et manipuler un nombre important d'attributs des pages et qui influencent le fichier JSP dans sa totalité Elle sert également à communiquer ces attributs au conteneur La syntaxe générale de la directive page est la suivante : <%@ page ATTRIBUTS %> Elle peut par exemple contenir les imports des paquetages et classes nécessaires au code Java contenu, les attributs de session, le niveau de sécurité des threads...

La directive : page Valeurs possibles : <%@ page language="java" <%@ page import="java.util.*, java.net.*" %> <%@ page contentType="text/plain" %> <%@ page session="true|false " %> <%@ page errorPage="pathToErrorPage" %> <%@ page isErrorPage="true|false" %> <%@ page … <%@ page language="java" indique au serveur le langage utilisé dans le fichier. Java est la seule syntaxe prise en charge pour le moment. <%@ page import="java.util.*, java.net.*" %> - idem à toute première section de programme Java, - à placer au début du fichier JSP <%@ page contentType="text/plain;charset=ISO-8859-1" %> type MIME et jeu de caractères de la page JSP <%@ page session="true|false " %> si "true", la page peut accéder aux données de session <%@ page errorPage="pathToErrorPage" %> - chemin relatif de la page JSP pour les exceptions non gérées - isErrorPage doit etre à true

Directives JSP La directive include Elle ordonne au conteneur d'insérer le contenu de la ressource dans la page JSP courante, en l'imbriquant à la place de la directive La syntaxe de la directive include est la suivante : <%@ include file="nomfichier" %> Le fichier inclus peut être une ressource statique (tel qu'un fichier HTML) ou une autre page JSP Exemple : <html> <head> <title>Page de test 1 de la directive include</title> </head> <body> <h1> Page de test 1 de la directive include</h1> <%@ include file="/test.html" %> <%@ include file="/jspTest.jsp %> </body> </html>

Directives JSP La directive taglib Elle permet à la page d'utiliser des extensions de balises (voir fin cours)‏ Le conteneur exploite cette bibliothèque de balises afin de savoir ce qu'il doit faire lorsqu'il rencontre des balises personnalisées dans la page JSP La syntaxe de la directive taglib est la suivante : <%@ taglib uri="tagLibraryURI" prefix="tagPrefix" %> On ne le fera pas dans ce cours (manque de temps), mais ce mécanisme permet de créer des balises personnalisées qui correspondent en fait a des classes Java Les taglibs permettent de séparer la présentation du code de manière optimale

Eléments de script Les éléments de script permettent l'insertion dans la JSP de code Java, de déclarations de variables ou de méthodes, de scriptlets (code Java arbitraire) et d'expressions Déclarations Bloc de code Java dans une page JSP utilisé pour définir des variables et des méthodes de classe dans une servlet générée Initialisées lors de l'initialisation de la page JSP Portée de "classe" dans la servlet générée : accessible via la page JSP à d'autres déclarations, expressions et fragments de code Délimitée par <%! et %> et n'envoie rien dans le flux de sortie Scriptlets Bloc de code Java exécuté au cours du processus de traitement de la requête, et qui se trouve entre des balises <% et %> Peuvent produire une sortie vers le client Peuvent modifier les objets en interne à l'aide des méthodes

Eléments de script : les déclarations <%! private int accessCount = 0; private int incrementCount() {return accessCount++;} %> ... <H2>Nombre et liste des articles</H2> Nombre d'articles : <%= incrementCount() %> définitions des méthodes et variables de classe à utiliser dans toute la page définit les méthodes jspInit() et jspDestroy()‏

Eléments de script : les scriptlets <% code Java %> (scriplets)‏ <% String nom = request.getParameter("nom"); ... out.println("Nom de l'utilisateur " + nom); %> c'est un bloc de code Java placé dans _jspService() de la servlet générée ayant accès : aux variables et beans déclarés ( <%! … %> )‏ aux objets implicites (voir plus loin)‏ <% Java code %> (scriplets)‏ Ce code est place dans la methode _jspService() de la servlet generee. Le code defini dans une scriplet a acces : - aux variables et aux composants Java (beans) declares, - une ribambelle d ’objets implicites, a partir de l ’environnement de la servlet comme : - request - response, ...

Eléments de script Expressions Une expression est une notation courte d'une scriptlet qui renvoie la valeur d'une expression vers le client L'expression est évaluée lors du traitement de la requête HTTP, le résultat est converti en String puis il est affiché Délimitée par des balises <%= et %> Si le résultat de l'expression est un objet, la conversion est exécutée à l'aide de la méthode toString() de l'objet La syntaxe est la suivante : <%= expression Java à traiter %>

Eléments de script : les expressions Il est <%= new java.util.Date() %> <P> et votre hostname est <%= request.getRemoteHost() %> permet d’intégrer des valeurs dans le code HTML ces valeurs sont évaluées, converties en chaînes de caractères et affichées les objets implicites (request, response, session, out, ...) disponibles <%= expression %> L ’expression ne termine pas par un ; car le moteur JSP la place dans un appel out.println().

Actions standard Les actions standard sont des balises qui affectent l'exécution de la page JSP et la réponse renvoyée au client Elles doivent être fournies par tous les conteneurs Une action standard est en réalité une balise incorporée dans une page JSP Au cours de la compilation de la servlet, le conteneur rencontre cette balise et la remplace par le code Java correspondant à la tache prédéfinie requise Par exemple, s'il rencontre une action include standard <jsp:include page="myJsp.jsp" flush="true" />

Actions standard Elles servent à offrir aux auteurs des pages JSP des fonctionnalités de base qu'ils peuvent exploiter afin d'exécuter des taches courantes Les types d'actions standards sont les suivants : <jsp:useBean> <jsp:setProperty> <jsp:getProperty> <jsp:include> <jsp:forward> <jsp:plugin>

Actions standard <jsp:useBean> Pour séparer le code de la présentation, il est conseille d'encapsuler le code dans un objet Java (un JavaBean), puis de l'instancier et de l'utiliser au sein de la page JSP <jsp:useBean> permet de créer ou de localiser une instance d'un bean donne, d'en définir la durée de vie... La syntaxe de l'action useBean est la suivante : <jsp:useBean id="name" scope="scopeName" beandetails /> ou beandetails est au choix class="className" class="className" type="typeName" beanName="beanName" type="typeName" type="typeName"

Actions standard <jsp:setProperty> Utilisée pour fixer les propriétés d'un bean Il est possible de définir les propriétés d'un bean de plusieurs manières : au moment de la requête, à l'aide de l'objet request au moment de la requête, avec une expression évaluée à l'aide d'une chaîne spécifiée (ou codée physiquement) dans la page La syntaxe de l'action setProperty est la suivante : <jsp:setProperty name="beanName" propertydetails /> ou propertydetails est au choix : property="*" property="propertyName" property="propertyName" param="parameterName" property="propertyName" value="propertyValue"

Actions standard <jsp:getProperty> Utilisée pour accéder les propriétés d'un bean Accède à la valeur d'une propriété, la convertit en String et l'envoie vers le flux de sortie, puis vers le client La syntaxe est la suivante : <jsp:getProperty name="name" property="propertyName"/> et les attributs sont les suivants : name : Nom de l'instance du bean property : Nom de la propriété a obtenir

Usebean et getProperty Mécanisme très puissant ! <jsp:useBean id="name" (référence l'instance du composant)‏ class="paquetage.class" (nom qualifié de la classe)‏ scope="page|request|session|application" (portée) /> Pour lire une propriété du bean : <jsp:getProperty name="name" property="property" /> <jsp usebean id="name" : nom servant à référencer l'instance du composant dans la page. D'autres balises utilisent name pour se référer à cet id class="package.class" : nom entièrement qualifié de la classe; inutile d'importer ces classes dans la directive page scope="page" : portée de l'objet PageContext; elle s'étend jusqu'à la fin de la page; l'état n'est pas stocké. "request" : l'instance du composant dure pendant la requête cllient "session" : le composant dure autant que la session; une référence est disponible par HttpSession.getValue(); ne pas utiliser si la directive de page session est déclarée comme false "application" : l'instance du composant est crée avec l'application et dure jusqu'à sa fin.

Usebean et setProperty Pour modifier une propriété du bean : <jsp:setProperty name="name" property="property" value="value" /> property="*" /> Initialise tous les attributs de l ’objet name avec les paramètres HTTP du même nom En 2 lignes !

Exemple d'utilisation d'un bean La page JSP : <html> ... <jsp:useBean id="test" class="test.SimpleBean" /> <jsp:setProperty name="test" property="message" value="Hello !!" /> <h1>Le message est : <i> <jsp:getProperty name="test" property="message" /> </i></h1>… </html>

Actions standard <jsp:include> Permet l'insertion dans la page JSP courante, au moment du traitement de la requête, de ressources statiques ou dynamiques Même fonctionnement que le Dispatcher de servlets Une page incluse ne peut définir ni en-tête ni cookie La syntaxe est la suivante : <jsp:include page="URL" flush="true"> <jsp:param name="name" value="value"/> </jsp:include> Ou : URL : La ressource a inclure flush : toujours true ! Les paramètres passes dans les balises <jsp:param> sont accessibles a la ressource qui est incluse au travers l'objet request transmis

Actions standard <jsp:forward> Permet le transfert de la requête vers une autre page JSP, une autre servlet ou une ressource statique La syntaxe est la suivante : <jsp:forward page="URL"> <jsp:param name="name" value="value"/> </jsp:forward> La ressource vers laquelle la requête est transférée doit se trouver dans le même contexte que la page JSP qui émet la requête Il s'agit d'une redirection cote serveur qui prend en compte des paramètres supplémentaires

Actions standard <jsp:plugin> Utilisée dans les pages pour générer des balises HTML propres au navigateur client Cette action a pour conséquence de télécharger le plug-in Java par exemple, puis d'exécuter l'applet ou le composant JavaBean spécifié dans la balise S'accompagne parfois de deux balises supplémentaires : <jsp:params> afin de transmettre des paramètres supplémentaires a l'applet ou au JavaBean <jsp:fallback> afin de spécifier le contenu a afficher dans le navigateur client si le plug-in ne peut pas démarrer

Objets Implicites L'API servlet inclut des interfaces qui établissent des couches d'abstraction pratiques pour le developpeur HttpServletRequest, HttpSession... Ces interfaces représentent les données HTTP et fournit les méthodes appropriées pour les manipuler JSP propose certains objets implicites, reposant sur l'API Servlet Ces objets sont accessibles via des variables standard et sont automatiquement disponibles pour vos pages JSP sans que vous ayez besoin de rajouter du code

Objets Implicites Les objets implicites disponibles dans une page JSP sont les suivants : request : représente l'objet HttpServletRequest response : représente l'objet HttpServletResponse pageContext : point d'accès pour de nombreux attributs de page session : l'objet HttpSession application : contexte de servlet ServletContext out : le flux de sortie JspWriter (idem response.getWriter())‏ config : l'objet ServletConfig pour cette page page : instance de la classe de servlet d'implémentation qui traite la requête en cours

L’objet session Très simple avec l'API des servlets (JSDK)‏ Principe : Un objet "session" peut être associé avec chaque requête Il va servir de "container" pour des informations persistantes Durée de vie limitée et réglable

Modèle basique HttpSession session = request.getSession(true); Caddy caddy = (Caddy) session.getValue("caddy"); if(caddy != null) { // le caddy n'est pas vide ! afficheLeContenuDuCaddy(caddy); } else { caddy = new Caddy(); ... caddy.ajouterUnAchat(request.getParameter("NoArticle")); session.putValue("caddy", caddy); }.... HttpSession session = request.getSession(true); Obtient l'objet "session". A faire AVANT toute écriture de données dans le flot de sortie de la servlet. "true" : crée une nouvelle session pour cette requete s'il n'en n'existe pas déjà une. L'objet HttpSession sert de "bulletin d'information" en ligne, sur lequel les servlets peuvent déposer des objets accessibles par la suite par d'autres servlets. Tout type d'objet (à l'exception des types élémentaires de données) peut être placé sur un HttpSession. Une fois l'objet placé, un nom (simple chaîne) lui est attribué pour permettre aux servlets de l'identifier.

Méthodes de la classe HttpSession getID()‏ isNew()‏ getCreationTime() / getLastAccessedTime()‏ getMaxInactiveInterval()‏ … getValue(), removeValue(), putValue()‏ invalidate()‏ getID : genere l'ID de session. Utile quand on a recours à la méthode de réécriture d'URL pour identifier la session getCreationTime : heure de création de la session getLastAccessedTime : l'heure de la requête précédente qui comportait cet Id de session isNew : true si session créee par serveur mais pas encore renvoyée vers le navigateur getMaxInactiveInterval : retourne le délai pdt lequel la session va rester active entre les requetes invalidate : supprime manuellement la session en cours. Par défaut, une session est détruite par le système toute les 30 mn.

Le Framework Struts

Le framework Struts Implémentation Open source du framework MVC 2, proposée par le groupe Apache (jakarta.apache.org)‏ Le framework contient : Controller (servlet)‏ Des classes“Action” Des librairies de tags JSP personnalisés Des classes utilitaires pour le traitement XML et le remplissage de composants JavaBean Version 1.1 Développement très actif

Le pattern Model-View-Controller (MVC 2)‏ JSP (View)‏ Réponse Controller Datastore Requête Browser

Les composants de Struts Controller – L’ActionServlet est responsable de la gestion de toutes les requêtes clientes. Elle effectue le mapping avec des actions définies dans le fichier struts-config.xml. Action – Les actions sont définies par extension de la classe Action. Les Actions exécutent les traitements et accèdent à la partie métier (voire données). Model – Les ActionForm peuvent être étendues pour définir des propriétés permettant le stockage des données d’un formulaire et les réponses. Il s’agit d’un JavaBean (getters/settters)‏ View – Les pages JSP basées sur les librairies de tags Struts.

Struts modélisé en UML

Séquence des échanges en Struts ActionForm (2) Mapping HTML (4) transfert (3) appelle EJB/DB ActionServlet Action (5) Accès modèle Requête HTTP struts-config.xml Browser (1) lit (6) redirige JSP Réponse HTTP

La Vue Il est possible de débuter la création de la webApp Struts par les vues à l’aide de pages JSP Il est nécessaire d’utiliser les taglibs struts pour la gestion des éléments des formulaires Le tag logic offre de nombreuses possibilités : equal, iterate

Exemple de Vue (View)‏ <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %> <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %> <head> <title>Page Title</title><html:base/></head> <html:form action=“action.do"> <html:text property="name" size=“50" maxlength=“50"/> <logic:equal name=“sampleForm" property="currentAction" value="Add"> <html:text property=“description" size="100" maxlength="100"/> </logic:equal> </table> </html:form> <logic:iterate id=“names" name=“sampleForm" property=“nameList"> <TR><TD><bean:write name=“names" property=“firstName" /></TD> </TR> </logic:iterate> </body></html>

Le Modèle Les Beans, qui implémentent le modèle, ne doivent pas comporter d’informations concernant les écrans dans lesquels ils sont utilisés. L’extension de la classe ActionForm permet de : créer et remplir automatiquement le modèle d’intégrer facilement les présentations (JSP) du modèle Le modèle doit proposer des getters et setters : propriétés Les ActionForms peuvent proposer une validation par défaut à l’aide de la méthode validate().

Exemple de Modèle import org.apache.struts.action.*; import java.util.ArrayList; public class ErrorMessageForm extends ActionForm { private String name; private String description; private ArrayList names; public String getName() { return name; } […] public ArrayList getNames(){ return names; public void setNames(ArrayList names){ this.names = names;

Le Controller Traduit des noms logiques (chaînes de caractères) en mappings via le fichier de configuration struts-config.xml Il gère le flot de contrôle de l’application (chef d’orchestre)‏ Charge et instancie les beans Remplit les beans avec les valeurs issues des requêtes Transmet les beans à l’action appropriée Utilise un objet ActionForward pour déterminer la destination de la réponse (le choix de la vue ou d’une autre action)‏ Gère les erreurs

Le fichier struts-config.xml <form-beans> <form-bean name=“sampleForm" type=“SampleForm"/> </form-beans> … <action path="/SamplePage" type=“SampleAction" validate="false" input="/sample.jsp"> <forward name="success" path="/sample.jsp"/> </action>

L’Action Actions savent où elles seront utilisées Elles sont invoquées via leur mapping dans le fichier struts-config.xml Elles peuvent créer des ActionErrors lors d’erreurs, et renvoyer un nom logique (forward) vers un mapping Les actions accèdent à la partie métier ou données.

Exemple d’Action Struts 1.0 import org.apache.struts.action.*; import javax.servlet.http.*; public final class SampleAction extends Action { public ActionForward perform( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, javax.servlet.ServletException { //cast le form vers la bonne classe du bean SampleForm sample = (SampleForm) form; ActionErrors errors = new ActionErrors(); //effectuer les appels aux traitements métiers, modifier les données , // si des problèmes surviennent, utiliser errors.add(...); if( !errors.empty() ) { saveErrors(request,errors); return new ActionForward(mapping.getInput()); } else { sample.setCurrentAction("Add"); return mapping.findForward("success"); } } }

Exemple d’Action Struts 2 package tutorial; import com.opensymphony.xwork2.ActionSupport; public class HelloWorld extends ActionSupport { public static final String MESSAGE = "Struts is up and running ..."; public String execute() throws Exception { setMessage(MESSAGE); return SUCCESS; } private String message; public void setMessage(String message){ this.message = message; public String getMessage() { return message;

Struts Config 2.0 <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="tutorial" extends="struts-default"> <action name="HelloWorld" class="tutorial.HelloWorld"> <result>/HelloWorld.jsp</result> </action> <!– Ajouter d’autres actions --> </package> </struts>

Les Enterprise JavaBeans

Le modèle EJB Le modèle Enterprise JavaBeans est basé sur le concept Write Once, Run Everywhere pour les serveurs. Le modèle EJB repose sur l’architecture en couches suivante : L’EJB Server contient l’EJB Container et lui fournit les services de bas niveau. L’EJB Container est l’environnement d’exécution des composants Enterprise JavaBeans (interface entre le bean et l’extérieur). Les clients ne se connectent pas directement au bean, mais à une représentation fournie par le conteneur. Celui-ci route les requêtes vers le bean.

Les règles métier Les applications à base d’EJB organisent les règles métiers en composants : une entité métier représente les informations conservées par l’Entreprise un processus métier définit les interactions d’un utilisateur avec des entités métier. Les règles business peuvent être extraites et placées dans un moteur de règles (système expert, etc.), puis manipulées via un EJB : nouvelles tendances.

L’entité métier Elle possède un état, conservé en permanence (SGBD), modifié généralement par les processus métier. Exemple: Une entité Commande encapsulera les données des commandes d’un client avec ses règles métiers (i.e. formatage du N° de commande, vérification du compte du client, etc.)‏

Le processus métier Il modifie l’état des entités métier et possède son propre état, souvent provisoire. Un processus métier est dédié à un acteur (utilisateur ou programme) qui engage une conversation avec le système : processus métier conversationnel Exemple : Une personne qui retire de l’argent à un distributeur communique avec le DAB au travers de plusieurs écrans. Ceux-ci guident le processus visant à valider la transaction et à distribuer l’argent.

Les types de beans Enterprise Les entités et processus métier sont implémentés au choix par trois types de beans : les beans entité : créés pour vivre longtemps et être partagés par plusieurs clients, souvent utilisés pour la gestion des données, les beans session : créés en réponse aux requêtes d’un seul ou de plusieurs clients, souvent utilisés dans les processus. les beans orientés messages pour gérer la communication inter-composants Les EJBs orientés messages sont une classe à part des EJBs et sont définis en relation avec l’API Java Message Service

Les beans et les transactions Dans une application J2EE, on utilise des transactions pour : combiner l’envoi et la réception de messages (JMS), Effectuer des mises à jours de bases de données et Réaliser d’autres opérations de gestion de ressources (EAI). Ces ressources peuvent être accédées à partir de multiples composants d’application à l’intérieur d’une même transaction. Par exemple: une servlet peut démarrer une transaction pour accéder à de multiples bases de données, invoquer un enterprise bean qui envoi un message JMS, invoquer un autre enterprise bean pour modifier un ERP en utilisant l’architecture J2EE Connector, et finalement faire un commit de la transaction.

Les beans et les transactions Les transactions distribuées peuvent être de deux types : Container-managed transactions. Le conteneur EJB contrôle l’intégrité de vos transactions sans que vous deviez effectuer un commit ou un rollback. Les CMT sont recommandées pour les applications J2EE qui utilisent JMS. Vous pouvez spécifier des attributs de transaction pour les méthodes des beans. Utiliser l’attribut Required pour s’assurer qu’une méthode fait partie d’une transaction. Lorsqu’une transaction est en cours et qu’une méthode est appelée, celle-ci sera incluse dans la transaction; si aucune transaction n’est en cours, alors une nouvelle transaction sera démarrée avant l’appel de la méthode et sera validée (commit) lorsque la méthode sera terminée. Bean-managed transactions. Elles permettent au bean de contrôler finement les transactions via l’interface javax.transaction.UserTransaction, permettant d’utiliser ses propres méthodes de commit et de rollback afin de délimiter les frontières des transactions.

Définition du Bean de Session Un bean session représente un simple client J2EE, celui-ci invoque les méthodes du bean pour accéder aux services de l’application J2EE. Pour accéder à une application déployée sur un serveur, le client invoque les méthodes du bean session. Il réalise le travail du client, en lui cachant la complexité applicative en exécutant des opérations métiers à l’intérieur du serveur.

Type de beans Session? Les beans ne sont pas persistants et ne sont pas partagés par les clients. Il existe deux types de bean session : Un bean session est utilisé pour mettre en place une communication avec état (stateful) entre un client et un serveur. Un bean session sans état (stateless) ne conserve pas l’état de la communication avec le client.

La session stateful L’état d’un objet consiste en les valeurs de ses variables d’instance. Dans un bean stateful, les variables d’instance représentent : l’état d’un unique client, car le client interagit (" parle ") avec son bean, cet état est appelé l’état conversationnel. L’état est maintenu pendant la durée de la session du bean client. Si le client supprime le bean (remove) ou quitte la connexion, la session se termine et l’état disparaît.

Quand utiliser les beans session? En règle générale, on utilise un bean session dans les circonstances suivantes : A n’importe quel moment, un unique client a accès à l’instance d’un bean. L’état d’un bean n’est pas persistant, car il n’existe que pour une courte période de temps (de l’ordre de quelques heures).

Quand utiliser un bean Session? Pour implanter la logique session d’applications Web. Par exemple : saisir les renseignements de livraison et de facturation concernant un client via des pages JSP. Pour implanter la logique session d’applications classiques. Par exemple : saisir les renseignements de livraison et de facturation concernant un client, utilisant JFC/Swing (application cliente).

Quand utiliser les beans session Stateful? Les beans session stateful sont appropriés dans les conditions suivantes: L’état du bean représente l’interaction entre le bean et un client spécifique. Le bean a besoin de conserver des informations concernant le client à travers les différentes invocations de méthodes. Le bean est un médiateur entre le client et les autres composants de l’application, présentant ainsi une vue simplifiée au client. Derrière la scène, le bean gère le work flow de plusieurs beans enterprises.

Etat des Beans Sessions stateful Objets sessions (répartis)‏ Instances sessions (avec état)‏ Container EJB délègue toujours à la même instance obj1: nom (Remote)‏ Client 1 inst1: nomBean obj2: nom (Remote)‏ Client 2 inst2: nomBean obj3: nom (Remote)‏ Client 3 inst3: nomBean

Quand utiliser les beans session Stateless? Pour améliorer la performance, on peut choisir un bean stateless pour les raisons suivantes : L’état du bean ne possède pas de données relatives à un client en particulier. Lors d’une simple invocation de méthode, le bean réalise une tâche générique pour tous les clients. exemple, on peut utiliser une bean stateless pour envoyer un e- mail qui confirme une commande en ligne. Le bean extrait d’une base de données un ensemble de données en lecture seule, qui est souvent utilisé par les clients (cache). Un tel bean peut récupérer les lignes d’une table qui représentent les produits qui ont été vendus ce mois.

Etat des Beans Sessions stateless Un seul Objet session (réparti)‏ Instances sessions (sans état)‏ Container EJB délègue à n’importe quelle instance disponible Client 1 inst1: nomBean obj2: nom (Remote)‏ Client 2 inst2: nomBean Client 3 inst3: nomBean

La session stateless Comme les beans stateless peuvent supporter de multiples clients, ils permettent d’offrir une meilleure extensibilité des applications J2EE. En fait, une application J2EE ne nécessite que très peu de beans stateless par rapport aux beans stateful pour supporter la même charge de clients. Le conteneur EJB n’écrira jamais de beans stateless en mémoire secondaire. Ainsi, ils peuvent offrir de meilleures performances que les beans stateful.

Les clients vis-à-vis du conteneur EJB Utiliser JNDI pour trouver un composant : Home Java Naming and Directory Interface Abstraction des services de nommage (CosNaming, etc.) et des services d’accès aux structures arborescentes (répertoires, annuaire LDAP, etc.)‏ Accès aux services du composant : Remote Appeler les méthodes du composant à distance pour réaliser les services. EJB Container Home Remote Client Code JNDI Stub So this is a conceptual view of the EJB universe. From the client’s point of view. When I say “use home to create Remote”, I’m saying what the client thinks he or she is doing. There’s no guarantee that calling a create method will cause an object to be created (the container might have already created it and, in that case, the container may simply vend it. This is especially the case for Entity Beans).

Cycle de vie d’un EJB Définir le type de l’EJB : Développer le bean Un EJB session, Un EJB Entité Un EJB message Développer le bean Ecrire l’interface Home et l’interface Remote Implémenter les services du bean dans une classe Déployer le bean sur un serveur d’applications Créer une description du déploiement (souvent en XML)‏ Nommer l’EJB (souvent un JNDI name)‏ Assembler l’EJB dans un fichier jar (+ librairies, + classes utilitaires)‏ Utiliser l’outil de déploiement du serveur d’applications Attendre que l’EJB soit sollicité par une requête. So it’s a similar sequence of steps to both CORBA and RMI. You still have to do the same steps, more or less. It’s just that, when we’re done, we’ll have a much more flexible and robust application for the effort expended. This time round, we’ll do the bank example.

Structure des Beans Enterprise La classe bean enterprise est une classe Java: les méthodes métiers et les méthodes du cycle de vie d ’un objet, nom de la classe : nomEJB L ’API client-vue : interface home : create(), remove(), find() (uniquement Entité) et nom de la classe : nomHome interface remote: nom de la classe : nomRemote (Sun préconise nom)‏

Structure d’un Bean Enterprise Session <<Interface Home>> MonEJB_Home <<Interface Remote>> MonEJB_Remote create()‏ remove()‏ AjouterUnProduit()‏ Acheter()‏ métier <<classe bean enterprise>> MonEJB_EJB ejbCreate()‏ ejbRemove()‏ AjouterUnProduit()‏ Acheter()‏ métier

Interface Bean Home Elle contrôle le cycle de vie des objets EJBs. Les méthodes permettent de créer, de localiser, et de supprimer des EJBs. Elles sont héritées des interfaces javax.ejb.EJBHome et java.rmi.Remote

L’Interface Home Associée à un “Objet Home” qui est automatiquement généré par le conteneur EJB Il sera nécessaire de définir les implémentations des méthodes dans la classe de l’EJB: create => ejbCreate La création effective de l ’EJB est réalisée par le constructeur de MonEJB (initialisation de l’état par défaut de l’EJB). La méthode create ne remplace pas le constructeur de l’objet, elle sert uniquement à initialiser et charger les ressources de l’EJB, etc.

Interface Bean Home Il peut y avoir plusieurs méthodes create() avec un nombre de paramètres variables. Un client récupère l’interface Remote du bean créé. Les méthodes create retournent soit l’interface Remote, soit une collection de telles interfaces.

Exemple de bean Home import java.rmi.*; import javax.ejb.*; public interface MonEJB_Home extends javax.ejb.EJBHome { public MonEJB_Remote create(String nomclient)‏ throws RemoteException, CreateException; public void remove(Handle handleEJB)‏ throws RemoteException, RemoveException; }

Interface Bean Remote Elle définit les méthodes métiers qu’un client peut appeler sur chaque objet bean enterprise. Le Bean hérite des interfaces javax.ejb.EJBObject et java.rmi.Remote

L’ Interface Remote Elle définit les méthodes qui peuvent être appelées par les clients Les méthodes sont appelées sur des “Objets distants” qui sont automatiquement générés par le conteneur EJB Pas de conventions de nommage Il est obligatoire d’implémenter dans la classe MonEJB les méthodes déclarées dans cette spécification du métier de l’EJB.

Interface Bean Remote import java.rmi.*; import javax.ejb.*; public interface MonEJB_Remote extends javax.ejb.EJBObject { boolean AjouterUnProduit(int numeroProduit)‏ throws java.rmi.RemoteException; boolean Acheter()‏ }

Classe Bean Enterprise (session)‏ Elle spécifie des méthodes à implémenter pour la création, la suppression des objets métiers et les méthodes métiers. Les méthodes métiers accèdent aux classes utilitaires (métiers). La classe du bean session doit : être déclarée public, contenir un constructeur publique sans paramètres, ne pas être final ou abstract ne pas définir de destructeurs (finalize)‏ La classe du bean session implémente l’interface javax.ejb.SessionBean

Interface Bean Enterprise import java.rmi.*; import javax.ejb.*; public class MonEJB_EJB implements SessionBean { public MonEJB_EJB(){ super(); } public boolean AjouterUnProduit(int numeroItem) { // le code pour ajouter des items au panier // peut se connecter via JDBC. } public boolean Acheter() { // le code pour acheter.} public void ejbCreate(String nomClient) { // code d ’initialisation de l ’objet } //… plus les méthodes héritées de SessionBean

Connexion à un bean session Le client d’un EJB session devra récupérer l’interface Home de l’EJB via JNDI InitialContext ic = new InitialContext(); MonEJB_Home objhome = (MonEJB_Home) ic.lookup(" nom jndi de ejb "); Il devra impérativement effectuer un appel à la méthode create() pour récupérer une référence sur l’EJB (remote). MonEJB_Remote objremote = objhome.create(); Ensuite il sera possible d’invoquer les méthodes métiers de l’EJB. objremote.Acheter();

Les EJB 3.0 Le développement d'EJB a longtemps été fastidieux, nécessitant même des outils de génération automatique de code basés : sur des modèles UML ou sur du code Java agrémenté de commentaires spécifiques (cf. XDoclet). Cette nouvelle mouture élimine de nombreuses redondances tant au niveau du code des composants qu'au niveau de leur configuration. Le développement des EJB 3.0 s'exprime au sein du code source par le biais d'annotations (ou "méta-données"). Le code client a été simplifié au passage, rendant caduque l'utilisation de la notion de Home une Abstract Factory de composants qui était implémentée par le conteneur jusqu'à la version EJB 2.1.

Architecture EJB 3.0

Exemple EJB 3.0 package service.implementation; import java.util.List; import javax.ejb.Remote; import javax.ejb.Stateless; import javax.ejb.TransactionAttribute; import javax.ejb.TransactionAttributeType; import javax.jws.WebMethod; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import business.Signet; import business.Categorie; @Remote @Stateless // Sous entendu : session stateless @SOAPBinding     (style = SOAPBinding.Style.DOCUMENT,     use = SOAPBinding.Use.LITERAL,     parameterStyle = SOAPBinding.ParameterStyle.WRAPPED)     @WebService     (name = "EndpointInterface",     targetNamespace = "http://www.deruelle.fr/GestionSignets",     serviceName = "MoteurRecherche")    

Exemple EJB 3.0 public class MoteurRechercheBean implements Catalog { @TransactionAttribute(TransactionAttributeType.SUPPORTS)     @WebMethod     public List<Signet> rechercherTousSignets(){         // ...     }     @TransactionAttribute(TransactionAttributeType.SUPPORTS)     @WebMethod     public String rechercherURL(Signet s){         // ...     }         @TransactionAttribute(TransactionAttributeType.SUPPORTS)     @WebMethod     public List<Signet> rechercherSignets(String categorie){         // ...     }         @TransactionAttribute(TransactionAttributeType.SUPPORTS)     @WebMethod     public List<Signet> rechercherSignetsParTitre(String partieTitre){         // ...     }         @TransactionAttribute(TransactionAttributeType.SUPPORTS)     @WebMethod     public List<Signet> rechercherSignetsParURL(String partieURL){         // ...     } }

Les annotations pour EJB 3?0 L'annotation @Remote exprime le fait que notre composant est invocable par RMI @Stateless permettra au conteneur de composants d'optimiser le recyclage des instances de composants. @SoapBinding et @WebService gèrent le paramétrage protocolaire et l'encodage XML à employer lorsque le composant est sollicité par SOAP @WebMethod permet d'indiquer quelles méthodes peuvent être invoquées à distance par le protocole SOAP. Dans notre exemple, nous avons exposé toutes les méthodes; l'interface WSDL sera déduite de ce code par le conteneur d'EJB et reflétera ce choix. N.B: Dans la pratique, on n'expose pas systématiquement les méthodes de services dont les types sont complexes et qui nécessitent une adaptation; dans ce cas, il est possible d'ajouter des méthodes dédiées aux invocations via WebServices mais qui prennent en paramètre ou renvoient des types simplifiés (tableaux, objets restreints, types primitifs). Ces méthodes procèdent à l'adaptation de type et invoquent à leur tour les méthodes naturelles du service. Enfin @TransactionAttribute permet de régler finement la démarcation transactionnelle des composants : quelle méthode nécessite/requiert/ne supporte pas d'être invoquée dans une transaction. Cette exigence sera interprétée par le conteneur de composants comme la nécessité d'initier une nouvelle transaction, d'enrôler le service dans une transaction existante ou au contraire de lever une exception (ou de suspendre la transaction) si une transaction est en cours mais que le service ne peut pas s'y intégrer sans risque.

La persistance avec les EJB 3.0 Il existe de nombreuses techniques pour établir une connexion entre nos services (EJB Session) et une base de données relationnelle : Utiliser JDBC directement. En général, on ne le fait pas dans le code d'implémentation de l'EJB Session lui-même, qui est censé se concentrer sur le code fonctionnel, mais on délègue l'accès aux données à une couche dédiée, la couche de Persistance. Il peut s'agir d'un simple package supplémentaire dans lequel plusieurs classes se chargent d'envoyer les requêtes à la base de données, de lire les résultats et si besoin de transformer ces résultats en objets structurés. On qualifie souvent ces objets de DAO (Data Access Object). Déclencher depuis les EJB Session une bibliothèque technique appelée "framework de persistance" telle que Hibernate, IBatis, une implémentation de JDO, etc... Enfin, les EJB Session peuvent s'appuyer sur des EJB Entité. Comme les EJB Session, il s'agit de classes particulières déployées et gérées par un conteneur de composants. Ce dernier permet de paramétrer la manière dont chaque EJB Entité sera mappé sur la structure relationnelle d'une base de données (dans une table ou plusieurs); il permet également de faire des choix parmi plusieurs stratégies de mapping des relations, qu'il s'agisse de l'héritage ou des associations entre composants. les deux dernières techniques d'accès à la base sont quasi-identiques ! Quasi-identique => Leurs avantages comparés : l'avant-dernière permet de choisir et de maîtriser 100% du paramétrage du framework de persistance alors que les EJB Entité offrent une garantie d'indépendance et donc de portabilité vis-à-vis du conteneur (et donc du framework de persistance sous-jacent), ainsi qu'une meilleure intégration dans le contexte du serveur d'application (démarcation transactionnelle automatique et intégrée à celle des EJB Session, idem pour la sécurité...).

Les EJB Entités 3.0 Le mapping des Objets persistants et des accès SQL à la base de données sont gérés automatiquement par le conteneur EJB. Les annotations guide le conteneur dans le mapping : @Entity spécifie que l'infrastructure d'accès aux données doit rendre cette classe persistante @Id identifie l'attribut qui sera mappé sur la clé primaire (ici, une clé primaire technique) @GeneratedValue délègue au framework la génération et l'affection d'une clé primaire lors du premier enregistrement d'un objet en base. La génération de la clé se fait généralement par le biais d'une séquence en base, d'un attribut entier auto-incrémenté, ou encore par la production d'un GUID. @ManyToOne exprime une partie de l'association entre Catégorie et Signet qui est de type 1-n. Dans la classe Catégorie, on trouve logiquement un autre attribut de type List<Signet> qualifié de @OneToMany.

Exemple EJB Entité 3.0 package business; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.ManyToOne; @Entity public class Signet implements Serializable {        @Id     @GeneratedValue     private long id;     public long getId {         return id;     }     public void setId(long value){         id = value;     }         private String titre;     public String getTitre {         return titre;     }     public void setTitre(String value){         titre = value;     }

Exemple EJB Entité 3.0 private String url;     public String getUrl {         return url;     }     public void setUrl(String value){         url = value;     }         @ManyToOne     private Categorie categorie;     public Categorie getCategorie {         return categorie;     }     public void setCategorie(Categorie value){         categorie = value;     } }

Interface Ejb Session et Entité Il suffit de déclarer un attribut de type EntityManager (annoté @PersistenceContext) dans l’EJB Session pour pouvoir interagir avec le gestionnaire de persistance. L'annotation permet au conteneur de composant d'injecter automatiquement la dépendance (la référence) vers le bon objet sans que nous ayons à nous en soucier. Le langage utilisé n'est pas tout à fait du SQL mais un langage de plus haut niveau appelé Java Persistance Query Language. L'avantage notable est : évite toute dépendance vis-à-vis des dialectes SQL, des multiples bases relationnelles, offre une syntaxe cohérente pour interroger des graphes d'objets pouvant tirer parti de relations d'héritage complexes. L'inconvénient découle du premier avantage : le développeur a moins de maîtrise du code SQL qui sera finalement envoyé à la base de données, ce qui peut avoir un impact sur les performances, la robustesse et plus tard la maintenance de l'application.

Interface Ejb Session et Entité public class MoteurRechercheBean implements Catalog {     @PersistenceContext     private EntityManager mgr;     @TransactionAttribute(TransactionAttributeType.SUPPORTS)     @WebMethod     public List<Signet> rechercherTousSignets(){         return mgr             .createQuery("select s from Signet s")             .getResultList();     }         @TransactionAttribute(TransactionAttributeType.SUPPORTS)     @WebMethod     public String rechercherURL(Signet s){         return mgr             .createQuery("select s.url from Signet s where s.id = :id")             .setParameter("id", s.getId())             .getUniqueResult();     }

Connexion aux sources de données Les Enterprise JavaBeans et les applications Web ont nécessairement besoin d’accéder à des systèmes de gestion de bases de données relationnelles. Deux possibilités: Accès via JDBC à la base de données, ce qui implique de charger les drivers JDBC, de coder l’URL de la base de données et de transmettre le login/pasword. Accès via DataSource, permet de décharger l’application de la logique de connexion à la base de données. Le serveur d’applications est paramétré pour définir un DataSource qui contient le driver JDBC, l’URL, le login et password.

Exemple de connexion via JDBC Connection connection = null; String driver = "com.mysql.jdbc.Driver"; String connexionURL="jdbc:mysql://localhost:3306/une_base_de_donnees"; String User = "deruelle"; String password = "ascffef67"; try { Class.forName(driver); connection = DriverManager.getConnection(connexionURL, user, password); }catch (SQLException ex1)‏ { System.out.println("SQL Error in setting datasource : " + ex1); ex1.printStackTrace(); }

Connexion JBoss/Mysql via DataSource Le DataSource est basé sur : Le driver JDBC L’URL de connexion Extraire l'archive mysql-connector-java-[version]-stable- bin.jar pour installer le driver JDBC Placer le JAR dans %JBOSS_DIST%/server/[nom_du_serveur]/lib/. Dans %JBOSS_DIST%/server/[nom_du_serveur]/deploy/, il faut créer un fichier mysql-ds.xml (le nom se termine par -ds.xml)‏ mysql-ds.xml peut contenir autant de connexions que requis.

Exemple de fichier datasource <?xml version="1.0" encoding="UTF-8"?> <!-- Datasource config for MySQL using 2.0.11 driver --> <datasources> <local-tx-datasource> <jndi-name>premiere_source_de_donnees</jndi-name> <connection-url>jdbc:mysql://localhost:3306/une_base_de_donnees </connection-url> <driver-class>com.mysql.jdbc.Driver </driver-class> <user-name>nom </user-name> <password>mot_de_passe </password> </local-tx-datasource> <local-tx-datasource> <jndi-name>deuxieme_source</jndi-name> … </local-tx-datasource> </datasources>

Exemple de localisation d’une source de données DataSource ds = null; Connection connection = null; String dataSourceName = "premiere_source_de_donnees"; try { InitialContext it = new InitialContext(); ds = (DataSource) it.lookup(dataSourceName); connection = ds.getConnection(); } catch (SQLException ex1)‏ System.out.println("SQL Error in setting datasource : " + ex1); ex1.printStackTrace(); catch (NamingException ex2)‏ System.out.println("Error in setting datasource : " + ex2); ex2.printStackTrace();

Travail Pratique Développement d’un module de gestion du catalogue en ligne : Affichage du catalogue (client), ajout et suppression de produits (administrateur)‏ Choix d’un article à ajouter au panier (client)‏ Visualisation du panier (client)‏ Saisie données du client (login/password => coordonnées client)‏ Validation du panier et génération de la commande (client)‏