Cécile Hardebolle cecile.hardebolle@supelec.fr Développement web avec Java Tutoriel
Plan 1. Principes des applications web 2. Et Java dans tout ça? 3. Principaux composants Java EE pour le web 4. Persistance des données 5. Application Java EE 2
Principes des applications web 3
Principe des sites web Pages HTML statiques Obtention via le protocole HTTP (requête / réponse) Client Serveur web wwwdi.supelec.fr 1 Requête : http://wwwdi.supelec.fr/hardebolle/fichier. html C:\server\htdocs\hardebolle\ 3 Affichage : interprétation HTML HTML fichier. html 2 Réponse : fichier.html HTML fichier. html 4
HTML HTML = EXtensible HyperText Markup Language Un langage à base de «balises» XML avec une grammaire définie <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN "http://www.w3.org/tr/xhtml11/dtd/xhtml11.dtd"> html <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>le titre de la fenêtre</title> </head> <body> <p>voici ma première page</p> </body> </html> head title Le titre de la fenêtre body p Voici ma première page 5
Structuration de texte <body> <h1>gros titre</h1> <p>voici mon paragraphe</p> <h2>section</h2> <h3>sous-section</h3> <img src="help.png" alt="ampoule"/> <p>un nouveau paragraphe avec un <a href="http://www.supelec.fr">lien hypertexte</a>. </p> </body> 6
CSS (Cascading Style Sheets) HTML : apparence par défaut CSS : personnalisation de l apparence de HTML Attribut de définition de style <h1 style="color:purple;">gros titre</h1> Surcharge du style par défaut <h2>section</h2> h2 { text-decoration: underline; Identifiant <img id="ampoule" src="help.png" alt="ampoule"/> #ampoule { border: 3px dashed blue; Classe de style <p class="myp">voici mon paragraphe</p>.myp { font-style: italic; 7
Principe des applications web Génération dynamique du contenu HTML à partir d un langage de programmation Client Serveur web wwwdi.supelec.fr 1 Requête : http://wwwdi.supelec.fr/fichier. xyz 4 Affichage : interprétation HTML HTML fichier. xyz 3 Réponse : fichier.xyz (HTML) Script fichier. xyz 2 Exécution : Script HTML PHP, ASP, Perl, CGI 8
Formulaires Interaction avec l utilisateur Requête = envoi de données Réponse = résultat du traitement des données Client Serveur web wwwdi.supelec.fr HTML formulaire. xyz 1 Requête : http://wwwdi.supelec.fr/reponse.xyz + données 3 Réponse : reponse.xyz (HTML) Script 2 Exécution : Script HTML reponse. xyz & traitement des données 4 Affichage : interprétation HTML HTML reponse. xyz 9
Structure des formulaires <body> <h1>un formulaire</h1> <form action="reponse.xyz" method="post"> <label for="prenom">prénom :</label> <input type="text" id="prenom" name="prenom"/> <input type="submit" value="s'inscrire!"/> </form> </body> 10
Et Java dans tout ça? 11
Java : langage et plate-forme Java Platform Standard Edition (Java SE) = JVM (machine virtuelle) + APIs (bibliothèques) + Java 12 Source : Java SE 6 Documentation
Classe Java public class Person { private String name; private boolean deceased; public PersonBean(String n, boolean d) { this.name = n; this.deceased = d; public String getname() { return this.name; public void setname(string name) { this.name = name; public Integer dosomething(integer i) { return (i * i); public class AutreClasse { private Integer onenumber; public AutreClasse (Integer o) { this. onenumber = o; public Person createrobert(){ Person robert; robert = new Person("Robert, false); return robert; 13
Composants Composant = unité logique de traitement Objectif : modularité et réutilisation Propriétés : Identification : nom unique, référencé dans un annuaire Indépendance : utilisable tout seul Réutilisation : utilisable dans différents contextes Intégration : combinable avec d autres composants composant objety objetx Technologies d implémentation multiples Déploiement sur serveur 14
Composants et architectures N-tiers 3 niveaux types de responsabilités pour les composants Présentation Traitement Ressources Interaction avec l utilisateur Traitements métiers Gestion des ressources, des données N tiers sur lesquels sont distribuées les composants P P T R Client mobile Serveur web Serveur d applications Serveur de base de données 15 La phase de développement avec Java EE
Composants Java : JavaBeans Composant implémenté par une classe Java Classe Java mais conventions à respecter Sérialisation Constructeur par défaut Propriétés privées avec accesseurs (encapsulation et introspection) public <returntype> get<propertyname>() public void set<propertyname> (parameter) Méthodes d interception d événements Utilisation d écouteurs et génération d événements Ex : PropertyChangeListener 16
JavaBeans Exemple public class PersonBean implements Serializable { private String name; private boolean deceased; public PersonBean() { public String getname() { return this.name; public void setname(string name) { this.name = name; public boolean isdeceased() { return this.deceased; public void setdeceased(boolean deceased) { this.deceased = deceased; 17
Java Enterprise Edition Java EE Un ensemble de spécifications Proposées par la société Sun (Oracle) & portées par un consortium de sociétés internationales Dédiées au développement, au déploiement et à la gestion d applications n-tiers à base de composants centrées sur le serveur Basées sur Java 2 Platform, Standard Edition (J2SE) avec Les spécification du Serveur d Applications Des bibliothèques pour le développement d'applications d entreprises (API) Une implémentation de référence = le Serveur d Applications GlassFish 18
Ce que définit Java EE Des composants pour embarquer le code des différents éléments d une application Des conteneurs pour héberger les différents composants d une application Conteneur web Conteneur métier Des services support pour les aspects transverses Composants web Composants métiers Sécurité, transactions Des infrastructures de communication 19
Serveur de noms (JNDI) Sécurité (JAAS, JCE, JSSE) Transactions (JTA, JTS) Mails (Java Mail) Communication asynchrone (JMS) Accès aux données (JDBC) Connecteurs (JCA) Administration (JMX) Gestion du XML (JAX, DOM) Le serveur d application Java EE HTML/ XML Web Container Servlet EJB Session EJB Container EJB Entité JSP/JSF EJB Message Middleware Communication (TCP/IP, HTTP, SSL, RMI, RMI-IIOP) Services 20
Java EE Web Profile Sous-ensemble de spécifications séparé dédié au développement web Inclut Composants web Composants métier légers API communes N utilise que le conteneur Web Source : What s new in Java EE 6, Antonio Goncalves 21
Serveur de noms (JNDI) Sécurité (JAAS, JCE, JSSE) Transactions (JTA, JTS) Mails (Java Mail) Communication asynchrone (JMS) Accès aux données (JDBC) Connecteurs (JCA) Administration (JMX) Gestion du XML (JAX, DOM) Java EE Web Profile HTML/ XML Web Container JSP/JSF Servlet EJB Session EJB Container EJB Entité EJB Session EJB Entité EJB Message Middleware Communication (TCP/IP, HTTP, SSL, RMI, RMI-IIOP) Services 22
Architectures Java EE type P T R Navigateur web Java EE conteneur web Java EE conteneur d'ejb Serveur de base de données Full Profile P T R Navigateur web Java EE conteneur web Serveur de base de données Web Profile 23 La phase de développement avec Java EE
Principaux composants Java EE pour le web 24
Partie web de Java EE P T R Navigateur web Java EE conteneur web Serveur de base de données 25 La phase de développement avec Java EE
Servlets Servlet = composant Java, accessible à une URL donnée, destiné à : Récupérer les requêtes HTTP de l utilisateur Invoquer les traitements applicatifs Java correspondants Construire la page HTML de réponse pour l utilisateur Client Serveur Java EE wwwdi.supelec.fr 1 - Requête : http://wwwdi.supelec.fr/hardebolle/fichier. html /hardebolle/* 4 - Affichage : interprétation HTML HTML fichier. html 3 - Réponse : fichier.html Servlet 2 Exécution de la Servlet : Java HTML 26
Servlets Exemple @WebServlet(name="PremiereServlet", urlpatterns={"/premiereservlet") public class PremiereServlet extends HttpServlet { @Override public void doget(httpservletrequest requete, HttpServletResponse reponse) throws IOException, ServletException { reponse.setcontenttype("text/html"); PrintWriter pw = reponse.getwriter(); try { pw.print("<html>"); pw.print("<head>"); pw.print("<title>ma première servlet</title>"); pw.print("</head>"); pw.print("<body>"); pw.print("<h1>ca marche!</h1>"); pw.print("</body>"); pw.print("</html>"); finally { out.close(); Problèmes : maintenance, évolution! 27
Patron Modèle-Vue-Contrôleur (MVC) Principe = séparation des responsabilités Vue : gère les sorties = visualisation (interface utilisateur) Contrôleur : gère les entrées Traitement des actions de l utilisateur et choix des vues Gestion des modifications du modèle Modèle : gère la logique et les données Contrôleur Contrôleur Client Modèle Modèle Vue Vue 28
JavaServer Faces (JSF) Framework de composants web basé sur MVC amélioré : modèle = logique + données Navigateur Contrôleur = FacesServlet Vue = page Vue JSF Managed Logique Bean Modèle = JavaBean, EJB Modèle EJB = Enterprise JavaBean 29
Ce que JSF définit Contrôleur unique = FacesServlet Gère les événements et les interactions avec le client Modèle = Logique = Managed Beans ou «backing beans» Données = JavaBeans, Enterprise JavaBeans Vue = page JSF = arbre de composants Composants prédéfinis avec un rendu HTML Modèles de navigation Statique : liens hypertextes entre vues Dynamique : règles de navigation s appuyant sur un bean Outils : convertisseur et validateurs 30
Principe de JSF Client Serveur Java EE wwwdi.supelec.fr 1 - Requête : http://wwwdi.supelec.fr/hardebolle/fichier. xhtml /hardebolle/* 5 - Affichage : interprétation HTML HTML fichier. xhtml 4 - Réponse : fichier.xhtml 3 Rendu des composants : JSF HTML Faces Servlet Page JSF 2 Exécution du contrôleur Managed Bean fichier. xhtml 31
Composants JSF Un composant JSF = Une classe : gère les événements utilisateur UISelectOne choicemenu; Un tag : permet de l inclure dans une vue JSF <h:selectonemenu id="choice" value=" "> <f:selectitems value=" " /> </h:selectonemenu> Un rendu : génère la partie graphique de l interface utilisateur Par défaut : rendu HTML <select id="j_idt7:choice" name="j_idt7:choice" size="1"> <option value="1" selected="selected"> item 1</option> <option value="2">item 2</option> </select> Bibliothèques de composants prédéfinis et composables 32
Managed Beans (backing beans) Composant géré par le contrôleur JSF JavaBean mais avec annotations Gestion par le conteneur (création, cycle de vie ) Services basiques Identification unique, utilisation dans les composants JSF Expression Language (EL) Gestion du scope (durée de conservation de l'état) Gestion du cycle de vie via des callbacks Injection Conversion / validation des données 33
Managed Bean Exemple @ManagedBean @SessionScoped public class MyManagedBean implements Serializable { @NotNull @Size(max=50) private String name; public MyManagedBean (){ @PostConstruct public void mysetup () { this.name = "Duke"; public String getname(){ return name; public void setname(string n){ this.name = n; 34 public String sayhello() { return "Hello, I m " + this.name;
Managed Beans et Composants JSF Exemple <h:body> <f:view> <h:form> <h1>création d'un compte</h1> <p>nom :</p> <h:inputtext value="#{personbean.name" required="true" /> </h:inputtext> <p>prénom :</p> <h:inputtext value="#{personbean.fname"> <f:validatelength maximum="50"/> </h:inputtext> <h:commandbutton value="valider" action="#{personbean.createaccount()" /> </h:form> </f:view> </h:body> 35 @ManagedBean @SessionScoped public class PersonBean implements Serializable { private String name; private String fname; public CatalogBean(){ public String getname(){ return name; public void setname(string n){ this.name = n; public String createaccount(){ return "createaccountsuccess";
JSF et navigation web Configuration de la navigation (faces-config.xml) Règle de navigation = transition d'une vue à une autre Outcome = Chaine de caractère représentant le résultat d'un traitement (Ex : fail, pass, success, case5, casetruc ) Peut conditionner l'activation d'une règle de navigation Types de navigation Navigation statique = navigation par identifiant de vue / outcome Navigation dynamique = Méthode d'un backing bean rendant plusieurs outcomes possibles Règles de navigation différentes suivant les outcomes 36
JSF et navigation web Exemple <h:link outcome="/etape1.xhtml" value="aller à l'étape 1"/> <h:link outcome="step1" value="aller à l'étape 1"/> <h:commandlink action="step1" value="aller à l'étape 1"/> Configuration <navigation-rule> <from-view-id>/etape0.xhtml</from-view-id> <navigation-case> <from-outcome>step1</from-outcome> <to-view-id>/etape1.xhtml</to-view-id> </navigation-case> </navigation-rule> <h:commandlink action="#{mybean.alleretapesuivante()" value="aller à l'étape suivante" /> Managed Bean public String alleretapesuivante(){ if( ){ return "step1"; else if( ){ return "step2"; return "default"; 37
Sessions et composants web Session web = maintient d'un état conversationnel avec un client à travers plusieurs couples requête / réponse Permet de stocker des informations alors que l utilisateur change plusieurs fois de pages web Session JSF = session web Mettre des données en sessions avec un ManagedBean @ManagedBean @SessionScoped public class PersonBean implements Serializable { Mettre des données en session «à la main» ExternalContext ctx = FacesContext.getCurrentInstance().getExternalContext(); ctx.getsession(ø/true/false); ctx.getsessionmap().put(key, value); ctx.getsessionmap().get(key); 38
Persistance des données 39
Partie persistance de Java EE P T R Navigateur web Java EE conteneur web Serveur de base de données 40 La phase de développement avec Java EE
Bases de données Base de données = ensemble de tables Table = colonnes * lignes Colonnes = propriétés Ligne = ensemble de valeurs pour les différentes propriété Clé primaire = identifiant unique d une ligne Stockage persistant sur un serveur Gestion par un SGBD (Système de Gestion de Base de Données) 41
Persistance en base de données Besoin = Create + Read + Update + Delete (CRUD) Problème = mapping relationnel / objet des données Serveur d'applications Java EE Serveur de base de données Application Objets Java Conversion Connecteur Connecteur Lignes de table Données Objet Relationnel 42
Java Persistence API (JPA) JPA = spécification d un mapping relationnel / objet (Object Relational Mapping ORM) Composant pour accéder à la base de données = EntityManager Prédéfini (pas besoin de l écrire) Générique Composants pour stocker les données = EJB Entity Langage de requêtes = Java Persistence Query Language (JPQL) Plusieurs implémentations EclipseLink (Oracle TopLink) JBoss Hibernate S'appuie sur un connecteur de base de données Ex : JDBC 43
Principe de JPA Serveur Java EE Serveur de bases de données Bean, Vue Entity Manager JDBC JDBC Application Objets EJB Entity Conversion 44
EJB Entity Composant persistant partagé par plusieurs clients Représente des données métiers stockées dans une base de données Une classe correspond à une table Les attributs définis dans la classe correspondent aux colonnes de la table Une instance de la classe (= un objet) représente une ligne de la table Posséde une identité explicite (clé primaire) EJB Entity JavaBean mais Avec des annotations qui définissent le mapping relationnel/objet Gestion par le conteneur (création, cycle de vie ) 45
EJB Entity Exemple @Entity @Table(name = "person") public class Personne implements Serializable { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) @Column(name = "id") private int id; @Basic(optional = false) @Column(name = "name") private String nom; public Personne() { super(); public int getid() { return this.id; public void setid(int id) { this.id = id; public String getnom() { return this.nom; public void setnom(string nom) { this.nom = nom; 46
JPA et JSF Serveur Java EE Serveur de bases de données Page JSF Managed Bean Entity Manager JDBC JDBC fichier. xhtml Application Objets EJB Entity Conversion 47
JPA et patron façade Patron Façade = ajout d un intermédiaire entre l application et l EntityManager Page JSF Managed Bean EJB Session Stateless Entity Manager JDBC fichier. xhtml Application Objets EJB Entity Conversion Découplage de l accès aux ressources 48
Utilisation d un EJB Session Stateless en façade EJB Session Stateless Façade (généré automatiquement) @Stateless public class MyFacadeBean implements Serializable { @PersistenceContext (unitname = "person-pu") private EntityManager em; Autre composant (ManagedBean JSF, EJB ) @ManagedBean public class MyMBean { @EJB MyFacadeBean bean; public MyFacadeBean(){ public void create(personne personne) { em.persist(personne); public void createpersonne(string name){ Personne p = new Personne(); p.setname(name); bean.create(p); 49
Application Java EE 50
Application Java EE Application = composants + métadonnées Composants Distribués ou non Différents types et responsabilités Métadonnées Informations nécessaires à la configuration ( annotations) Liens entre composants, paramètres Aspects transverses : sécurité, transactions Informations nécessaires au déploiement ( fichiers XML) Lien avec les ressources du serveur d'applications Lien avec les ressources accessibles depuis le serveur 51
Packaging application.ear composants métadonnées moduleweb.war moduleejb.jar 52
A vous de jouer! 53
Annexes 54
Cycle de vie de la FacesServlet Source : Blog Sravan Modugula 55
Enterprise JavaBeans : EJBs «Composants distribués transactionnels réutilisables et centrés sur la logique métier» JavaBean mais avec annotations Gestion par le conteneur (création, cycle de vie ) Services additionnels : Annotations spécifiques Transactions, persistance Différents types EJB Session EJB Message EJB Entity EJB Session Stateless EJB Session Stateful EJB Session Singleton 56
EJB Entity Mapping des relations Dans la classe Table1 @OneToOne private Table2 t2object; Dans la classe Table3 @OneToMany(mappedBy="t3object", cascade= {CascadeType.ALL) private List<Table4> t4list; Dans la classe Table4 @ManyToOne @JoinColumn(name="table3_id") private Table3 t3object; Dans la classe Table5 @ManyToMany(cascade={CascadeType.ALL) @JoinTable(name="t5_t6", joincolumns={@joincolumn(name="table5_id"), inversejoincolumns={@joincolumn(name = "table6_id")) private List<Table6> t6list; 57
JPQL JPQL = langage de requêtes pour manipuler les entités Syntaxe SQL Requêtes exécutées par l EntityManager Query Encapsule une requête Permet d obtenir les résultats Query q = em.createquery( "select p from Personne p where p.nom='robert'"); q.getsingleresult(); NamedQuery = requête prédéfinie @Entity @Table(name = "person") @NamedQuery(name="getPersonByName", query="select a from Personne a where a.name = :name") public class Personne implements Serializable { @PersistenceContext(unitName = "person-pu") private EntityManager em; public Personne getpersonneparnom(string nom) { Query q = em.createnamedquery("getpersonbyname"); q.setparameter("name", nom); return (Personne) q.getsingleresult(); 58
Sécurité Caractéristiques de la sécurité d'une application («DICT/P») Intégrité et confidentialité Autorisation (contrôle d'accès) = identification + authentification Traçabilité / preuve : non répudiation, audit Disponibilité : qualité de service Mécanismes mis en œuvre dans Java EE Plusieurs niveaux de sécurité Niveau application Niveau transport Niveau message (web services) Plusieurs façons de sécuriser Sécurité déclarative via les descripteurs de déploiement et via les annotations Sécurité programmatique (déconseillée) Applicable aux composants web et aux EJBs 59
Contrôle d'accès : vocabulaire Fondamentaux User = informations d identité d un utilisateur Group = ensemble d'utilisateurs (généralement classifiés selon une caractéristique commune) Realm = ensemble d'utilisateurs et de groupes (implémenté par une base de données, un annuaire, un fichier ) Role = privilège d'accès sur un ensemble de ressources Pour contrôler l accès à une application Role mapping = associe un rôle à un utilisateur / groupe pour une ressource Une fois l utilisateur identifié et authentifié Principal = information identifiant l utilisateur ( login) Credential = information authentifiant l utilisateur ( mot de passe) 60
Contrôle d accès sur un composant web Définition des rôles via le fichier «web.xml» <security-constraint> <display-name>contrainte d accès admins</display-name> <web-resource-collection> <web-resource-name>ressources admins</web-resource-name> <description>administration du site</description> <url-pattern>/secureadmin/*</url-pattern> </web-resource-collection> <auth-constraint> <description>contrainte d authentification admins</description> <role-name>admins</role-name> </auth-constraint> </security-constraint> <security-role> <description/> <role-name>admins</role-name> </security-role> <login-config> <auth-method>form</auth-method> <realm-name>jdbcrealm</realm-name> <form-login-config> <form-login-page>/login.xhtml</form-login-page> <form-error-page>/loginerror.xhtml</form-error-page> </form-login-config> </login-config> 61
Contrôle d accès sur un composant web Role Mapping = correspondance utilisateur / groupe rôle via le fichier «sun-web.xml» <security-role-mapping> <role-name>admins</role-name> <group-name>admins</group-name> </security-role-mapping> <security-role-mapping> <role-name>webusers</role-name> <principal-name>test</principal-name> </security-role-mapping> 62