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

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

Présentations similaires


Présentation au sujet: "Cedric Dumoulin. Plan Bibliographie Injecter des composants Spring et JEE Header Footer et Body Internationalization Validation Gestion des erreurs."— Transcription de la présentation:

1 Cedric Dumoulin

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

3 Bibliographie Spring Framework -framework-reference/htmlsingle/#overview -framework-reference/htmlsingle/#overview 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 mework.htm mework.htm Wikipedia Quick start

5 Bibliographie Spring 3.x tutorials Tutorial-Setting-Up-Configuring-The-Environment Tutorial-Setting-Up-Configuring-The-Environment

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

7

8 Spring fournit la notion de composant On peut injecter des composants dans dautre composant Même principe que JEE Declarer Injecter

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 /** * A simple bean that will be injected elsewhere public class InjectedBean { private String firstname = "John"; private String lastname = "Doe"; //.. Getter an setter.. } /** * A simple bean that will be injected elsewhere public class InjectedBean { private String firstname = "John"; private String lastname = "Doe"; //.. Getter an setter.. } Déclare un composant

10 Injecter un Peut se faire sur un attribut, un setter, … On peut spécifier public class HomeController { /** * Try to inject a bean protected InjectedBean injectedBean; //.. public class HomeController { /** * Try to inject a bean protected InjectedBean injectedBean; //.. } Spring injecte le bean du bon type

11

12 Webographie 22.2 Accessing EJBs SNAPSHOT/spring-framework- reference/htmlsingle/#ejb SNAPSHOT/spring-framework- reference/htmlsingle/#ejb

13 Injecter des EJB Session dans Spring Cest 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 Dans le fichier de configuration declaration du namespace la location de la def du namespace le nom jndi est affiché par le serveur dans ses logs le nom spring linterface du bean JEE

15 Injecter le bean Methode public class HomeController protected MyService injectedBean; /** * Simply selects the home view to render by returning its name. = "/", 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"; public class HomeController protected MyService injectedBean; /** * Simply selects the home view to render by returning its name. = "/", 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 Acces par JNDI Acces a un bean local Acces à un bean distant

17 Accéder à un objet JNDI ou EJB Autre methode Permet dutiliser le nom jndi directement dans les annotations A tester

18

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 tutorial-example-eclipse/ tutorial-example-eclipse/ Tiles https://tiles.apache.org/

22

23 Webographie internationalization-i18n-localization-tutorial- example/

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 dutiliser des constantes dans les pages Les définitions sont dans des fichiers.properties fichier par défaut fichier local = fr pas définit = venant du fichier par défaut

27 La déclaration dans la page ${serverTime}. ${serverTime}. La taglib utilisée Le message

28 La configuration Dans le fichier de configuration Spring [servlet]-config.xml Spécifier que lon veut utiliser les messages de properties

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

30 Laisser lutilisateur choisir sa langue Il faut ajouter un choix du local Il faut prendre en compte le changement voir tuto internationalization-i18n-localization-tutorial-example/

31

32 Documentation ng-framework-reference/htmlsingle/#validation ng-framework-reference/htmlsingle/#validation Spring MVC 3 Validation

33 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 Spring 3.x

34 Erreur de permet de récupérer lobjet command. Il est peuplé à partir de la requete, donc avec les valeurs saisies dans le formulaire. Il y a conversion implicite String -> type dans lobjet commande Il peut y avoir plusieur BindingResult result contient les éventuelles erreurs de conversion doit être placé immédiatement après auquel il se = RequestMethod.POST) protected String CommandAjout commandAjout, BindingResult result, SessionStatus status ) throws Exception { if( result.hasErrors()) { return "formulaire"; } groupe.addMembre(commandAjout.getNouveauMembre()); status.setComplete(); return "confirmation"; = RequestMethod.POST) protected String 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 derreurs efface la session si ok Spring 3.x

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 JSR-303 Bean Validation API

36 Validation explicite Nécessite un objet validator /** Declare a validator object */ Validator contactValidator = new = "/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"; } … } /** Declare a validator object */ Validator contactValidator = new = "/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 appel la validation, Utilise le BindResult Verifie le résultat

37 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"); ValidationUtils.rejectIfEmptyOrWhitespace(e, "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"); } 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"); ValidationUtils.rejectIfEmptyOrWhitespace(e, "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 (attributeName, errorCode, defaultMsg) errorCode i18n

38 Spring 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 protected void initBinder(WebDataBinder binder) { // register the ContactValidator used to validate objects of type Contact. binder.setValidator(new ContactValidator() ); } /** * Register a validator that will be lookup when a parameter is binded to a handler * argument for example). binder protected void initBinder(WebDataBinder binder) { // register the ContactValidator used to validate objects of type Contact. binder.setValidator(new ContactValidator() ); }

39 Spring Utilisation /** Handler called when theform is submitted. * annotation is used to validate the input model. Spring lookup for a * validator accepting the class. = "/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"; } … } /** Handler called when theform is submitted. * annotation is used to validate the input model. Spring lookup for a * validator accepting the class. = "/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 lobjet à valider Voir doc Spring

41

42 Documentation 18.2 JSP & JSTL SNAPSHOT/spring-framework- reference/htmlsingle/#view-jsp SNAPSHOT/spring-framework- reference/htmlsingle/#view-jsp

43 Comment afficher les erreurs dans la page ? Spring renvoie lobjet 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 utilise cet objet pour afficher des messages On indique lid de lerreur à vérifier le nom de la propriété en général …

44 Lobjet 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"); ValidationUtils.rejectIfEmptyOrWhitespace(e, "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"); } 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"); ValidationUtils.rejectIfEmptyOrWhitespace(e, "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 (attributeName, errorCode, defaultMsg) errorCode i18n

45 Le déclare où doivent être placé les messages derreurs Spring 3 MVC Series - Contact Manager Contact Manager First Name Last Name … Spring 3 MVC Series - Contact Manager Contact Manager First Name Last Name … Affiché uniquement si lerreur existe !


Télécharger ppt "Cedric Dumoulin. Plan Bibliographie Injecter des composants Spring et JEE Header Footer et Body Internationalization Validation Gestion des erreurs."

Présentations similaires


Annonces Google