Services d`application

publicité
Cours n° 11
Services Web et plateforme J2EE
1
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié
Sommaire
1. Services de présentation



Les Servlettes
Pages JSP (Java Server Page)
Déploiement de WAR (Web Archive)
2. Services d’application


2
Composants transactionnels (Entity Java Bean)
Déploiement d’EJB
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié
INTRODUCTION
Bibliographie
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.org
jonas.objectweb.org
3
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié
INTRODUCTION
Java 2 Entreprise Edition (J2EE)
Schéma de développement d’applications internet,
intranet et extranet
Proposition 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 fiables
persistance des données
gestion de la mémoire
sécurisation des transactions
Fourniture par des entreprises tierces de serveurs J2EE
24000 tests de certification
IBM (WebSphere), Oracle, BEA (WebLogic), Bordland, …
ObjectWeb (open-source Jonas), Jboss group (open-source commercial Jboss)
Solutions alternatives : .NET framework, SAP
4
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié
INTRODUCTION
Java 2 Entreprise Edition (J2EE) - Composants
Services de présentation
Servlets : Gestion coté serveur de réponses aux requêtes client (e.g., protocole http)
JSP, JSF : Pages Web dynamiques
Services d’application
EJB : Composants distribués transactionnels
JTA : Gestion des transactions
JAXP : Analyse de documents XML
JAXB : Sérialisation de données en XML
JMX : Administration des applications
JAXR : Enregistrement de Web Services
Services de communication
JMS : Communication asynchrone
JAXM : Communication asynchrone par XML
JAX-RPC : Communication synchrone par XML
JavaMail : Gestion des mails
RMI : Communication distante entre des objets java
Java IDL : Communication entre objets Java et objets non-Java (CORBA)
Services de connexion
JNDI : Connexion à des annuaires, notamment des annuaires LDAP
JDBC : Connexion à des bases de données
JCA : Connexion, notamment à des PGI
5
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié
1. SERVICES DE PRESENTATION
Principes
Indépendance entre présentation et application
Heuristique de conception Modèle-Vue-Contrôleur (MVC) pour l’IHM
Simplification 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 web
Adaptation aux données provenant du modèle
Traitement automatique de données structurées
Formulaire, tableau
Deux types de composants
Pages 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)
6
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié
1.1 LES SERVLETTES
La 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éation
void 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écution
Méthodes d’écriture
void log(String msg) void log(String message, Throwable t)
Traitement de la requête et d’envoi de la réponse
void service(ServletRequest req, ServletResponse res)
7
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié
1.1 LES SERVLETTES
La classe GenericServlet (2/2) - Accesseurs
Accès aux paramètres de la requête
Ensemble de couples attribut-valeur
Liste de Attributs
Enumeration getInitParameterNames()
Valeur associé à un attribut
String getInitParameter(String name)
Caractéristiques de la servlet
Caractéristiques générales
ServletConfig getServletConfig()
Auteur, version.
String getServletInfo()
Nom
String getServletName()
Variables globales associées à la servlet
Partage de données entre servlet
ServletContext getServletContext()
8
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié
1.1 LES SERVLETTES
Interface ServletRequest – caractéristiques réseau
Protocole Réseau
String getProtocol() Nom et version du protocole réseau
boolean isSecure() Est-ce un protocole sécurisé ?
Nom, adresse IP et port du client envoyant la requête
String getRemoteHost() Nom
String getRemoteAddr() Adresse IP
int getRemotePort() Port
Nom, adresse IP et port du serveur destination de la
requête
String getServerName() Nom
int getServerPort() Adresse IP
Nom, adresse IP et port de l’interface recevant la requête
String getLocalName() Nom
String getLocalAddr() Adresse IP
int getLocalPort() Port
9
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié
testServletRequestNet.java
1.1 LES SERVLETTES
Interface 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 client
writer.println(req.getRemoteHost() + " " + req.getRemoteAddr() + " " +
req.getRemotePort());
// adresse du serveur
writer.println(req.getServerName() + " " + req.getServerPort());
// adresse de l'interface
writer.println(req.getLocalName() + " " + req.getLocalAddr() + " " +
req.getLocalPort());} }
HTTP/1.1 false
192.161.1.106 192.161.1.106 1077
192.161.1.102 9000
lili 192.161.1.102 9000
10
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié
1.1 LES SERVLETTES
Interface ServletRequest – caractéristiques de la requête
Préférences du client
Locale getLocale()
Corps de la requête
String getCharacterEncoding() codage des caractères
int getContentLength() taille en octets.
String getContentType() codage MIME utilisé
Accès au corps de la requête
ServletInputStream getInputStream() Flux de lecture binaire
BufferedReader getReader() Flux de lecture texte
Accès aux paramètres de la requête
String getParameter(String nom) Valeur d’une requête d’un nom donné
Map getParameterMap() conteneur associatif contenant les requêtes.
11
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié
testServletRequestReq.java
1.1 LES SERVLETTES
Interface 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 client
writer.println(req.getLocale().getDisplayLanguage());
// caractéristiques du corps de la requête
writer.println(req.getCharacterEncoding() + " " +
req.getContentLength() + " " + req.getContentType());
// Lecture des paramètres de la requête
Map 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(); } } }
12
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié
testServletRequestReq.html
1.1 LES SERVLETTES
Interface 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=RESET
VALUE="Remise à zéro">
</FORM>
</BODY> </HTML>}
français
null 28 application/x-www-form-urlencoded
prenom:Claude
nom:Montacié
13
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié
1.1 LES SERVLETTES
Interface HttpServletRequest
Authentification
String getAuthType() Méthode d’authentification
String getRemoteUser() Nom du client (après authentification)
Requête
String getMethod() Type de méthode associé (GET, POST, PUT)
long getDateHeader(String name) Date associée à un champ d’entête
String getHeader(String name) Valeur associée à un champ d’entête
Enumeration getHeaderNames() Liste des champs d’entête
String getQueryString() Partie interrogation de la requête (?….)
Chemins d’adressage
String getRequestURI() String getPathInfo()
String getContextPath() String getPathTranslated() String getServletPath()
Gestion de la persistance
Lecture des cookies associés à la requête
Cookie[] getCookies() cookies associés à la requête
boolean isRequestedSessionIdFromCookie()
Lecture des paramètres de la session courante
HttpSession getSession() HttpSession getSession(boolean cr)
String getRequestedSessionId()
14
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié
testCookie.java
1.1 LES SERVLETTES
Persistance de la connexion
// Recherche d'un cookie d'attribut Nom
String 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 reponse
response.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>");
15
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié
1.2 JAVA SERVER PAGE
Principes et syntaxe
Code Java intégré dans une page HTML
Traduction du code par le serveur J2EE en servlet (1er appel)
Exécution par le moteur de servlet
Communication avec les autres composants (servlets, EJB, …)
Avantages / servlet
simplicité d’écriture et de déploiement
Inconvé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)
16
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié
Heure.jsp
1.2 JAVA SERVER PAGE
Interface 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-88591">
<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>
17
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié
web.xml
1.3 DEPLOIEMENT DE WEB ARCHIVE
Règles de construction
Archive compressé (jar) d’une arborescence
Ré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
<?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>
18
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié
2. SERVICES D’APPLICATION
Processus 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 commande
achat : politique d’achat et de concurrence
veille : stratégique, concurrence, recherche d’informations
…
Composant métier
Composant 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épartie
Composant 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)
19
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié
2.1 COMPOSANTS TRANSACTIONNELS
Accè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ées
Transaction (ensemble de consultations et de modifications d’un base de données)
Atomicité : Validation complète d’une transaction ou annulation de la
transaction
Cohérence : Interdiction et annulation d’une transactions incohérente avec le
modèle des données
Isolation : Pas d’interférence entre des transactions simultanées
Durabilité : Pas de perte d’une transaction validée
Composants transactionnels
Composants métiers permettant la mise en œuvre de transactions respectant les
propriétés ACID.
20
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié
2.1 COMPOSANTS TRANSACTIONNELS
Entity Java Bean (EJB)
Composants transactionnels de J2EE
1998 version 1.0
2001 version 2.0
2003 version 2.1
2006 version 3.0
Lancement de Java Plateform Entreprise Edition (IBM, Sun)
Compatibilité Corba
Compatibilité Web Services (SOAP) Référence actuelle
Simplification de la syntaxe
Typologie des EJB
Session Beans
Composant implémentant une tâche client
avec état (Stateful) ou sans état (stateless)
Entity Beans
Composant gérant des données persistantes
Message-Driven Beans
composant gérant et transportant des messages asynchrones
21
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié
2.1 COMPOSANTS TRANSACTIONNELS
Architecture logicielle des EJB
Interaction avec un Bean par l’intermédiaire de deux (ou
quatres) interfaces
Remote (services métiers)
Ensemble de méthodes métiers fournies par le Bean
Dé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’instance
Seul é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
22
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié
2.1 COMPOSANTS TRANSACTIONNELS
Création automatique par le plugin Jope
SessionEJB.java
SessionHome.java
Session.java
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;
}
23
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié
SessionClient.java
2.2 DEPLOIEMENT D’EJB
Règles de construction
Archive compressé (jar) d’une arborescence
Répertoires des paquetages de classes
Répertoire META-INF contenant fichiers de description et de référencement
ejb-jar.xml description des ejb
X-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);
}
24
Masters IIGLI et ILGII – Intranet internet extranet – 2006-2007 – Claude Montacié
Téléchargement