Beruflich Dokumente
Kultur Dokumente
P. Déchamboux
Sommaire
■ Introduction
■ Approche à composants
■ Modèles de programmation
Navigateur
Application Tiers Terminal
Web
Cliente Client Client
(Pages HTML)
Composants
de Tiers
présentation : Web
Servlet HTTP
+ Pages JSP
Serveur
J2EE
Composants Composants
d’entreprises : d’entreprises :
EJB (logique EJB (logique Tiers
métier + métier + Métier
données) données)
Tiers Serveur
Base de données Base de données « EIS » Base de données
■ Recherche d’une
indépendance maximale du
code applicatif
COMPOSANT
◆ Pas de liaison statique entre APPLICATIF
modules de code applicatif
(composants)
…
CONTAINER
◆ Pas de liaison statique entre
modules de code applicatif et
services plate-forme
SERVICE 1
◆ Eviter l’utilisation de code SERVICE…2
« technique » dans le code
SERVICE N
applicatif
■ Pas important vers du code
applicatif plus réutilisable !!
■ Spécification de la plate-forme
◆ Containers (programmation, déploiement)
◆ Serveur et services (exécution)
Application J2EE
RMI
Container
WS Container Web Containers EJB Connecteurs
Container Client Container J2EE Serveur
CLIENT LOURD
Serveur de noms
Web (moteur de
Sécurité (JAAS)
Mail (JavaMail)
Administration
SGBD (JDBC)
MOM (JMS)
Servlet, JSP)
Connecteurs
Transaction
ORB (RMI)
(JTA, JTS)
(JNDI)
(JMX)
(JCA)
HTTP
RMI
SERVEUR J2EE
CLIENT LEGER
Bases de Données
(Oracle, …)
© 2003, P. Déchamboux ICAR’03 9
Configurations possibles d’un
serveur J2EE : clients lourds
Application Application
Cliente Cliente
Application J2EE :
Architecture centralisée Services (jdbc, EJB
mail, jca, etc)
Services (jdbc,
mail, jca, etc)
SERVEUR J2EE
Application Application
Cliente Cliente
Navigateurs Navigateurs
(HTML, WML) (HTML, WML)
■ Offre commerciale
◆ IBM / WebSphere (n° 1)
◆ BEA / WebLogic
◆ Sun One
◆ Oracle 9i Application Server
◆ Et aussi Borland Entreprise Server, Macromedia / Jrun, SAP Web
Application Server, Iona / Orbix E2A
■ Java Servlets
■ JavaServer Pages (JSP)
■ Enterprise JavaBeans
■ Java Message Service (JMS)
■ JDBC
■ Transactions
◆ JTA
◆ JTS
■ J2EE Connector Architecture (JCA)
■ Corba (Java IDL)
■ JavaMail
■ XML/SOAP
◆ Java API for XML Processing (JAXP)
◆ Java API for XML Registries (JAXR)
◆ Java API for XML-Based Remote Procedure Call (JAX-RPC)
◆ SOAP with Attachments API for Java (SAAJ)
■ http://java.sun.com/
■ http://www.theserverside.com/
■ http://developer.java.sun.com/developer/technicalArti
cles/J2EE/
■ http://developer.java.sun.com/developer/onlineTrainin
g/J2EE/
■ http://www.triveratech.com/
■ http://jonas.objectweb.org/
<ejb-ref>
ejb:
Composant Inscription :
Environnement privé java:comp/env name: Inscription
ejb-ref:
name: ejb/Participant
maxParticipants link: donneesIcar.jar#Participant
ejb/Participant
jms/QueueProcInscr
jdbc/BdIcar donneesIcar.jar
…
ejb:
name: Participant
■ Clients
◆ Applet
◆ Midlet
◆ Application autonome (container J2EE client)
■ Connecteurs
-> doGet
service(requête, réponse) -> doPost
■ Composants protocolaires de
-> doHead
J2EE (principalement utilisé
pour présentation Web) Decodeur Réponse
JspServlet
-> Requête -> encodeur
■ Traitement d’interactions
réseau de type
« requête/réponse » Decodeur
-> Requête
Réponse
-> encodeur
HttpServlet
■ Architecture de gestion d’une
pile protocolaire Decodeur Réponse
GenericServlet
-> Requête -> encodeur
■ Encapsulation des flux
entrant/sortant par un appel
procédural (service)
Flux sortant
Flux entrant
Communications
■ Hypothèse de base = réseau orientées
IP « stream »
■ Composition de protocole par
héritage
Réseau IP
N’existe pas
Prêt
ATTENTION :
Appel a priori réentrant !!
1. Appel de
service
■ Gestion de HttpServlet
◆ Equivalent des « cgi » mais en Java
◆ Activation de « thread » plutôt que de « process »
◆ Génération de contenu Web dynamique
■ JSP (JavaServer Pages)
◆ Mélange de HTML et de code java
◆ Pré-compilation en Servlet au déploiement de web-app (ensemble
de Servlet)
■ Autres technologies de production de contenu Web dynamique
dynamique
◆ Pages « Enhydra/XMLC » : pas de mélange HTML / Java !!
◆ Templates « Velocity »
■ web-app
◆ ensemble de Servlet
◆ packagés dans un fichier « jar » (e.g., webapp.war)
◆ décrits par un fichier « web.xml »
■ Définition des propriétés (env-entry) et des
dépendances (resource-ref, resource-env-ref,
ejb-ref) au niveau de la web-app
-> pas au niveau de la Servlet !!!
■ Accès à l’environnement dans le code de la Servlet
par "java:comp/env/…"
■ Identifier un utilisateur
◆ Géré par le client
◆ Transmission de l ’identité à chaque requête
■ Les méthodes
◆ Cookies (méthode par défaut)
◆ Réécriture d ’URL et champs HIDDEN
■ Classe javax.servlet.http.HttpSession
HttpSession getSession(boolean create)
dans HttpServletRequest
■ Cookie = {attribut}
◆ Obligatoires : Name, Value
◆ Optionnels : Domain, Path, MaxAge (sec), Secure (si transmis par
SSL)
■ Classe javax.servlet.http.Cookie
■ Envoyer un « Cookie »
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws
ServletException {
Cookie c = new Cookie("icar", "Dupond03");
c.setMaxAge(365*24*60*60); // valable un an
response.addCookie(c);
// ...
■ Lire les « Cookies » d’une requête
public Cookie[] getCookies() dans HttpServletRequest
CODE APPLICATIF
Interface
■ Contexte d’instance
d’interception
« local »
Instance
Objets
◆ Accès au méta-niveau
de
(retrouver les interfaces) composant
Interface
◆ Accès au contexte du « remote »
composant (assemblage /
propriétés) Contexte de
l’instance
■ Interception des appels
applicatifs (session et entité) JNDI :
◆ Support contrats techniques Pour session et entité - propriétés
- liens de composition
■ Contexte d’application
◆ Composants session
◆ Comportements : « Required », « RequiresNew », « Mandatory »
■ Interception par un composant EJB des événements
transactionnels (produits par le « container »)
◆ Implantation de javax.ejb.SessionSynchronization
◆ Evénements
❖ afterBegin : appelé après exécution de
UserTransaction.begin par le container
❖ beforeCompletion : appelé avant exécution de commit par
le container
❖ afterCompletion : appelé après exécution de commit ou
rollback par le container
■ Comportement transactionnel
◆ Spécifique à chaque méthode
◆ Pour les méthodes des interfaces « local » et « remote »
ATTENTION :
Appel non réentrant !!
1. methode
A l’initiative
du container
1. ejbPassivate
Opération sur « Home »
Passif Prêt
Opération sur instance
1. ejbActivate
ATTENTION :
Équivalent au SWAP Appel non réentrant !!
mémoire virtuelle 1. methode
■ Propriété de persistance
◆ Gérée par l’application (BMP)
◆ Gérée par le « container » (CMP 1.1 ou 2.0)
N’existe pas
1. newInstance 1. unsetEntityContext
2. setEntityContext
1. create
A l’initiative 2. ejbCreate
du container /
1. ejbActivate
Opération sur « Home »
Prêt Tamponné
Opération sur instance
1. remove
2. ejbRemove
/
1. ejbPassivate Équivalent d’un cache BD
1. methode 1. find… (SWAP possible sur la BD)
/ 2. ejbFind…
A l’initiative
1. ejbLoad /
du container
/ 1. methode home
1. ejbStore
<ejb-jar> | | | <cmp-field>
| <description>Entites ICAR</description> | | | | <field-name>coordonnees</field-name>
| <display-name>Entites ICAR</display-name> | | | </cmp-field>
| <enterprise-beans> | | | <cmp-field>
| | | | <field-name>statut</field-name>
| | <entity>
| | | </cmp-field>
| | | <ejb-name>Participant</ejb-name>
| | | <primkey-field>nom</primkey-field>
| | | <local-home>org.icar.api.ParticipantHome
| | | <query>
| | | </local-home>
| | | | <query-method>
| | | <local>org.icar.api.Participant | | | | | <method-name>findSomeParticipants
| | | </local> | | | | | </method-name>
| | | <ejb-class>org.icar.lib.ParticipantBean | | | | | <method-params>
| | | </ejb-class> | | | | | | <method-param>int
| | | <persistence-type>Container | | | | | | </method-param>
| | | </persistence-type> | | | | | </method-params>
| | | <primary-key-class>java.lang.String | | | | </query-method>
| | | </primary-key-class> | | | | <ejb-ql>SELECT OBJECT(p)
| | | | FROM participantsIcar p
| | | <reentrant>True<reentrant>
| | | | WHERE p.statut = ?1
| | | <cmp-version>2.x<cmp-version>
| | | | </ejb-ql>
| | | <abstract-schema-name>participantsIcar
| | | </query>
| | | </abstract-schema-name>
| | </entity>
| | | <cmp-field> | </enterprise-beans>
| | | | <field-name>nom</field-name> </ejb-jar>
| | | </cmp-field>
■ Composants anonymes
■ Non réentrants
■ Réaction transactionnelle ou non
■ Lien avec une destination JMS
◆ Agissent comme des MessageListener
❖ Pour une Queue
❖ Pour un Topic
1. newInstance
2. setMessageDrivenContext 1. ejbRemove
3. ejbCreate
Prêt
Opération sur instance
ATTENTION :
Appel non réentrant !!
1. onMessage(msg)
<ejb-jar> | | | | </env-entry-type>
| <description>Sessions ICAR</description> | | | | <env-entry-value>icar03@inrialpes.fr
| <display-name>Sessions ICAR</display-name> | | | | </env-entry-value>
| <enterprise-beans> | | | </env-entry>
| | <message-driven> | | | <resource-ref>
| | | <ejb-name>ProcessInscription</ejb-name> | | | | <resource-ref-name>mail/MailSession
| | | <ejb-class>org.icar.lib.ProcInscrBean | | | | </resource-ref-name>
| | | </ejb-class> | | | | <res-type>javax.mail.Session
| | | <session-type>Stateful</session-type> | | | | </res-type>
| | | <transaction-type>Container | | | | <res-auth>Container</res-auth>
| | | </transaction-type> | | | </resource-ref>
| | | <acknowledge-mode>Auto-acknoledge | | </message-driven>
| | | </acknowledge-mode> | </enterprise-beans>
| | | <message-driven-destination> | <assembly-descriptor>
| | | | <subscription-durability>NonDurable | | <container-transaction>
| | | | </subscription-durability> | | | <method>
| | | | <destination-type>javax.jms.Queue | | | | <ejb-name>ProcessInscription</ejb-name>
| | | | </destination-type> | | | | <method-name>*</method-name>
| | | </message-driven-destination> | | | </method>
| | | <env-entry> | | | <trans-attribute>Required</trans-attribute>
| | | | <env-entry-name>adrSecretariat | | </container-transaction>
| | | | </env-entry-name> | </assembly-descriptor>
| | | | <env-entry-type>java.lang.String </ejb-jar>
■ Déploiement d’application
ClassLoader serveur J2EE
◆ De packages de tiers
ClassLoader EAR
uniquement (application Web
uniquement, EJB uniquement, ClassLoader EJB
etc) ClassLoader Web
◆ De packages « ear »
■ Chargement dans un
ClassLoader spécifique (par
application déployée)
■ Hiérarchisation des
ClassLoader lors du
déploiement d’un « ear »
■ Problèmes de maturité
◆ Persistance (co-existance avec JDO)
◆ Modèle de composants (manque d’homogénéité, problème avec
gestion de l’héritage)