Cedric Dumoulin
Objectifs Comprendre l architecture typique d une application web Exemple: Application permettant de lister un catalogue d articles, et de créer des articles Expérimenter avec: EJB, JPA Spring Serveur Glassfish Derby?
Les problèmes Architecture de l application Classes, packages, pages Répartition dans des projets Eclipse Couche présentation web Le contrôleur doit connaître le package domaine Le contrôleur doit être associer avec un bean session La couche doit être packagé avec tout les jars nécessaire Package domaine, interface du bean session
Les problèmes (suite) Couche domaine Le bean session doit être associé à l EntityManager Le bean session doit être capable de créer des éléments du domaine, et de les persister Le bean session doit être capable de retirer des élément du domaine de la BD Il faut associer l EntityManager à une datasource Il faut déclarer la datasource, et la connecter à la BD Il faut déployer le site web, et le domaine
Architecture de l application Classes, packages, pages Vos propositions? Répartition dans des projets Eclipse Un projet web Contient les pages et les controleurs Un projet domaine Le domain Les interfaces des servlets Les servlets
Travail Créer les projets Eclipse 1 web 1 EJB Ecrire couche web Contrôleur sans association avec le domaine Page Tester le déploiement Ecrire bean session Bean session catalog, sans JPA Le catalogue crée une liste d articles Ecrire un client simple pour tester http://blog.paumard.org/tutoriaux/eclipse-glassfish-ejb/
Couche présentation web Le contrôleur doit connaître le package domaine Compilation : ajuster le buildpath Execution :???
Travail 2 Modifier le contrôleur Il crée un article, l ajoute dans une liste, et affiche la liste dans la page Tester le déploiement, et trouver une solution
Couche présentation web (suite) Le contrôleur doit être associer avec un bean session @Inject(«beanName») Ou Mecanisme Spring? La couche doit être packagé avec tout les jars nécessaire Package domaine, interface du bean session Paramètre du projet dans Eclipse? Ou utiliser un ear rassemblant tous les jars de l application
Travail 3 Connecter la couche présentation et la couche domaine Injecter le bean session dans le contrôleur Tester le déploiement
Couche domaine Le bean session doit être associé à l EntityManager Le bean session doit être capable de créer des éléments du domaine, et de les persister Le bean session doit être capable de retirer des élément du domaine de la BD Il faut associer l EntityManager à une datasource Il faut déclarer la datasource, et la connecter à la BD Il faut déployer le site web, et le domaine
Travail 4 Transformer Article en entity @Entity + id Fichier persistence.xml Modifier le bean session pour qu il utilise des Articles sauvegardés en BD S inspirer de http://blog.paumard.org/tutoriaux/eclipse-glassfish-ejb/ Tester!
Spring Comment créer un objet domaine et l injecter dans les Contrôleurs Déclarer l objet du domaine Voir cour sur Spring <bean /> L injecter dans le contrôleur public class AllArticleControler { protected ArticleCatalogRemote catalog; public ArticleCatalogRemote getcatalog() { return catalog; } @Inject @Named("catalog") public void setcatalog(articlecatalogremote catalog) { this.catalog = catalog; }
Constitution Bean Entity Pour la persitance Bean Session Sert de facade Bean message Pour des communications fiable asynchrone Ces beans sont gérés par un containeur EJB!
Bean Entity Représentent les objets persistants du domaine Suivent le standard JPA POJO annoté @Entity Voir cours précédents sur JPA Sont généralement manipulés par les bean session (CRUD) Ne pas oublier des les rendre persitant EntityManager.persist(entity).
Exemple Entity @Entity public class Article implements Serializable { /** * */ private static final long serialversionuid = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) protected int id; protected String name; protected String description; protected int price; protected int stock;...
Bean Session Un (ou plusieurs) bean en tant que façade Le bean fournit l API d utilisation La couche présentation accède au domaine par ce bean Le bean agit sur les objets du domaine Le bean peut créer/lire/mettre a jour/detruire des entitées Un bean session peut invoquer d autre bean sessions
Exemple Bean accédant un entity /** * Session Bean implementation class ArticleCatalogWithJPABean * A session bean used to access a Catalog of Article. * Articles are stored in a DB with JPA. */ @Stateless(mappedName = "catalogwithjpa") @LocalBean public class ArticleCatalogWithJPABean implements ArticleCatalogWithJPARemote { @PersistenceContext protected EntityManager em; public List<Article> allarticles() { // Read the existing entries and write to console } Query q = em.createquery("select t from Article t"); return q.getresultlist();
Entity = objet à placer dans la BD Comment faire le lien avec la BD Quelle BD est utilisée?
Lien application Base de Données L application utilise un EntityManager Pour associer un objet à labd Pour interroger la BD Pour retirer des objets de la BD L entitymanager est associé à une DataSource La DataSource est un nom logique représentant la BD Le containeur déclare des DataSources Ce sont des sources de données Peuvent être utilisées par plusieurs application Sont associées à un pool de connexion Le containeur déclare des pools de connexions Un pool est une connexion vers une base de donnée
Association EntityManager - DataSource L EntityManager représente une «unité de persitence» Le fichier persitence.xml Déclare l unité de persitence Associe l unité à une DataSource Permet de spécifier des propriétés supplémentaires (pour JPA, pour la DB, )
Persistence.xml pour glassfish <?xml version="1.0" encoding="utf-8"?> <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> <persistence-unit name="catalog" transaction-type="jta"> <!-- respecter l'ordre de declaration!!! --> <!-- Eclipse link JPA implementation --> <!-- provider>org.eclipse.persistence.jpa.persistenceprovider</provider> --> <!-- Data source definition --> <jta-data-source>jdbc/ipidb</jta-data-source> <class>ipint12.sitemarchand.domain.article.article</class> <properties> <!-- EclipseLink should create the database schema automatically --> <!-- drop-and-create-tables, create-tables, database --> <property name="eclipselink.ddl-generation.output-mode" value="drop-and-create-tables" /> <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/> </properties> </persistence-unit> </persistence>
Déclaration d une Datasources Ce fait au niveau du serveur Une datasource comporte: Un nom Un pool de connexion
Exemple datasource Glasfish Le faire dans la console d admin
Déclaration d un Pool de connexion Un pool de connexion est une connexion sur la BD Specifie: Le type de la BD Le connecteur, Le nom, le login/passwrd, la localisation, L url et le port du serveur,... Nécessite la doc du serveur pour être déclaré correctement utiliser un pool prédéfini Tout les serveur en ont un en générale
Déclaration d un Pool de connexion Glassfish Utiliser DerbyPool Le faire dans la console d admin
2 étapes Dans le fichier de configuration de Spring Associer l EJB avec un nom Spring Injecter l objet dans le controleur <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:context="http://www.springframework.org/schema/context" xsi:schemalocation= "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <jee:jndi-lookup id="catalog" jndi-name="articlecatalog" cache="true" /> <jee:jndi-lookup id="catalogjpa" jndi-name="catalogwithjpa" cache="true" />
2 étapes Injecter l objet dans le controleur public class AllArticleControler { protected ArticleCatalogRemote catalog; public ArticleCatalogJPARemote getcatalog() { return catalog; } @Inject @Named("catalogJPA") public void setcatalog(articlecatalogjparemote catalog) { this.catalog = catalog; }
Utiliser @Inject
Client Glassfish public static void main(string[] args) { try { // création du "contexte initial" = de la connexion à l'annuaire du serveur InitialContext context = new InitialContext(); // requête sur le nom de la ressource que l'on veut, ici notre EJB ArticleCatalogWithJPARemote catalog = (ArticleCatalogWithJPARemote)context.lookup("catalogWithJPA") ; System.out.println("Catalog = " + catalog) ; // Create articles catalog.newarticle("voiture", 3, "une belle voiture", 5); System.out.println("done!"); } catch (NamingException e) { e.printstacktrace(); } }
Client Geronimo public static void main(string[] args) { try { // création du "contexte initial" = de la connexion à l'annuaire du serveur Properties prop=new Properties(); prop.put(context.initial_context_factory, "org.apache.openejb.client.remoteinitialcontextfactory"); prop.put("java.naming.provider.url", "ejbd://localhost:4201"); Context context = new InitialContext(prop); // requête sur le nom de la ressource que l'on veut, ici notre EJB ArticleCatalogWithJPARemote catalog = (ArticleCatalogWithJPARemote)context.lookup("catalogWithJPA") ;
Packager les deux couches Dans un ear Sous Eclipse: Créer un projet ear Spécifier les plugins qu il doit contenir Deployer l ear sur le serveur
Tout un art Lancer Glassfish en dehors de Eclipse Lancer le serveur de BD!! Compiler vos projets Exportez vos projet vers le repertoire de Glassfish: glassfish/domains/doamin1/autodeploy