La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Java EE Java Enterprise Edition Ce document a été contient des parties adaptées de support de cours de P.Y. Gibello, T. Dandelot et C. Dumoulin Le contenu.

Présentations similaires


Présentation au sujet: "Java EE Java Enterprise Edition Ce document a été contient des parties adaptées de support de cours de P.Y. Gibello, T. Dandelot et C. Dumoulin Le contenu."— Transcription de la présentation:

1 Java EE Java Enterprise Edition Ce document a été contient des parties adaptées de support de cours de P.Y. Gibello, T. Dandelot et C. Dumoulin Le contenu de ce site est mis à disposition selon les termes de la Licence Creative Commons Attribution - Partage dans les Mêmes Conditions 3.0 France.Licence Creative Commons Attribution - Partage dans les Mêmes Conditions 3.0 France

2 Introduction à JEE Historique – Architecture - Offre

3 Historique Java

4 Java EE - Objectifs Faciliter le développement de nouvelles applications java à base de composants Intégration avec les systèmes dinformation existants Support pour les applications « critiques » de lentreprise – haute disponibilité, – tolérance aux pannes, – montée en charge, – sécurité – etc.

5 Architecture Décompose le système à concevoir en o applications, en composants applicatifs, o analyse descendante jusquaux modules, aux classes gestionnaires, aux fonctions ou méthodes Modules ou Objets gestionnaire, pour larchitecture logicielle o Représente les fonctions du système o Implémente les fonctions et sous-fonctions des cas dutilisation o Services (ou fonctions) de gestion de données CRUD (Create, Read, Update, Delete) sur les données métier Services de recherche sur les données métier o services métiers Transactions / Paiements Calculs 5

6 Architectures informatiques Architectures pour une solution projet : o Architectures logiques applicative, métier o Architectures techniques logicielle, système, réseau, matérielle. 6

7 Architecture logique 4 tiers IHM (ou GUI) : client Frontal (ou front-end) : présentation Dorsal (ou back-end) : métier Persistence : base de données T1 T2 T3 T4 T2+T3

8 Mutualiser le code métier T1 T2 Site Web T3 T4 T2 Frontal API T1+T2

9 Java EE – Cest quoi? Spécifications Modèle de programmation Implémentation de référence Standard en évolution depuis 1997 – J2EE 1.0 à 1.4 en 2003, etc... Au départ, applications Web n-tiers – Présentation (Servlets puis JSP), essentiellement HTTP – Logique métier : EJB – Données : JDBC Puis infrastructure de support standard pour EAI – Facteurs de rationalisation majeurs (JTA, JMS, JCA, Web Services) – Evolution de progiciels existants vers Java EE

10 Architecture 4 tiers JEE public static void main(…) { public static void main(…) { Servlets JSPs EJBs WEB Container EJB Container Java EE Application Server DB EIS Browser Java Application JDBC JMS JTA JCA JAAS JavaMail JNDI … java/flash Applets HTTP SOAP, REST RMI / IIOP Appel local JVM html jdbc xxxx T1 T2 T1+T2 T3 T4

11 Offre Commerciale Oracle (ex BEA) WebLogic IBM Websphere (n°1) Open Source JBoss (n°1 en nombre de déploiements) Oracle (ex Sun) Glassfish (« Platform edition ») OW2 JOnAS Apache Geronimo (« Community edition » de IBM Websphere) openEjb Open Source conteneur web uniquement : Tomcat Jetty

12 Conteneur Web couche de présentation Servlet - WAR – JSP – taglib

13 Conteneur Web 1/2 webapp Webapp Servlet html jsp jpg css web.xml html js jar

14 Conteneur Web 2/2 Contient des applications Web dans un répertoire Une application web est une arborescence de fichier o mywebapp/WEB-INF/web.xml o mywebapp/WEB-INF/classes/*.class o mywebapp/WEB-INF/lib/*.jar o mywebapp/**/*.* Un fichier «.war » est une archive zip de cette arborescence

15 Application Web Servlets Code java exécuté sur le serveur pour retourner une page HTML Génération de contenu Web dynamique JSP: Java Server Pages o Mélange de HTML/XML et de code java o Librairies d extensions (« taglibs ») o Pré-compilation en servlet

16 Servlet Programme java appelable depuis une URL Classe qui hérite de javax.servlet.http.HttpServlet Cycle de vie de HttpServlet o init() : 1er appel o service() : chaque appel, redirection vers doGet() ou doPost() o destroy() : arrêt du serveur WEB Appel dune servlet URL GET : : do Get () : do Post (),

17 Exemple de servlet import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorld extends HttpServlet { public void service(HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println(" "); out.println(" hello word ! "); out.println(" "); }

18 Ecrire une Servlet Classe qui hérite de la javax.servlet.Servlet Surcharger la méthode d initialisation init(), o Utiliser la méthode getInitParameter() Surcharger une méthode de gestion dappel o doPost(), doGet(), doPut(), doDelete(), doOptions() Analyser la requête, o Classe HttpServletRequest getParameter(), getCookie(), getSession() Utiliser la classe HttpServletResponse pour répondre getWriter(), setContentType(), setCookie()

19 formulaire et Servlet Champs des formulaires directement dans des variables : Votre nom : Votre âge : Dans TestServlet.doGet(), lobjet request contient les saisies: o request.getParameter("nom") o request.getParameter("age") public void doGet( HttpServletRequest request, HttpServletResponse response)... { … out.println("Bonjour " + request.getParameter("nom")); … 19

20 Déployer une servlet Recopier lapplication web sous $tomcat/webapps o une archive.war ou o Un répertoire Contenu de lapplication web o sous-répertoire « WEB-INF/ » web.xml : déclaration et paramètres de servlets /lib/ : pour les.jar, /classes/ pour les.class

21 Déclaration de la servlet servletHello HelloWorld servletHello /hello apache-tomcat /webapps/myapp/WEB-INF/web.xml

22 Autour des Servlets Gestion de la session : HttpServletRequest.getSession() o données de contexte à durée de vie courte o stockées sur le serveur o addAttribute(), getAttribute(), setMaxInactiveInterval() Gestion des cookies : HttpServletRequest.getCookies() o données de contexte à durée de vie plus longue o stockées sur le poste client o setName(), setValue(), setMaxAge() Filtre o Transforme des requêtes et/ou des réponses o Classe qui implémente javax.servlet.Filter o Déclaré dans web.xml comme une Servlet

23 JSP Java Server Pages Intégration de code serveur dans un fichier HTML o mêmes principes que PHP o Code java dans des balises o Les pages JSP ont lextension «.jsp » Linterpréteur JSP génère une classe de servlet «.java » par JSP o des variables accessibles dans des pages (session, application, request, response) 23

24 Exemple de JSP Test HelloWorl en JSP <% out.println("Hello world !"); out.println("Hello " + request.getParameter("name"); %> Today is 24 Directive Scriptlet Expression

25 interprétation script 25 Hello world Today number is 19 Hello world Today number is 19 Hello world ! Hello world ! Coté serveur Coté client Vue utilisateur interprétation client interprétation serveur

26 variables prédéfinies JSP out : flux de sortie dans la réponse HTTP au client. o utiliser println() request : objet représentant la requête HTTP o utiliser getParameter("name"), getCookies(), forward() response : objet représentant la réponse HTTP o out est retournée par response.getWriter() o utiliser setCookie(new Cookie("name","value")) session : objet représentant la session HTTP o utiliser setAttribute("name"), getAttribute("name"), removeAttribute("name") o La session de lutilisateur est retourner par request.getSession(false) o request.getSession(true) crée et retourne une nouvelle session (déconnexion ou logout) pageContext : objet représentant le contexte d'une page Facilite l'accès au contexte de l'application web utiliser setAttribute("name") pour donner des paramètres aux taglibs Utiliser foward("url") pour déléguer la réponse à une autre page

27 formulaire et JSP Champs des formulaires directement dans des variables : Votre nom : Votre âge : Dans test.jsp, lobjet request contient les saisies: <% request.getParameter("nom") request.getParameter("age") %> On peut écrire en réponse dans test.jsp:... Bonjour... 27

28 syntaxe JSP : scriptlet : déclaration servlet : expression (pas de ; final) : directive import="…", page= "url" : tag jsp, TagLib JSTL Autres TagLib : Struts2, Tiles, Spring MVC, etc.

29 Forward vs redirect Forward utilisable dans un même war Redirect sinon Page A Page B Page C forward redirect this.getServletConfig().getServletContext().getRequestDispatcher( "/JSP/Demo.hello.jsp").forward(request,response); this.getServletConfig().getServletContext().getRequestDispatcher( "/JSP/Demo.hello.jsp").forward(request,response);

30 Forward pour les erreurs Page1.jsp Nb pizza incorrect … … Page 2.jsp -2

31 Utilisation des taglibs 1/2 Rajout des jars correspondant dans WEB-INF/lib o WEB-INF/lib/jstl.jar o WEB-INF/lib/standard.jar Exemple : " … " …

32 Utilisation des taglibs 1/2 … code HTML … … code HTML … Welcome, … code HTML … … code HTML … Welcome, Welcome, ${user.name} Welcome, ${user.name} Ou

33 Conteneur Web couche de persistance JDBC – Transaction

34 Architecture webapp

35 Java DataBase Connectivity Librairie dinterfaces java qui définisse la communication avec une base de données Package « java.sql » o classe « DriverManager », interface « Driver » démarrage dune connexion o interfaces « Connection », « DatabaseMetaData » Gestion dune connexion et création de requêtes SQL o interface « Statement » et spécialisations gestion, exécution dune requête SQL o interfaces « ResultSet », « ResultsetMetaData » gestion des résultats de requête SQL Application Java JDBC DriverManager MySQL JDBC Driver MySQL Oracle Oracle JDBC Driver

36 Connexion via JDBC Classe DriverManager o DriverManager.getConnection(url,user,password) Interface « java.sql.Connection » o Gère la connection à la base close(), getMetaData() o Création d'une nouvelle requête Statement stmt = createStatement(); prepareStatement("select a from b where c=?") o pour optimisation, ? = paramètre, ordre important prepareCall("? = call proc_stock[?,?]") o procédure stockée (attention à la portabilité !) o Gestion du transactionnel commit(), rollback(), setAutoCommit(boolean) Temps d'exécution long À considérer comme monothread À considérer comme monothread

37 Exemple de connexion /** retourne une connection à une base de données accessible via JDBC dbURL - URL de la base de données driverClassName - nom complet de la classe qui sert de driver JDBC user - nom de compte utilisateur de la base de données password - mot de passe associé au compte utilisateur */ public Connection connect(String dbURL, String driverClassName, String user, String password) throws Exception { // configure le DriverManager pour charger le driver try { Object drv = Class.forName(driverClassName).newInstance(); } catch( Exception e) { e.printStackTrace(); throw e; } Connextion connection = null; try { connection = DriverManager.getConnection(dbURL, user, password); return connection; } catch( SQLException se) { se.printStackTrace(); throw se; } }

38 Exemple de update Connection cnx = DriverManager.getConnection("jdbc:mysql://localhost:3306/p izzadb","com.mysql.jdbc.Driver","user","****"); PreparedStatement updateVentes = cnx.preparedStatement( "UPDATE CAFE SET VENTE = ? WHERE NOM_CAFE LIKE ?"); updateVentes.setInt(1,50); updateVentes.setString(2, "Colombian"); updateVentes.executeUpdate(); Statement stt = cnx.createStatement(); stt.executeQuery("UPDATE CAFE SET VENTE = 50 WHERE NOM_CAFE LIKE 'Colombian' ");

39 Requêtes via JDBC « Statement » représente une requête o Exécution dune requête SQL Resulset res = statement.executeQuery("select …"); int nbRows = statement.executeUpdate("update …"); o Pagination des résultats setMaxRows(n), getMoreResults() o contrôle de lexécution de la requête setQueryTimeout(int seconds), cancel() PreparedStatement, CallableStatement o set (n°param,valeur) avec pour : String, Long, Double, BigDecimal, Boolean, Date, etc.

40 Résultats via JDBC « Resultset » représente le résultat dune requête o méthodes principales : get (nom_colonne) next() o exemple: while(rst.next()) { … gestion d une ligne … } getMetaData() « ResultsetMetaData » décrit le résultat (= la table si « select * ») o getColumnCount(), getColumnType() isNullable(), getColumnLabel(), etc.

41 Exemple de insert Pizza p = new Pizza("royale","tomato"); Statement stt = cnx.createStatement(); int nbLigneCrees = stt.executeUpdate("INSERT INTO pizza (pizza_name,pizza_type) VALUES ('"+p.getPizzaName()+"','"+p.getPizzaType()+"')", Statement. RETURN_GENERATED_KEYS ); ResultSet generatedKeys = stt.getGeneratedKeys(); if (generatedKeys.next()) { p.setId(generatedKeys.getLong(1)); } ALTER TABLE pizza CHANGE pizza_id pizza_id BIGINT( 20 ) NOT NULL AUTO_INCREMENT MySQL

42 Exemple de select // affiche les noms des cplonnes puis chaque ligne de résultat de la requête Statement stmt = connection.createStatement(); ResultSet rst = stmt.executeQuery("select c.chatRoomName, t.topicName, c.language, from ChatRoom c, TopicCategory t where c.topicCategoryId = c.Id order by topicName, chatRoomName"); ResultSetMetaData rstData = rst.getMetaData(); Collection chatRooms = new Vector (); while(rst.next() == true) { ChatRoom chatRoom = new ChatRoom(); chatRoom.setRoomName(rst.getString("chatRoomName"));... chatRooms.add(chatRoom); } // fermeture de la requête et de ses Resultset associés stmt.close();

43 Transactions sous MySQL Transactions en SQL o BEGIN, COMMIT, ROLLBACK, CHECKPOINT o option AUTOCOMMIT o Note : les DDL (create, alter, drop table) sont toujours AUTOCOMMIT Accès concurrents : ligne ou table bloquée jusquau commit ou rollback o LOCK TABLE o SELECT … FOR UPDATE o Gestion optimistes des accès concurrents Moteurs pour la base MySQL o InnoDB : foreign keys, select for update, stockage optimisé o MyISAM : plus rapide en lecture o MEMORY : pas de stockage sur le disque o NDBCluster : table répartie sur plusieurs serveurs 43

44 Illustration dune transaction Table possessions (dactions par utilisateurs) Table comptes Scénario 1 : lutilisateur A achète 200 actions Axa à lutilisateur B pour 37 euros 44 idsoldeutilisateur 13200A 21540B 32030C idactionquantitecoteutilisateurversion 1Total200149,90C2 2Axa50036,50B1 3EDF15082,20A4

45 gestion optimiste des accès concurrents Scénario 1 Scénario 2 : lutilisateur C achète aussi 400 actions Axa à lutilisateur B pendant le scénario 1 45 idactionquantitecoteutilisateurversion 1Total200149,90C2 2Axa50036,50B1 3EDF15082,20A4 idsoldeutilisateur 11350A 23390B 32030C idactionquantitecoteutilisateurversion 1Total200149,90C2 2Axa30036,50B2 3EDF15082,20A4 4Axa20036,50A1

46 Exemple de transaction JDBC cnx.setAutoCommit(false); PreparedStatement updateVentes = cnx.prepareStatement( "UPDATE CAFE SET VENTE = ? WHERE NOM_CAFE LIKE ?"); updateVentes.setInt(1,50); updateVentes.setString(2, "Colombian"); updateVentes.executeUpdate(); PreparedStatement updateTotal = cnx.prepareStatement( "UPDATE CAFE SET TOTAL = TOTAL + ? WHERE" + "NOM_CAFE LIKE ?"); updateTotal.setInt(1,50); updateTotal.setString(2,"Colombian"); updateTotal.executeUpdate(); cnx.commit(); Cet exemple ne gère pas les accès concurrents

47 Log4j Introduction au système de trace coté serveur

48 Log4j Librairie de génération de traces dans un fichier Utiliser des fichiers de log au lieu de System.out Types de traces : ERROR, INFO, DEBUG Installation : log4j-.jar dans le CLASSPATH Logger : générateur de la trace Appender : destination de la trace LayoutPattern : format de la trace Configuration o Log4j.properties o Log4j.xml

49 Exemple de config. log4j

50 Exemple de code log4j public class DAOBase {... final static Logger logger = Logger.getLogger(DAOBase.class);... public void aMethod() {... connection = DriverManager.getConnection(dbURL, user, pwd); if(logger.isDebugEnabled()) { logger.debug("connected to " + dbURL); }....

51 Junit Introduction aux tests unitaires et à l'intégration continue

52 JUnit Cadriciel de création de tests unitaires Génération de tests unitaire possible depuis Eclipse Un test unitaire teste une méthode ou une fonction o différent des tests fonctionnels qui testent les fonctions de lapplication, Lancement possible depuis Eclipse Code à isoler en gestion de configuration o sous « src/test »

53 Exemple de junit import static org.junit.Assert.*; import org.junit.Test; public class StringTest public void testConcatenation() { String foo = "abc"; String bar = "def"; assertEquals("abcdef", foo + bar); public void testStartsWith() { String foo = "abc"; assertTrue(foo.startsWith("ab")); } = NullPointerException.class) public void methodCallToNullObject() { Object o = null; o.toString(); } Connection cnx = public void setUp() throws Exception { cnx = new DAOBase().getConnection( dbUrl,dbDriver, dbUser, dbPassword); }

54 Méthode dassertion MéthodeRôle assertEqualsVérifie que deux objets sont égaux, avec la méthode equals() assertFalseVérifie que l'expression est fausse assertNotNullVérifie que l'objet n'est pas nul assertNotSameVérifie que deux références ne sont pas les mêmes assertNullVérifie qu'un objet est nul assertSameVérifie que deux références sont les mêmes, avec lopérateur == assertTrueVérifie que l'expression est vrai failProvoque l'échec du test

55 Junit depuis Eclipse Création : bouton droit sur une classe, puis New, Other, Java, Junit, TestCase Génerer le code de test sous un autre répertoire « /test » Utilisation : bouton droit sur une Junit puis Run As, Junit Test

56 Tests unitaires Un test unitaire teste une méthode ou une fonction o différent des tests fonctionnels qui testent les fonctions de lapplication, Tests unitaires automatisés o lancés après la construction dun exécutable o Utilisés pour lintégration continue Tests unitaires dintégration o lancés après linstallation dune application o Fonctionnement interne o Fonctionnement de lIHM

57 57 Vérification de létat du référentiel Compilation Génération de documentation Récupération des sources Exécution des tests unitaires Packaging et déploiement Calcul de métriques qualité Livraison de code Déploiement Consultation des métriques qualité Tests Notifications Développeurs Testeurs En cas de modifications, lusine logicielle procède à la construction du projet 2 A intervalle régulier létat du référentiel de sources est vérifié 4 En cas déchec, la résolution du problème devient la priorité de l'équipe Les développeurs livrent leurs modifications en continu Usine logicielle Référentiel des sources SCM Environnement de développement, dintégration ou de recette Processus de lintégration continue Log4J - JUnit

58 JNDI Introduction à l'informatique distribué et à RMI

59 Objets distribué Prinpices : o Faire coopérer des logiciels entre eux o Avoir des "variables globales" au réseau o Utiliser et répartir la puissance de calcul et de stockages sur plusieurs serveurs o Appeler une méthode d'un objet se trouvant sur une autre machine exactement de la même manière que sil se trouvait au sein de la même machine o Pouvoir retrouver un objet existant d'après son « nom » Middleware ObjetStub ClientServeur ObjetServant

60 60 Machine 2Machine 1 Comment sont vu les objets. Application Objet Stub Implementation Squeleton Mode classiqueMode distribué Interface

61 Utilisation de l'annuaire Serveur Client Annuaire 1- Déclare un objet 2- Recherche un objet Object o = envCtx.lookup("MyObj"); 3 - Appel l'objet

62 Technologies Objets distribués TechnologieResponsable RPCIETFC, C++ CORBAOMGtous RMIOracle (ex Sun)java SOAP (WebService)W3Ctous WCFMicrosoft.Net HTTP+REST+XML/JSON?, pas de normetous

63 63 Java RMI Remote Method Incocation Permet à du code client d'appeler une méthode sur un objet serveur Java distant. simplification de CORBA pour java uniquement. Générateur de code Stub et Skeleton à partir d'une interface : rmic Annuaire d'objet serveur disponible rmiregistry Package java.rmi Disponible dans Java SE

64 JNDI Java Naming and Directory Interface Service de nommage / annuaire pour JEE API accès aux annuaires – javax.naming – « Service Provider » par annuaire cible (LDAP, NIS, RMI registry…) Utiliser dans JEE pour accéder à des DataSources UserTransaction EJB Etc. JEE est une évolution de CORBA pour Java

65 Déclarer une DataSource dans Tomcat $tomcat/webapps/myapp/META-INF/context.xml o $tomcat/webapps/myapp/WEB-INF/web.xml o o jdbc/PizzaDB o o javax.sql.DataSource o o Container o Création dune DataSource dans Tomcat Utilisation dune DataSource Context initCtx = new InitialContext(); Context envCtx = (Context) initCtx.lookup("java:comp/env"); DataSource ds = (DataSource) envCtx.lookup("jdbc/PizzaDB"); Context initCtx = new InitialContext(); Context envCtx = (Context) initCtx.lookup("java:comp/env"); DataSource ds = (DataSource) envCtx.lookup("jdbc/PizzaDB");

66 Construction de livrables Ant - Maven

67 Ant Outil pour construire un livrable jar, war, ear Remplace les fichiers "make" Intégrer à Eclipse (démarrage, configuration) Doc. sous $ANT_HOME/docs/manual/index.html et Suite sur le support de cours Ant de T. Dandelot

68 EJB EJB Session – JPA – JMS/MDB

69 EJB Enterprise Java Beans Cadriciel de logique métier coté serveur Sappuie sur Java SE et les APIs de Java EE – JNDI, JTA/JTS, JDBC, JMS, JAAS Gestion déclarative : personnalisation par annotations dans le code) ou descripteur de déploiement (xml) "Portable" sur les différents conteneurs EJB

70 Architecture 4 tiers JEE public static void main(…) { public static void main(…) { Servlets JSPs EJBs WEB Container EJB Container Java EE Application Server DB EIS Browser Java Application JDBC JMS JTA JCA JAAS JavaMail JNDI … java/flash Applets HTTP SOAP, REST RMI / IIOP Appel local JVM html jdbc xxxx T1 T2 T1+T2 T3 T4

71 Services du conteneur d'EJB Annuaire de composants EJB et de ressources Grappe de ressource (pool) Transactions Persistance Répartition de charge Sécurité

72 interface d'un EJB Déclare Déclare les méthodes métier C'est une vue cliente et distante de lEJB Paramètres passés par copie Retour et exceptions également import public interface PizzaManager { public Long orderPizza(PizzaOrder po, EndUser eu);... import public interface PizzaManager { public Long orderPizza(PizzaOrder po, EndUser eu);... Doivent implémenter Serializable Doivent implémenter Serializable

73 Implémentation d'un EJB Implémente les méthodes de linterface Remote Peut hériter dun autre EJB, ou dun POJO Spécifie les caractéristiques de déploiement par annotations – type d'EJB (Stateless, Stateful, Message) – transactions, – sécurité, – persistance – webservice

74 Exemple de Public class PizzaManagerBean implements PizzaManager { public Long orderPizza(PizzaOrder po, EndUser eu) Public class PizzaManagerBean implements PizzaManager { public Long orderPizza(PizzaOrder po, EndUser eu) {... Serveur Context ctx = new InitialContext(); PizzaManager pm = (PizzaManager)ctx.lookup( "java:global/PizzaEAR/PizzaFrontOffice/PizzaManagerBean");... pm.creatPizzaOrder(po); Context ctx = new InitialContext(); PizzaManager pm = (PizzaManager)ctx.lookup( "java:global/PizzaEAR/PizzaFrontOffice/PizzaManagerBean");... pm.creatPizzaOrder(po); Client private PizzaManager pizzaMgr; // Injection dEJB local Client local

75 EJB Session Réalisation dactions sur demande de clients Objets métier gestionnaire non persistants Ce n'est pas une entité métier sauver en base de données Session Stateless ou Stateful Un Bean Stateful gère un létat il est plus difficile de le dupliquer

76 Caractéristiques de déploiement Stateless Session Bean Grappe dinstances possible Appels de méthodes " idempotent " Stateful session / Activation / après avant passivation Pour tous les Session Beans et value= TransactionManagementType.BEAN )

77 EJB : Configuration & Déploiement Descripteur de déploiement : META-INF/ejb-jar.xml – Description du Bean (Stateful, Stateless,...) – Ressources (Base de données,...) – Securité: permissions et rôles – Transactionnels Priorité au descripteur de déploiement sur les annotations.

78 Descripteur de déploiement (optionnel) EJB PizzaShop PizzaManager...PizzaManagerRemote...PizzaManagerBean Stateless Bean jdbc/facturationDB javax.sql.DataSource Container Lien entre interfaces et implémentation Lien entre interfaces et implémentation Ressource : ici, base de données Ressource : ici, base de données Bean Session Bean ou Container Bean ou Container

79 Injection de dépendances Variable dinstance initialisée par le conteneur – Alternative au lookup JNDI – Interne à une application JEE serveur uniquement Dans un client d'EJB (par exemple une aManagerBean") private PizzaManager pizzaMgr; // Injection dEJB local Dans javax.sql.DataSource ds; // Injection de ressource via nom JNDI

80 Gestion des erreurs Exception métier o L'utilisateur est la cause de l'erreur ou peu la résoudre o Le développeur doit créer des exception métier qui : o héritent de java.lang.RuntimeException o Utilisent Exception technique o Réutiliser les exceptions disponibles ServletException, dans les servlets et JSP EJBException dans les EJB SQLException dans les public class BusinessException extends RuntimeException public class BusinessException extends RuntimeException {....

81 Packaging EAR EAR JAR EJB-JAR WAR EJB-JAR /lib PizzaEAR PizzaEJB.jar PizzaFrontOffice.war Pizza PizzaEAR PizzaEJB.jar PizzaFrontOffice.war Pizza /META-INF/application.xml

82 Rappel sur le chargement de classes Les classloaders sont hiérarchisés Règle : 1.Cherche la classe dans le cache de son niveau 2.Demande la classe au classloader parent 3.Si ClassNotFoundError pour le parent alors cherche la classe à son niveau 4.Si toujours pas trouvé alors ClassNotFoundError Hierarchie standard (hors JEE), du pères aux fils o Bootstrap : java.* o Extension : $JRE_HOME/ext/*.jar o System (ou application si non JEE) : $CLASSPATH

83 Gestion du classpath JEE ModuleClasspath EAR1.All JARs in the /lib directory of the EAR 2.Manifest Class-Path of any JARs in 1 EJB-JAR1.EJB-JAR file itself 2.JARs referenced by manifest Class-Path of EJB-JAR 3.JARs referenced by manifest Class-Path of above JARs (in 2) WAR1.WEB-INF/classes 2.JARs in WEB-INF/lib 3.JARs referenced by manifest Class-Path of WAR 4.JARs referenced by manifest Class-Path of JARs in 2 and 3 Class-Path: lib/PizzaBiz.jar PizzaEjb.jar lib/log4-j jar lib/jackson-databind jar lib/jackson-core jar Exemple : META-INF/MANIFEST.MF de Pizza.war dans Pizza.ear Retour à la ligne obligatoire !

84 Répartition de charge : notations web ejbweb ejb Apache mod_jk ejb Un conteneur WebUn conteneur EJB Un serveur qui héberge un conteneur Web Un serveur qui héberge un conteneur EJB Un serveur Apache avec le module mod_jk Un noeud (machine) qui héberge un ou plusieurs serveurs Un serveur qui héberge un conteneur Web et un conteneur EJB

85 Répartition de charge : scenarii (1) ejbweb ejb Compact Réparti (au sein d un même nœud) webejb Réparti Répartition du serveur JavaEE

86 Répartition de charge : scenarii (2) Apache mod_jk ejbwebejbweb (1) Apache mod_jk Apache mod_jk webejbweb (3) Apache mod_jk webejbwebejb (4) Répartition de charge EJB Réplication session http webejbwebejb (2)

87 Répartition de charge depuis un load balancer

88 Gestion des transactions Utilisation de JTA o javax.transaction.UserTransaction o Contrôle de la transaction (timeout, « rollbackOnly ») o Exemple : UserTransaction utx = (UserTransaction) ctx.lookup("java:comp/UserTransaction"); utx.begin(); … utx.commit();

89 Gestion déclarative des transactions Au niveau de la méthode de l'EJB Required (valeur par défaut) – Si pas de transaction, nouvelle transaction Supports – Si transaction courante, lutiliser NotSupported – Si transaction courante, elle est suspendue RequiresNew – Nouvelle transaction (s'il y a un transaction courante, elle est suspendue) Mandatory – Exception si pas de transaction courante Never – Exception si transaction courante

90 @TransactionManagement( javax.ejb.TransactionManagementType.CONTAINER ) public class Facturation implements FacturationRemote public void creerFacture( ) { // … } Gestion déclarative des Transactions par annotations NotSupported Required RequiresNew Mandatory Supports Never

91 Descripteur de déploiement : Gestion déclarative des Transactions par xml Facturation * Required... NotSupported Required RequiresNew Mandatory Supports Never

92 Persistance + Transactions EJB1 DBM REG JMX EJB EJB2 DBM EJB JMX JTM JMX Web Conteneur EJB Conteneur WEB DD 2-phase commit T1 T2 DB1 DB2 Appli client http server3 server2 server1 nocust Servlet

93 JPA Java Persistence API Un diagramme de classes métier correspond à un modèle de base de donnée relationnel Annotations de correspondance objet-relationnel o Déclaration des tables et colonnes correspondantes o Déclaration des associations o Déclaration de l'héritage Utilisation de JPA dans le code java Framework : Hibernate, EclipseLink, ObjectDB, OpenJPA Alternatives : JDO, JDBC

94 Annotations JPA Annotations à insérer dans les classes métier pour définir le mapping objet relationel Annotations JPA o Classe : pour les classes mère abstraites o Attributs dans classe métier ", length=, nullable= : la colonne est lidentifiant unique de la : valeur non fournie par le : colonne technique utilisée pour la gestion optimiste daccès : ignoré par JPA (non sauvé) 94

95 public class PizzaOrder implements Serializable { // Serializable conseillé public PizzaOrder () { } // Constructeur par public Long private Date protected EndUser customer public class EndUser implements Serializable cascade=CascadeType.ALL, fetch=FetchType.LAZY) private Collection pizzaOrders; Exemple 1/2 Associations (1 EndUser, N PizzaOrder) Associations (1 EndUser, N PizzaOrder) Nom de colonne différent Pour MySQL Autoincrement

96 Associations Exemple : EndUser OneToMany PizzaOrder Le « propriétaire » de la relation correspond à la table qui possède la clé étrangère – Lien EndUser/PizzaOrder : PizzaOrder est « propriétaire » de la relation – Attribut « mappedBy » côté EndUser, et joinColumn côté PizzaOrder OneToOne – Exemple : EndUser et Address OneToMany – Exemple : EndUser vers PizzaOrder ManyToOne – Exemple : PizzaOrder vers EndUser ManyToMany – Exemple : Pizza et PizzaOrder

97 Jointures en ", unique=true, (mappedBy=" (name=" ", joinColumns =" "), inverseJoinColumns =" " ) OneToOne : idem ManyToOne d'un coté et OneToMany de l'autre CascadeType : ALL, MERGE, PERSIST, REFRESH, REMOVE, DETACH FetchType : LAZY, EAGER 97

98 Cascade CascadeTypeEffet ALLTous les effets ci-dessous, valeur par défaut PERSISTSi l'entité à créer possède des entités dans l'association concernée, alors elles sont créées également MERGESi l'entité à modifier possède des entités dans l'association concernée, alors celle-ci sont modifiées (ou créées) également REMOVESi l'entité à supprimer possède des entités dans l'association concernée, alors celle-ci sont supprimées également REFRESHSi l'entité à relire possède des entités dans l'association concernée, alors celle-ci sont relues également ("undo" des modifications) DETACHSi l'entité à détacher possède des entités dans l'association concernée, alors celle-ci sont détachées ?) private Collection pizzaOrders = null; READN'existe pas ! car il s'agit du fetch=FecthType.EAGER NONEN'existe pas ! car il s'agit du fetch=FecthType.LAZY

99 Exemple 2/2 public class PizzaOrder implements private Collection pizzas = null;.... __________________________ public class Pizza implements Serializable private Collection pizzaOrders = null;... idem OneToMany d'un coté Facultatif, idem OneToMany d'un coté Facultatif,

100 Configuration JPA La configuration de la persistance par JPA est dans META-INF/persistence.xml 100

101 Instructions JPA La classe EntityManager manipule les données em.flush() : sauvegarde immédiate des modifications em.refresh(e) : annulation de modifications em.createQuery( ) em.createNativeQuery( ) em.getTransaction().begin(); em.getTransaction().commit(); 101 JPASQL em.persist(e)insert em.merge(e)update em.remove(e)delete em.find(e.class,id)select EntityManagerFactory emf = Persistence.createEntityManagerFactory (" "); EntityManager em = emf.createEntityManager(); EntityManagerFactory emf = Persistence.createEntityManagerFactory (" "); EntityManager em = (unitName="PizzaPU") private EntityManager em;

102 Gestion des entités... public void orderPizza(PizzaOrder po, EndUser eu) { EndUser eu = persistenceManager.find (eu.getClass(),eu.getId()); po.setCustomer(eu); persistenceManager.persist(po);... obligatoire si CascadeType.ALL non défini new Non gérée gérée persit(), merge(), find(), query() detach() garbage collector Refresh() et cascade d'entité non gérée interdite

103 public class FacturationBean implements FacturationRemote private EntityManager entityManager; public void creerFacture(String numfact, double montant) { Facture fact = new Facture(numfact); fact.setMontant(montant); entityManager.persist(fact); } public Facture getFacture(String numfact) { return entityManager.find(Facture.class, numfact); }

104 Définition @DiscriminatorColumn(name=" @DiscriminatorColumn(name=" 1 seule table pour toutes les sous-classes 1 table par sous-classe – @PrimaryKeyJoinColumn(name="ID", referencedColumnName="ID") 1 table par sous-classe – 1 table par Classe mère abstraite Conseillé Déconseillé

105 EJB-QL Langage proche de SQL – « select p from Pizza p » – From sur les classes au lieu des tables – Respectez la casse dans le nom de la classe (package facultatif) – "update" et "delete" – "inner join", "group by… having", – "order by" – public List listFactures( ) { Query q = em.createQuery("select po from PizzaOrder fetch po.pizzas where po.customer.lastname like =:lastname"); q.setParameter("lastname","perez"); return q.getResultList(); } Liste des commanes avec leur client dont le nom commence par :lastname avec leur factures Liste des commanes avec leur client dont le nom commence par :lastname avec leur factures ou q.getSingleResult() ou q.executeUpdate() selon les requêtes ou q.getSingleResult() ou q.executeUpdate() selon les requêtes

106 Annotation de Callbacks d'une entitée Méthodes appelées par le persistenceManager Annotation de insertion en insertion en mise à jour en mise à jour en suppression en suppression en lecture en lecture en base

107 Bean Validation Validation de données dans une instance Contraintes déclarées par public public String getNom() ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); Validator validator = factory.getValidator(); Set > constraintViolations = validator.validate(personne); if (constraintViolations.size() > 0 ) { ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); Validator validator = factory.getValidator(); Set > constraintViolations = validator.validate(personne); if (constraintViolations.size() > 0 ) { Déclaration de contrainte Validation StringInt, LongFloat, DoubleDate @Pattern

108 Bonnes pratiques JPA Utiliser java.lang.Long pour l'id technique Utiliser java.util.Set pour les associations Toujours déclarer le type de fetch dans les associations Privilègier FecthType.LAZY sur toutes les associations o Utiliser "join fetch" dans les requêtes JPQL Utiliser une Query d'update plutôt que t = em.find(Thing.class,id); t.setF(t); em.flush(); Définir les entités JPA puis générer les tables lorsqu'il n'y a pas d'existant

109 name="findAllPizzas", query="select p from Pizza p" ) public class Pizza implements Serializable {

110 Backup Slides

111 EJB versus API REST & WebService Les API REST fournissent des ressources o API de type CRUD basée sur HTTP ou HTTPS avec XML ou JSON; o portables entre plusieurs technologies (java,.Net, PHP, C++, etc.) ; o adaptées au web (utilisation des verbes du protocole HTTP). Les WebServices fournissent des services o fonctions plus évoluées que de simple CRUD, (services "métier") ; o Avec des définition stricte (WSDL) qui facilite l'outillage et la génération de code; o Portables entre plusieurs technologies (java,.Net, PHP, C++, etc.). Les EJB fournissent des services transactionnels distribués o transactions (commit, rollback) réparties sur plusieurs serveurs ; o Complété par des services techniques : sécurité, persistance, etc. o limités à la technologie java o limités au réseau local.

112 Déclaration de la sécurité { "frontoffice", "backoffice" } ) public class EndUserManagerBean... L'identité (nom) d'un client est aussi appelée « Principal » Les rôles et les « Realm » (user /password) sont déclarés par configuration au niveau du serveur chaque serveur dispose de mécanismes spécifiques

113 Déclaration de la sécurité par DD... Application front-office front-office front-office EndUserManager authenticate,chgPassword Définition de rôle Permissions accordées à un rôle

114 JMS

115 MDB Message Driven Bean EJB pour les appels asynchrones L'appelant n'attend pas la réponse pour continuer son travail Exécution sur réception dun message – Méthode onMessage( ) – Utiliser les files de message JMS pour stocker les messages à traiter et les réponses Un serveur JEE fournis des files JMS – Messages point à point : 1 émetteur, 1 destinataire – Message publish/subscribe : 1 émetteur, n destinataires abonnés – Garantie de stockage – Garantie de livraison des messages – Possibilité de retry

116 exemple MDB Administration JMS BD MDB StockHandler MDB Order Entity Bean Stock TX Serveur EJB Appli : Client JMS publier Envoi message Mise à jour JNDI TopicQueue créer bind QCF créer

117 exemple MDB (2) public class StockHandlerBean implements javax.jms.MessageListener { … public void onMessage(Message message) {... sh = (StockHome)initialContext.lookup("java:comp/env/ejb/Stock"); queue = (Queue)initialContext.lookup("java:comp/env/jms/Orders"); … MapMessage msg = (MapMessage)message; pid = msg.getString("ProductId"); qty = msg.getString( "Quantity"); cid = msg.getString("CustomerId"); Stock stock = sh.findByPrimaryKey(pid); stock.decreaseQuantity(qty); … qs = session.createSender(queue); TextMessage tm = session.createTextMessage(); String m = "For CustomerId = "+cid+" ProductId= "+pid+" Quantity= "+qty; tm.setText(m); qs.send(tm);... }

118 MDB : = propertyName="destination", propertyName="destinationType", propertyValue="javax.jms.Queue") }

119 Spring MVC Définition de la servlet dispatcher dans web.xml Annotations pour chaque classe Contrôleur = "/chemin") return ModelAndView Taglib SpringMVC?

120 WebService et style de WSDL Encoding Message LiteralEncoded RPCWSI-compliant type des paramètres non précisé : polymorphisme impossible Appel non validable par XSD : non WS-I compliant Polymorphisme possible dans les appels de SOAP Plusieurs appels de méthodes possibles en un seul appel SOAP DocumentWSI-compliant type des paramètres non précisé : polymorphisme impossible méthode non précisé : un seule méthode par appel SOAP non WSI-compliant Polymorphisme impossible

121 Configuration mod_proxy_balancer BalancerMember BalancerMember ProxyPass /test balancer://mycluster BalancerMember BalancerMember ProxyPass /test balancer://mycluster Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED BalancerMember route=1 BalancerMember route=2 ProxySet stickysession=ROUTEID ProxyPass /test balancer://mycluster Répartition Simple et sans état Répartition simple avec affinité de session

122 Répartition de charge depuis le serveur JEE TODO JBOSS

123 Maven Projet défini dans une fichier POM pom.xml Arborescence de projet type Définition des dépendances entre projets o org.easymock easymock 3.1 test Commandes de base : o mvn clean, compil, package, install, tomcat:deploy Utilisable depuis Eclipse Suite sur le support de cours "introMaven" de C. Dumoulin

124 Spring IoC TODO : assemby.xml, context.xml Utiliser Jetty Assembler

125 Historique des WebServices vs CORBA SOAP WSDL UDDI SOAP WSDL UDDI CGI ebXML WSFL WS-Policy WS-PolicyAssertions WS-PolicyAttachment WS-Policy Framework WS-SecurityPolicy WS-SecureConversation WS-Discovery WS-Inspection WS-Eventing WS-Addressing WS-Routing WS-Referral MTOM WS-Enumeration WS-Transfer ebXML WSFL WS-Policy WS-PolicyAssertions WS-PolicyAttachment WS-Policy Framework WS-SecurityPolicy WS-SecureConversation WS-Discovery WS-Inspection WS-Eventing WS-Addressing WS-Routing WS-Referral MTOM WS-Enumeration WS-Transfer CORBA ConcurrencyNaming TransactionProperty TradingSecurity ExternalizationPersistence Life cycleEvent LicensingTime RPC HTTP 1991 XML- RPC EJB 1999


Télécharger ppt "Java EE Java Enterprise Edition Ce document a été contient des parties adaptées de support de cours de P.Y. Gibello, T. Dandelot et C. Dumoulin Le contenu."

Présentations similaires


Annonces Google