Post on 04-Apr-2015
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié1
Cours n° 11Cours n° 11
Services Web et plateforme J2EEServices Web et plateforme J2EE
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié2
1. Services de présentation Les Servlettes Pages JSP (Java Server Page) Déploiement de WAR (Web Archive)
2. Services d’application Composants transactionnels (Entity Java Bean) Déploiement d’EJB
Sommaire
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié3
INTRODUCTIONINTRODUCTION
BibliographieBibliographie
Eric Sarrion, Développement Web avec J2EE, O'Reilly, 2005. Bruce W. Perry, Java Servlet and JSP Cookbook, O'Reilly, 2004.Laboratoire Supinfo, EJB 3 : Des concepts à l'écriture du code - Guide du développeur, Dunod , 2006.
Etienne Langlet, Apache Tomcat 5 : Serveur d'application Java, ENI , 2006.
www.apache.orgjonas.objectweb.org
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié4
Schéma de développement d’applications internet, intranet et extranetProposition de la société Sun (/java.sun.com/javaee/5/docs/api/)
Architecture d’applications distribuées à base de composants (API)client, serveur, conteneur, composant logiciel
Spécification des interfaces et de l’environnement d’application
Développement et déploiement rapide de services WEB fiablespersistance des donnéesgestion de la mémoiresécurisation des transactions
Fourniture par des entreprises tierces de serveurs J2EE 24000 tests de certificationIBM (WebSphere), Oracle, BEA (WebLogic), Bordland, …ObjectWeb (open-source Jonas), Jboss group (open-source commercial Jboss)
Solutions alternatives : .NET framework, SAP
INTRODUCTIONINTRODUCTION
Java 2 Entreprise Edition (J2EE)Java 2 Entreprise Edition (J2EE)
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié5
Services de présentationServlets : Gestion coté serveur de réponses aux requêtes client (e.g., protocole http)JSP, JSF : Pages Web dynamiquesServices d’applicationEJB : Composants distribués transactionnelsJTA : Gestion des transactionsJAXP : Analyse de documents XMLJAXB : Sérialisation de données en XMLJMX : Administration des applicationsJAXR : Enregistrement de Web ServicesServices de communicationJMS : Communication asynchroneJAXM : Communication asynchrone par XMLJAX-RPC : Communication synchrone par XMLJavaMail : Gestion des mailsRMI : Communication distante entre des objets javaJava IDL : Communication entre objets Java et objets non-Java (CORBA)Services de connexionJNDI : Connexion à des annuaires, notamment des annuaires LDAPJDBC : Connexion à des bases de donnéesJCA : Connexion, notamment à des PGI
INTRODUCTIONINTRODUCTION
Java 2 Entreprise Edition (J2EE) - ComposantsJava 2 Entreprise Edition (J2EE) - Composants
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié6
1. SERVICES DE PRESENTATION1. SERVICES DE PRESENTATION
PrincipesPrincipes
Indépendance entre présentation et applicationHeuristique de conception Modèle-Vue-Contrôleur (MVC) pour l’IHMSimplification de la maintenance et amélioration de la sécuritéMultiplicité des vues (présentation) sur un modèle unique de données
Création dynamique de pages webAdaptation aux données provenant du modèle
Traitement automatique de données structuréesFormulaire, tableau
Deux types de composantsPages web dynamiques (Java Server Page et Java Server Face)API Java pour le traitement des requêtes (Servlet)
Exécution sur des serveurs J2EE (moteur de servlet)
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié7
1.1 LES SERVLETTES1.1 LES SERVLETTES
La classe GenericServlet (1/2) – Cycle de vieLa classe GenericServlet (1/2) – Cycle de vie
Création de la classe à la réception de la requête Méthodes appelées à la créationvoid init() void init(ServletConfig config)
Destruction de la classe à la fin du traitement Méthode appelée avant à la destruction void destroy()
Fichier des traces d’exécutionMéthodes d’écriturevoid log(String msg) void log(String message, Throwable t)
Traitement de la requête et d’envoi de la réponsevoid service(ServletRequest req, ServletResponse res)
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié8
1.1 LES SERVLETTES1.1 LES SERVLETTES
La classe GenericServlet (2/2) - Accesseurs La classe GenericServlet (2/2) - Accesseurs
Accès aux paramètres de la requêteEnsemble de couples attribut-valeurListe de Attributs
Enumeration getInitParameterNames() Valeur associé à un attribut
String getInitParameter(String name)
Caractéristiques de la servletCaractéristiques générales
ServletConfig getServletConfig()Auteur, version.
String getServletInfo() Nom
String getServletName()
Variables globales associées à la servletPartage de données entre servlet
ServletContext getServletContext()
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié9
1.1 LES SERVLETTES1.1 LES SERVLETTES
Interface ServletRequest – caractéristiques réseauInterface ServletRequest – caractéristiques réseau
Protocole RéseauString getProtocol() Nom et version du protocole réseauboolean isSecure() Est-ce un protocole sécurisé ?
Nom, adresse IP et port du client envoyant la requête String getRemoteHost() NomString getRemoteAddr() Adresse IPint getRemotePort() Port
Nom, adresse IP et port du serveur destination de la requêteString getServerName() Nomint getServerPort() Adresse IP
Nom, adresse IP et port de l’interface recevant la requêteString getLocalName() NomString getLocalAddr() Adresse IP int getLocalPort() Port
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié10
1.1 LES SERVLETTES1.1 LES SERVLETTES
Interface ServletRequest – caractéristiques réseauInterface ServletRequest – caractéristiques réseau
public class testServletRequestNet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse res)throws ServletException, IOException {
PrintWriter writer = res.getWriter();// protocole utiliséwriter.println( req.getProtocol() + " " + req.isSecure());// adresse du clientwriter.println(req.getRemoteHost() + " " + req.getRemoteAddr() + " " + req.getRemotePort());// adresse du serveurwriter.println(req.getServerName() + " " + req.getServerPort());// adresse de l'interfacewriter.println(req.getLocalName() + " " + req.getLocalAddr() + " " + req.getLocalPort());} }
testServletRequestNet.java
HTTP/1.1 false192.161.1.106 192.161.1.106 1077192.161.1.102 9000lili 192.161.1.102 9000
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié11
1.1 LES SERVLETTES1.1 LES SERVLETTES
Interface ServletRequest – caractéristiques de la requêteInterface ServletRequest – caractéristiques de la requête
Préférences du clientLocale getLocale()
Corps de la requêteString getCharacterEncoding() codage des caractèresint getContentLength() taille en octets. String getContentType() codage MIME utilisé
Accès au corps de la requêteServletInputStream getInputStream() Flux de lecture binaireBufferedReader getReader() Flux de lecture texte
Accès aux paramètres de la requêteString getParameter(String nom) Valeur d’une requête d’un nom donné Map getParameterMap() conteneur associatif contenant les requêtes.
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié12
1.1 LES SERVLETTES1.1 LES SERVLETTES
Interface ServletRequest – caractéristiques de la requêteInterface ServletRequest – caractéristiques de la requête
public class testServletRequestReq extends HttpServlet {
protected void doPost(HttpServletRequest req, HttpServletResponse res)throws ServletException, IOException {
PrintWriter writer = res.getWriter();// préférences du clientwriter.println(req.getLocale().getDisplayLanguage());// caractéristiques du corps de la requêtewriter.println(req.getCharacterEncoding() + " " + req.getContentLength() + " " + req.getContentType());// Lecture des paramètres de la requêteMap m = req.getParameterMap(); Iterator it = m.entrySet().iterator();String[] valeurs;while (it.hasNext() == true) {Map.Entry entrée = (Map.Entry)it.next();writer.print(" " + entrée.getKey() + ":");valeurs = (String[])entrée.getValue();for (int j = 0;j < valeurs.length;j++) writer.print(valeurs[j] + " ");writer.println(); } } }
testServletRequestReq.java
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié13
1.1 LES SERVLETTES1.1 LES SERVLETTES
Interface ServletRequest – caractéristiques de la requêteInterface ServletRequest – caractéristiques de la requête
<HTML> <BODY><FORM ACTION="http://192.168.1.102:9000/cours11/ServletRequestReq"METHOD=POST>Nom <INPUT NAME="nom"> <P>Prénom <INPUT NAME="prenom"> <P><INPUT TYPE=SUBMIT VALUE="Envoi"><INPUT TYPE=RESETVALUE="Remise à zéro"></FORM></BODY> </HTML>}
testServletRequestReq.html
français null 28 application/x-www-form-urlencoded prenom:Claude nom:Montacié
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié14
1.1 LES SERVLETTES1.1 LES SERVLETTES
Interface HttpServletRequestInterface HttpServletRequest
Authentification String getAuthType() Méthode d’authentificationString getRemoteUser() Nom du client (après authentification)
RequêteString getMethod() Type de méthode associé (GET, POST, PUT)long getDateHeader(String name) Date associée à un champ d’entêteString getHeader(String name) Valeur associée à un champ d’entêteEnumeration getHeaderNames() Liste des champs d’entête String getQueryString() Partie interrogation de la requête (?….) Chemins d’adressageString getRequestURI() String getPathInfo() String getContextPath() String getPathTranslated() String getServletPath()
Gestion de la persistanceLecture des cookies associés à la requête Cookie[] getCookies() cookies associés à la requêteboolean isRequestedSessionIdFromCookie() Lecture des paramètres de la session couranteHttpSession getSession() HttpSession getSession(boolean cr) String getRequestedSessionId()
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié15
1.1 LES SERVLETTES1.1 LES SERVLETTES
Persistance de la connexion Persistance de la connexion
// Recherche d'un cookie d'attribut NomString Valeur = null;Cookie[] cookies = request.getCookies();for(int i=0; i < cookies.length; i++) {if (cookies[i].getName().equals("Nom")) Valeur = cookies[i].getValue();}
// ecriture de la reponseresponse.setContentType("text/html");PrintWriter out = response.getWriter();out.println("<html><head>"); out.println("<title>Mon Cookie</title>");
out.println("</head><body>");if (Valeur == null) {out.println("Création du cookie");Cookie unCookie = new Cookie("Nom", "Montacié");response.addCookie( unCookie );}else out.println("Bonjour Monsieur " + Valeur);out.println("</body></html>");
testCookie.java
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié16
1.2 JAVA SERVER PAGE1.2 JAVA SERVER PAGE
Principes et syntaxePrincipes et syntaxe 1.2 JAVA SERVER PAGE1.2 JAVA SERVER PAGE
Principes et syntaxePrincipes et syntaxe
Code Java intégré dans une page HTMLTraduction du code par le serveur J2EE en servlet (1er appel)Exécution par le moteur de servletCommunication avec les autres composants (servlets, EJB, …)Avantages / servlet
simplicité d’écriture et de déploiementInconvénients /servlet
visibilité du code Java (.class pour les servlets)perte de la structuration (paquetage)
Syntaxe (extrait)<% code Java %> contient du code Java qui fera partie de la méthode principale de la page JSP
<%= expression %> la valeur de expression sera intégrée dans la page HTML à la place de la balise
<%! … %> : définition d’une variable d’instance (persistance entre deux invocations)
<% … %> : définie une variable locale à la jsp (réinitialisée à chaque invocation)
Objets pré-déclarés (out request response exception session application)
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié17
1.2 JAVA SERVER PAGE 1.2 JAVA SERVER PAGE
Interface ServletRequest – caractéristiques de la requêteInterface ServletRequest – caractéristiques de la requête
<% //programme Java affichant l'heure %><%@ page import="java.util.*" %>Calendar calendrier=Calendar.getInstance();int heures=calendrier.get(Calendar.HOUR_OF_DAY);int minutes=calendrier.get(Calendar.MINUTE);int secondes=calendrier.get(Calendar.SECOND); %><% // code HTML %><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html> <head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Page JSP affichant l'heure</title> </head><body><center><h1>Une page JSP générée dynamiquement</h1><h2>Il est <%=heures%>:<%=minutes%>:<%=secondes%></h2> <br><h3>A chaque fois que vous rechargez la page, l'heure change</h3></body></html>
Heure.jsp
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié18
1.3 DEPLOIEMENT DE WEB ARCHIVE1.3 DEPLOIEMENT DE WEB ARCHIVE
Règles de constructionRègles de construction
<?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>testServletRequestNet</servlet-name> <servlet-class>cours11.testServletRequestNet</servlet-class> </servlet> <servlet-mapping> <servlet-name>testServletRequestNet</servlet-name> <url-pattern>/testServletRequestNet</url-pattern> </servlet-mapping></web-app>
web.xml
Archive compressé (jar) d’une arborescenceRépertoire WEB-INF contenant deux répertoires (classes et [sources]) et web.xml
paquetages des .class (classes) et paquetages des .java (sources)fichier de référencement des servlets pour le serveur J2EE (web.xml)
fichiers .html et .jsp
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié19
2. SERVICES D’APPLICATION2. SERVICES D’APPLICATION
Processus et composant métierProcessus et composant métier
Processus métier (ou procédure d’entreprise)Algorithme permettant de systématiser une suite de tâches dans le but d’atteindre certains des objectifs d’une entreprise
vente : gestion commerciale, besoins du client, création d’une commandeachat : politique d’achat et de concurrenceveille : stratégique, concurrence, recherche d’informations…
Composant métierComposant logiciel correspondant à l’implémention d’un processus métier
Différentes granularités établissement d’une commande, consolidation d’un ensemble de commandes
Architecture logicielle d’une application répartieComposant d’IHM (service de présentation)
Composant métier (service d’application exécutant un processus métier)Modèle de gestion de donnée (définition et accès fiable aux données métier)
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié20
2.1 COMPOSANTS TRANSACTIONNELS2.1 COMPOSANTS TRANSACTIONNELS
Accès fiable aux donnéesAccès fiable aux données
Propriétés ACID Propriétés essentielles d'un sous-système de traitement de transactions d'un système de gestion de base de donnéesTransaction (ensemble de consultations et de modifications d’un base de données)
Atomicité : Validation complète d’une transaction ou annulation de la transactionCohérence : Interdiction et annulation d’une transactions incohérente avec le modèle des donnéesIsolation : Pas d’interférence entre des transactions simultanées
Durabilité : Pas de perte d’une transaction validée
Composants transactionnelsComposants métiers permettant la mise en œuvre de transactions respectant les propriétés ACID.
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié21
2.1 COMPOSANTS TRANSACTIONNELS2.1 COMPOSANTS TRANSACTIONNELS
Entity Java Bean (EJB)Entity Java Bean (EJB)
Composants transactionnels de J2EE1998 version 1.0 Lancement de Java Plateform Entreprise Edition (IBM, Sun)2001 version 2.0 Compatibilité Corba2003 version 2.1 Compatibilité Web Services (SOAP) Référence actuelle2006 version 3.0 Simplification de la syntaxe
Typologie des EJBSession Beans Composant implémentant une tâche client
avec état (Stateful) ou sans état (stateless)Entity BeansComposant gérant des données persistantes
Message-Driven Beanscomposant gérant et transportant des messages asynchrones
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié22
2.1 COMPOSANTS TRANSACTIONNELS2.1 COMPOSANTS TRANSACTIONNELS
Architecture logicielle des EJBArchitecture logicielle des EJB
Interaction avec un Bean par l’intermédiaire de deux (ou quatres) interfacesRemote (services métiers)
Ensemble de méthodes métiers fournies par le BeanDéfinit le comportement de l’objet distribuéProche d’un objet serveur RMI
RemoteHome (gestion du cycle de vie)
Allocation, destruction d’instances Recherche d’instanceSeul élément du Bean enregistré dans le service de nommage (JNDI)
Local et LocalHome pour les accès de client du même conteneur
Amélioration des performances
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié23
2.1 COMPOSANTS TRANSACTIONNELS2.1 COMPOSANTS TRANSACTIONNELS
Création automatique par le plugin JopeCréation automatique par le plugin Jope
public class SessionEJB implements SessionBean {SessionContext ejbContext;public void setSessionContext(SessionContext ctx) {ejbContext = ctx;}public void ejbRemove() {}public void ejbCreate() throws CreateException {}public void ejbPassivate() {}public void ejbActivate() {}/** méthodes métiers */public void method1() {System.out.println("It is method1 !!!");}public void method2(java.lang.String s) { System.out.println("It is method2 with parameter " + s);}}
public interface SessionHome extends EJBHome { MonPremierEJB create() throws CreateException, RemoteException;}
public interface Session extends EJBObject { public void method1() throws RemoteException; public void method2(java.lang.String s) throws RemoteException;}
SessionEJB.javaSessionHome.java Session.java
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié24
2.2 DEPLOIEMENT D’EJB2.2 DEPLOIEMENT D’EJB
Règles de constructionRègles de construction
Archive compressé (jar) d’une arborescenceRépertoires des paquetages de classesRépertoire META-INF contenant fichiers de description et de référencement
ejb-jar.xml description des ejbX-ejb-jar.xml fichier de référencement dépendant du serveur J2EE
String bName = "SessionHome";try { home = (SessionHome) PortableRemoteObject.narrow(ctx.lookup(bName), MonPremierEJBHome.class); Session bean = home.create(); bean.method1();} catch(Exception e) { e.printStackTrace(); System.exit(2);}
SessionClient.java