Spring MVC Cedric Dumoulin.

Slides:



Advertisements
Présentations similaires
« Hello World! » Diapositive no.1. Ajout de la logique daffaire (« Business Logic ») Dans lentité « Employee » : /// /// Age as of today /// public int.
Advertisements

Ce, Cette, Ces Ce/Cette/Ces means this, that or these. Ce is used for masculine nouns Cette is used for feminine nouns Cette is used for feminine nouns.
PHP5 its a kind of magic. Chargement automatique function __autoload( $nom_classe ) { require_once('obj/'.$nom_classe.'.class.php'); } si on exécute le.
JEE 5 - JSF F.Pfister 2 institut eerie Les technologies du web Servlets JSP MVC Model 1 : servlets + JSP MVC Model.
Le pronom en. What does it do? En is a french object pronoun that is used to replace many expressions dependent on quantity En mostly refers to things.
DOM Document Object Model. Généralités Standard du W3C Parseur XML – Génération dun arbre dobjet – Construction totale de larbre DOM est spécifié en IDL.
SAX Simple API for XML. Généralités API non standard développé par les membres du forum XML-DEV Parseur XML – Orienté événement – Parsing dynamique SAX.
Séparation des préoccupations (c) 2004, Audrey Occello, LF8 MOC Seconde partie Un exemple de programmation orientée Aspect avec AspectJ.
Revenir aux basiques !. 1 Revenir aux basiques Processus Nécessité daméliorer la Maîtrise les Offres et Projets: lanalyse des causes racines montre un.
OTB Analog module: Input configuration with TSX PREMIUM (TSXCPP110)
Toolkit Web Framework Java pour les IHMs Cédric Dumas mars 2008 contrat Creative Commons Paternité-Pas d'Utilisation Commerciale- Partage.
Tiré du cours de Richard Grin
Managed Beans Classes pour représenter les données de formulaires Michel Buffa UNSA
1 AWAP : Administrable Wireless Access Point Projet de fin détude 2003 Cédric Logeais Mathias Faure.
PHP5 its a kind of magic. Chargement automatique function __autoload( $nom_classe ) { require_once('obj/'.$nom_classe.'.class.php'); } si on exécute le.
LOGO Profile Enterprise Java Beans Réaliser par: HAMROUNI Aymen HOUIJI Manel WESLATI Yassine.
Présentation JAXB et STRUTS²
Connexion base de données
Chapitre IV Object, interfaces, classes imbriquées.
Injection de dépendances
Les pronoms rélatifs Its the glue that holds sentences together…which makes it all possible!
LOG 02 Bases de Données Avancées Rappels sur JSP / Servlet
BlueJ_XI 1 Java, les objets : tout de suite ! Gestion des erreurs : les exceptions Notes de cours associées au chapitre 11 tutorial BlueJ
Forum JEE: framework STRUTS 1 et iBATIS
(Nom du fichier) - D1 - 01/03/2000 Le présent document contient des informations qui sont la propriété de France Télécom. L'acceptation de ce document.
10 Copyright © Oracle Corporation, Tous droits réservés. Autres concepts relatifs aux déclencheurs.
Structures de données et algorithmes – TP2
Architectures NTiers Paradigme MVC
JavaBeans Réalise par: EL KHADRAOUY TARIK AOUTIL SAFOWAN.
Struts 1 & 2 Tlohi ibtissam Tabit boutaina Ilias bouras
Projet JAVA EE Approfondi
SEG 3601 Élaboration de cas d'utilisation avec UCEd
TortoiseSVN N°. Subversion : pour quoi faire ? Avoir un espace de stockage commun – Tous les étudiants du SIGLIS ont un espace svn commun Partager vos.
Historique de SystemC Regroupe 4 courants didées: SCENIC Project : Synopsys+UC Irvine Philips System-Level Data Types, VSIA SLD DWG IMEC, Hardware-Software.
SAP Best Practices Commande en ligne pour les clients et les partenaires SAP.
Le patron de conception « Strategy » Simon Durocher ( )
ADOBE FLEX 4. © Logica All rights reservedNo. 2 Introduction Flex en action Autour de Flex Logica Le programme.
66 Utilisation des classes et des objets. 6-2 Objectifs A la fin de ce cours, vous serez capables de : Créer de nouvelles classes à laide de Eclipse Utiliser.
Follow the directions on each slide. If you finish early you may work on an assignment for another class.
JUnit Présentation complète de JUnit et « guide d’utilisation » en 13 transparents.
Framework Play 2.0 Démonstration du proof of concept
BBoard Fonctionne pas. BBoard Copier le répertoire dézippé dans le répertoire modules de post nuke Renommer ce répertoire en yabbse. Entrer le chemin.
1. Les structures de documentation pour la division ST. 2. Les types de document dans la division ST. 3. Linterface informatique. Lundi 8 Mai 2000 ST Quality.
1 CSI 2532 Lab5 Installation de JDBC Février 13, 2012.
CLS algorithm Step 1: If all instances in C are positive, then create YES node and halt. If all instances in C are negative, create a NO node and halt.
Cours 11 Threads. Chapitre X threads threadPOO-L3 H. Fauconnier3 Threads threads: plusieurs activités qui coexistent et partagent des données exemples:
COURS DE PROGRAMMATION ORIENTEE OBJET :
CSI1502 Principes fondamentaux en conception des logiciels Chapter 8: Gestion des exceptions.
1 CSI 2532 Lab6 Application Web et DB Février 27, 2012.
CSI2520 Le langage Scheme (2) Un langage de programmation fonctionnelle.
Fabienne Boyer Laboratoire LIG (INRIA-UJF-INPG) Projet SARDES, INRIA Rhône-Alpes APACHE/VELOCITY.
Fabienne Boyer Laboratoire LIG (INRIA-UJF-INPG) Projet SARDES, INRIA Rhône-Alpes Usage.
Français II H – Leçon 1B Structures
Michel Coletta - Journées PATTERNS Avril Grenoble1 STRUTS Introduction Technologies Java Architecture Développement Enseigner quoi ?
Adaptée du cours de Richard Grin
Chapitre 3 Les bibliothèques de balises JSP et la JSTL
JEE 5 F.Pfister 2 institut eerie JEE – Une plateforme serveur  Développement et exécution d'applications réparties.
Utilisation avancée.
Première CTP le 4 décembre Nouvelle CTP depuis le 1 er février RTM milieu de cette année.
Branche Développement Le présent document contient des informations qui sont la propriété de France Télécom. L'acceptation de ce document par son destinataire.
27/02/2006L3 MIAGE - GLO ADA1 Les Paquetages Permettent d’encapsuler un groupe d’entités logiquement reliées. Comme toute unité de programme, le paquetage.
AOP dans .Net avec PostSharp
Fabio Bortolotti THE PERSPECTIVE OF AN ARBITRATOR LE POINT DE VUE D’UN ARBITRE Production of documents – Direct examination and cross examination Production.
Propriétés. Propriétés ► Les propriétés peuvent être visibles dans les environnements de scripts ► Les propriétés peuvent être accédées par programmation.
Factory Design Patterns. Contents Factory patterns: principesFactory patterns: principes The Factory Method patternThe Factory Method pattern The Abstract.
Schéma de conception Factory Method Exemple Sylvain Giroux.
Présentation du framework JSF (Java Server Faces) dans le modèle événementiel MVCII
Struts.
Master 1 SIGLIS Intégration des données dans l’entreprise Stéphane Tallard JDBC: Java Database Connectivity Master 1 SIGLIS1JDBC.
MVC et applications Web
Transcription de la présentation:

Spring MVC Cedric Dumoulin

Plan Bibliographie Injecter des composants Spring et JEE Header Footer et Body Internationalization Validation Gestion des erreurs

Bibliographie Spring Framework http://docs.spring.io/spring/docs/3.2.5.RELEASE/spring-framework-reference/htmlsingle/#overview Designing and Implementing a Web Application with Spring http://spring.io/guides/tutorials/web/

Bibliographie Spring IO http://spring.io/ Developing a Spring Framework MVC application step-by-step (2.5) http://docs.spring.io/docs/Spring-MVC-step-by-step/ Spring MVC Framework Tutorial http://www.tutorialspoint.com/spring/spring_web_mvc_framework.htm Wikipedia http://en.wikipedia.org/wiki/Spring_Framework Quick start http://projects.spring.io/spring-framework/#quick-start

Bibliographie Spring 3.x tutorials http://www.roseindia.net/spring/spring3/index.shtml http://yannart.developpez.com/java/spring/tutoriel/ http://www.theserverside.com/tutorial/Spring-30-Tutorial-Setting-Up-Configuring-The-Environment

Guides Accessing Data with JPA http://spring.io/guides/gs/accessing-data-jpa/ Designing and Implementing a Web Application with Spring http://spring.io/guides/tutorials/web/

Injection d’objet

Spring fournit la notion de composant On peut injecter des composants dans d’autre composant Même principe que JEE Declarer un composant: @Component, @Named Injecter un composant: @Inject, @Autowired

Déclarer un composant Par défaut, le nom est le nom simple de la classe (commençant par une minuscule) 2 tags équivalent: @Component et @Named On peut spécifier le nom @Component("injectedComponent") Déclare un composant /** * A simple bean that will be injected elsewhere */ @Component public class InjectedBean { private String firstname = "John"; private String lastname = "Doe"; //.. Getter an setter .. }

Spring injecte le bean du bon type Injecter un composant @Inject Peut se faire sur un attribut, un setter, … On peut spécifier le nom @Inject("injectedComponent") @Controller public class HomeController { /** * Try to inject a bean */ @Inject protected InjectedBean injectedBean; // .. } Spring injecte le bean du bon type

EJB integration

Webographie 22.2 Accessing EJBs http://docs.spring.io/spring/docs/4.0.0.BUILD-SNAPSHOT/spring-framework-reference/htmlsingle/#ejb

Injecter des EJB Session dans Spring C’est possible ! En deux temps: déclarer le bean Session en tant que Component Spring injecter le component Spring

Déclarer le bean session en tant que Component declaration du namespace <?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:jee="http://www.springframework.org/schema/jee" xsi:schemaLocation= "http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd"> <jee:remote-slsb id="myComponent" jndi-name="java:global/ipint13.springetejb.ear/ipint13.springetejb.domain/MyServiceBean" business-interface="ipint13.springetejb.domain.MyService"/> </beans:beans> Dans le fichier de configuration la location de la def du namespace le nom spring l’interface du bean JEE le nom jndi est affiché par le serveur dans ses logs

Injecter le bean Methode classique @Controller public class HomeController { @Inject protected MyService injectedBean; /** * Simply selects the home view to render by returning its name. */ @RequestMapping(value = "/", method = RequestMethod.GET) public String home(Locale locale, Model model) { // … if( injectedBean == null ) { logger.info("The bean is not injected !."); return "home"; } // Injection works ! model.addAttribute("myInjectedBean", injectedBean ); return "success";

Accéder à un objet JNDI ou EJB <jee:jndi-lookup> Acces par JNDI <jee:local-slsb> Acces a un bean local <jee:remote-slsb> Acces à un bean distant <jee:local-slsb id="myComponent" jndi-name="ejb/myBean" business-interface="com.mycom.MyComponent"/> <bean id="myController" class="com.mycom.myController"> <property name="myComponent" ref="myComponent"/> </bean>

Accéder à un objet JNDI ou EJB Autre methode Permet d’utiliser le nom jndi directement dans les annotations A tester <bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"> <property name="alwaysUseJndiLookup" value="true" /> </bean>

Header, footer, body …

Tous les sites proposent des pages cohérentes Avec un header, un footer, un body, un menu … Faut-il coder ces éléments dans toutes les pages ? Et si on doit modifier le footer, faut-il alors modifier toutes les pages ? Solution : Utiliser un framework permettant de separer le header, le footer, le body et le menu … Ex: Tiles

Principe Définir une seule fois les parties communes: Un header, un footer un main menu Assembler les pages Seule le body change  il faut coder celui-ci à part. Une page == body + partie commune Vous définissez le body Le framework ce charge de construire la page en assemblant les parties pour vous

Webographie Spring 3 MVC: Tiles Plugin Tutorial with Example in Eclipse http://viralpatel.net/blogs/spring-3-mvc-tiles-plugin-tutorial-example-eclipse/ Tiles https://tiles.apache.org/

Internationalisation i18n

Webographie http://viralpatel.net/blogs/spring-3-mvc-internationalization-i18n-localization-tutorial-example/

Principe Utilise la notion de « Locale » Pays_langue FR_fr, US_en Dans le code, on utilise des constantes à la place du texte Les constantes sont définies dans des fichiers Pair nom=valeur Un fichier par langue Un fichier par défaut Tous les fichiers ont le même nom Mais des extensions en fonction du locale: messages.properties messages_FR_fr.properties

Alternatives: Des pages différentes en fonction du locale Possible avec Tiles

Spring MVC Les fichiers properties Permet d’utiliser des constantes dans les pages Les définitions sont dans des fichiers .properties fichier local = fr fichier par défaut pas définit = venant du fichier par défaut

La déclaration dans la page <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@taglib uri="http://www.springframework.org/tags" prefix="spring"%> <%@ page session="false" %> <html> <head> <title><spring:message code="page.home.title"/></title> </head> <body> <h1> <spring:message code="page.home.hello"/> </h1> <P> <spring:message code="page.home.timeOnServer"/> ${serverTime}. </P> </body> </html> La taglib utilisée Le message

La configuration Dans le fichier de configuration Spring [servlet]-config.xml Spécifier que l’on veut utiliser les messages de properties <!-- Specify the source for i18n --> <beans:bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <beans:property name="basename" value="classpath:messages" /> <beans:property name="defaultEncoding" value="UTF-8" /> </beans:bean>

Atelier Créer un nouveau projet Spring. Spring génère une page « home ». Internationaliser cette page.

Laisser l’utilisateur choisir sa langue Il faut ajouter un choix du local Il faut prendre en compte le changement  voir tuto http://viralpatel.net/blogs/spring-3-mvc-internationalization-i18n-localization-tutorial-example/

Validation

Documentation http://docs.spring.io/spring/docs/3.2.5.RELEASE/spring-framework-reference/htmlsingle/#validation 7.8.4 Spring MVC 3 Validation

Que valider ? Il faut valider pour se garantir : Spring 3.x Que valider ? Il faut valider pour se garantir : De mauvaises saisies dans les formulaires De données saisies non valables pour le métier Les mauvaises saisies peuvent être détectés par: la conversion de la requête http  objet command Les contraintes métiers peuvent être détectés par: des objets de validation

Erreur de conversion Spring 3.x @RequestMapping(method = RequestMethod.POST) protected String onSubmit( @ModelAttribute("commandAjout") CommandAjout commandAjout, BindingResult result, SessionStatus status ) throws Exception { if( result.hasErrors()) { return "formulaire"; } groupe.addMembre(commandAjout.getNouveauMembre()); status.setComplete(); return "confirmation"; retourne au formulaire en cas d’erreurs efface la session si ok @ModelAttribute permet de récupérer l’objet command. Il est peuplé à partir de la requete, donc avec les valeurs saisies dans le formulaire. Il y a conversion implicite String -> type dans l’objet commande Il peut y avoir plusieur s @ModelAttribute BindingResult result contient les éventuelles erreurs de conversion doit être placé immédiatement après le @ModelAttribute auquel il se réfere

Validation Action de valider des données en fonction du métier ex: 0<= age <150 Plusieurs possibilités avec Spring les technique se sont empilées avec le temps Les plus récentes: Validation explicite @Valid JSR-303 Bean Validation API

appel la validation, Utilise le BindResult Validation explicite /** Declare a validator object */ Validator contactValidator = new ContactValidator(); @RequestMapping(value = "/addContact2.html", method = RequestMethod.POST) public String addContact2(@ModelAttribute("command") Contact contact, BindingResult result, Model model) { contactValidator.validate(contact, result); // Check the binding results. Binding and validations errors are contained // in the BindingResult object. // If there is some binding or validation errors, stop and return // to the form. if( result.hasErrors()) { System.err.println("errors encountered !!"); return "contact"; } … Déclare un validator Nécessite un objet validator appel la validation, Utilise le BindResult Verifie le résultat

(attributeName, errorCode, defaultMsg) Exemple de Validator public class ContactValidator implements Validator { /* * This Validator validates *just Contact instances */ public boolean supports(Class clazz) { return Contact.class.equals(clazz); } public void validate(Object obj, Errors e) { ValidationUtils.rejectIfEmptyOrWhitespace(e, "firstname", "firstname.empty", "First Name is required"); "lastname", "lastname.empty", "Last Name is required"); Contact p = (Contact) obj; if (p.getAge() < 0) { e.rejectValue("age", "negativevalue", "Age should be >0"); } else if (p.getAge() > 110) { e.rejectValue("age", "too.darn.old", "Age seem too old"); (attributeName, errorCode, defaultMsg) errorCode  i18n

Spring et @Valid Préparation Annotation JSR-303 nécessite validation-api.jar Peut être utilisé avec Spring MVC nécessite de déclarer les validators (dans le controller par exemple) /** * Register a validator that will be lookup when a parameter is binded to a handler * argument (with @ModelAttribute() for example). * @param binder */ @InitBinder protected void initBinder(WebDataBinder binder) { // register the ContactValidator used to validate objects of type Contact. binder.setValidator(new ContactValidator() ); }

Spring et @Valid Utilisation /** Handler called when theform is submitted. * The @Valid annotation is used to validate the input model. Spring lookup for a * validator accepting the class. */ @RequestMapping(value = "/addContact.html", method = RequestMethod.POST) public String addContact(@Valid @ModelAttribute("command") Contact contact, BindingResult result, Model model) { // Check the binding results. Binding and validations errors are contained // in the BindingResult object. // If there is some binding or validation errors, stop and return // to the form. if( result.hasErrors()) { System.err.println("errors encountered !!"); return "contact"; } … Un validator pour ce type doit être accessible !

JSR-303 Bean validation API Annotation JSR-303 nécessite validation-api.jar Nécessite une implémentation du standard ! Les contraintes de validation sont directement dans l’objet à valider Voir doc Spring

Gestion des erreurs

Documentation 18.2 JSP & JSTL http://docs.spring.io/spring/docs/4.0.0.BUILD-SNAPSHOT/spring-framework-reference/htmlsingle/#view-jsp

Comment afficher les erreurs dans la page ? Spring renvoie l’objet Errors dans la réponse Cet objet contient toutes les erreurs Chaque erreur est identifiées par un id le nom de la propriété en général Le tag <form:errors …> utilise cet objet pour afficher des messages On indique l’id de l’erreur à vérifier le nom de la propriété en général …

L’objet Error est remplie par le Validator public class ContactValidator implements Validator { /* * This Validator validates *just Contact instances */ public boolean supports(Class clazz) { return Contact.class.equals(clazz); } public void validate(Object obj, Errors e) { ValidationUtils.rejectIfEmptyOrWhitespace(e, "firstname", "firstname.empty", "First Name is required"); "lastname", "lastname.empty", "Last Name is required"); Contact p = (Contact) obj; if (p.getAge() < 0) { e.rejectValue("age", "negativevalue", "Age should be >0"); } else if (p.getAge() > 110) { e.rejectValue("age", "too.darn.old", "Age seem too old"); (attributeName, errorCode, defaultMsg) errorCode  i18n

Affiché uniquement si l’erreur existe ! Le <form:form …> déclare où doivent être placé les messages d’erreurs <%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%> <html> <head> <title>Spring 3 MVC Series - Contact Manager</title> </head> <body> <h2>Contact Manager</h2> <form:form method="post" action="addContact.html"> <table> <tr> <td><form:label path="firstname">First Name</form:label></td> <td><form:input path="firstname" /></td> <%-- Show errors for firstname field --%> <td><form:errors path="firstname" /></td> </tr> <td><form:label path="lastname">Last Name</form:label></td> <td><form:input path="lastname" /></td> <%-- Show errors for lastname field --%> <td><form:errors path="lastname" /></td> … Affiché uniquement si l’erreur existe !