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 http://docs.spring.io/spring/docs/3.2.5.RELEASE/spring -framework-reference/htmlsingle/#overview 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/

4 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_fra mework.htm http://www.tutorialspoint.com/spring/spring_web_mvc_fra mework.htm Wikipedia http://en.wikipedia.org/wiki/Spring_Framework Quick start http://projects.spring.io/spring-framework/#quick-start

5 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 http://www.theserverside.com/tutorial/Spring-30- Tutorial-Setting-Up-Configuring-The-Environment

6 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/

7

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

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

10 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; //.. } @Controller public class HomeController { /** * Try to inject a bean */ @Inject protected InjectedBean injectedBean; //.. } Spring injecte le bean du bon type

11

12 Webographie 22.2 Accessing EJBs http://docs.spring.io/spring/docs/4.0.0.BUILD- SNAPSHOT/spring-framework- reference/htmlsingle/#ejb http://docs.spring.io/spring/docs/4.0.0.BUILD- 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 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"; } @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 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 http://viralpatel.net/blogs/spring-3-mvc-tiles-plugin- tutorial-example-eclipse/ http://viralpatel.net/blogs/spring-3-mvc-tiles-plugin- tutorial-example-eclipse/ Tiles https://tiles.apache.org/

22

23 Webographie http://viralpatel.net/blogs/spring-3-mvc- 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 http://viralpatel.net/blogs/spring-3-mvc- internationalization-i18n-localization-tutorial-example/

31

32 Documentation http://docs.spring.io/spring/docs/3.2.5.RELEASE/spri ng-framework-reference/htmlsingle/#validation http://docs.spring.io/spring/docs/3.2.5.RELEASE/spri ng-framework-reference/htmlsingle/#validation 7.8.4 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 conversion @ModelAttribute 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 s @ModelAttribute BindingResult result contient les éventuelles erreurs de conversion doit être placé immédiatement après le @ModelAttribute auquel il se réfere @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"; } @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 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 explicite @Valid JSR-303 Bean Validation API

36 Validation explicite Nécessite un objet validator /** 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"; } … } /** 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 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 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() ); } /** * 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() ); }

39 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"; } … } /** 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 !

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 http://docs.spring.io/spring/docs/4.0.0.BUILD- SNAPSHOT/spring-framework- reference/htmlsingle/#view-jsp http://docs.spring.io/spring/docs/4.0.0.BUILD- 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