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

Spring MVC Cedric Dumoulin.

Présentations similaires


Présentation au sujet: "Spring MVC Cedric Dumoulin."— Transcription de la présentation:

1 Spring MVC Cedric Dumoulin

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

3 Bibliographie Spring Framework
Designing and Implementing a Web Application with Spring

4 Bibliographie Spring IO
Developing a Spring Framework MVC application step-by-step (2.5) Spring MVC Framework Tutorial Wikipedia Quick start

5 Bibliographie Spring 3.x tutorials

6 Guides Accessing Data with JPA
Designing and Implementing a Web Application with Spring

7 Injection d’objet

8 Spring fournit la notion de composant
On peut injecter des composants dans d’autre composant Même principe que JEE Declarer Injecter un composant:

9 Déclarer un composant Par défaut, le nom est le nom simple de la classe (commençant par une minuscule) 2 tags 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 .. }

10 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

11 EJB integration

12 Webographie 22.2 Accessing EJBs

13 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

14 Déclarer le bean session en tant que Component
declaration du namespace <?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns=" xmlns:xsi=" xmlns:beans=" xmlns:context=" xmlns:jee=" xsi:schemaLocation= " <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

15 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";

16 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>

17 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>

18 Header, footer, body …

19 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

20 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

21 Webographie Spring 3 MVC: Tiles Plugin Tutorial with Example in Eclipse Tiles

22 Internationalisation i18n

23 Webographie

24 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

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

26 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

27 La déclaration dans la page
taglib uri=" prefix="c" %> uri=" 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

28 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>

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

30 Laisser l’utilisateur choisir sa langue
Il faut ajouter un choix du local Il faut prendre en compte le changement  voir tuto

31 Validation

32 Documentation 7.8.4 Spring MVC 3 Validation

33 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

34 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 BindingResult result contient les éventuelles erreurs de conversion doit être placé immédiatement après auquel il se réfere

35 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

36 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 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

37 (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

38 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 for example). binder */ @InitBinder protected void initBinder(WebDataBinder binder) { // register the ContactValidator used to validate objects of type Contact. binder.setValidator(new ContactValidator() ); }

39 Spring et @Valid Utilisation
/** Handler called when theform is submitted. * annotation is used to validate the input model. Spring lookup for a * validator accepting the class. */ @RequestMapping(value = "/addContact.html", method = RequestMethod.POST) public 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 !

40 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

41 Gestion des erreurs

42 Documentation 18.2 JSP & JSTL

43 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 …

44 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

45 Affiché uniquement si l’erreur existe !
Le <form:form …> déclare où doivent être placé les messages d’erreurs uri=" 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 !


Télécharger ppt "Spring MVC Cedric Dumoulin."

Présentations similaires


Annonces Google