spring mvc
DESCRIPTION
Spring MVC. Cedric Dumoulin. Plan. Bibliographie Injecter des composants Spring et JEE Header Footer et Body Internationalization Validation Gestion des erreurs. Bibliographie. Spring Framework - PowerPoint PPT PresentationTRANSCRIPT
Spring MVC
Spring MVCCedric DumoulinPlanBibliographieInjecter des composantsSpring et JEEHeader Footer et BodyInternationalizationValidationGestion des erreurs
BibliographieSpring Frameworkhttp://docs.spring.io/spring/docs/3.2.5.RELEASE/spring-framework-reference/htmlsingle/#overviewDesigning and Implementing a Web Application with Springhttp://spring.io/guides/tutorials/web/BibliographieSpring IOhttp://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 Tutorialhttp://www.tutorialspoint.com/spring/spring_web_mvc_framework.htmWikipediahttp://en.wikipedia.org/wiki/Spring_FrameworkQuick starthttp://projects.spring.io/spring-framework/#quick-startBibliographieSpring 3.x tutorialshttp://www.roseindia.net/spring/spring3/index.shtmlhttp://yannart.developpez.com/java/spring/tutoriel/http://www.theserverside.com/tutorial/Spring-30-Tutorial-Setting-Up-Configuring-The-Environment
GuidesAccessing Data with JPAhttp://spring.io/guides/gs/accessing-data-jpa/Designing and Implementing a Web Application with Springhttp://spring.io/guides/tutorials/web/Injection dobjetSpring fournit la notion de composantOn peut injecter des composants dans dautre composantMme principe que JEEDeclarer un composant: @Component, @NamedInjecter un composant:@Inject, @Autowired
Dclarer un composantPar dfaut, le nom est le nom simple de la classe (commenant par une minuscule)2 tags quivalent: @Component et @NamedOn peut spcifier le nom@Component("injectedComponent")/** * A simple bean that will be injected elsewhere */@Componentpublic class InjectedBean {
private String firstname = "John";private String lastname = "Doe";
//.. Getter an setter ..}Dclare un composantInjecter un composant@InjectPeut se faire sur un attribut, un setter, On peut spcifier le nom@Inject("injectedComponent")
@Controllerpublic class HomeController {
/** * Try to inject a bean */@Injectprotected InjectedBean injectedBean;
// ..}Spring injecte le bean du bon typeEJB integrationWebographie22.2Accessing EJBshttp://docs.spring.io/spring/docs/4.0.0.BUILD-SNAPSHOT/spring-framework-reference/htmlsingle/#ejb
Injecter des EJB Session dans SpringCest possible !En deux temps:dclarer le bean Session en tant que Component Springinjecter le component SpringDclarer le bean session en tant que ComponentDans le fichier de configuration
declaration du namespacela location de la def du namespacele nom jndi est affich par le serveur dans ses logsle nom springlinterface du bean JEEInjecter le beanMethode classique@Controllerpublic class HomeController {
@Injectprotected 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";}
Accder un objet JNDI ou EJB
Acces par JNDI
Acces a un bean local
Acces un bean distant
Accder un objet JNDI ou EJBAutre methodePermet dutiliser le nom jndi directement dans les annotationsA tester
Header, footer, body Tous les sites proposent des pages cohrentesAvec un header, un footer, un body, un menu Faut-il coder ces lments 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
PrincipeDfinir une seule fois les parties communes:Un header, un footer un main menuAssembler les pagesSeule le body change il faut coder celui-ci part.Une page == body + partie communeVous dfinissez le bodyLe framework ce charge de construire la page en assemblant les parties pour vous
WebographieSpring 3 MVC: Tiles Plugin Tutorial with Example in Eclipsehttp://viralpatel.net/blogs/spring-3-mvc-tiles-plugin-tutorial-example-eclipse/Tileshttps://tiles.apache.org/Internationalisation i18nWebographiehttp://viralpatel.net/blogs/spring-3-mvc-internationalization-i18n-localization-tutorial-example/PrincipeUtilise la notion de Locale Pays_langueFR_fr, US_enDans le code, on utilise des constantes la place du texteLes constantes sont dfinies dans des fichiersPair nom=valeurUn fichier par langueUn fichier par dfautTous les fichiers ont le mme nomMais des extensions en fonction du locale:messages.propertiesmessages_FR_fr.properties
Alternatives:Des pages diffrentes en fonction du localePossible avec Tiles
Spring MVCLes fichiers propertiesPermet dutiliser des constantes dans les pagesLes dfinitions sont dans des fichiers .properties
fichier par dfautfichier local = fr
pas dfinit = venant du fichier par dfautLa dclaration dans la page
${serverTime}.
La taglib utiliseLe messageLa configurationDans le fichier de configuration Spring[servlet]-config.xmlSpcifier que lon veut utiliser les messages de properties
AtelierCrer un nouveau projet Spring. Spring gnre une page home. Internationaliser cette page.Laisser lutilisateur choisir sa langueIl faut ajouter un choix du localIl faut prendre en compte le changement
voir tutohttp://viralpatel.net/blogs/spring-3-mvc-internationalization-i18n-localization-tutorial-example/ValidationDocumentationhttp://docs.spring.io/spring/docs/3.2.5.RELEASE/spring-framework-reference/htmlsingle/#validation
7.8.4Spring MVC 3 Validation
Que valider ?Il faut valider pour se garantir :De mauvaises saisies dans les formulairesDe donnes saisies non valables pour le mtier
Les mauvaises saisies peuvent tre dtects par:la conversion de la requte http objet commandLes contraintes mtiers peuvent tre dtects par:des objets de validation
Spring 3.xErreur de conversion@ModelAttribute permet de rcuprer 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 commandeIl peut y avoir plusieur s @ModelAttributeBindingResult result contient les ventuelles erreurs de conversiondoit tre plac immdiatement aprs le @ModelAttribute auquel il se rfere@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 derreursefface la session si okSpring 3.xValidationAction de valider des donnes en fonction du mtierex: 0 110) { e.rejectValue("age", "too.darn.old", "Age seem too old"); } }}(attributeName, errorCode, defaultMsg)errorCode i18nSpring et @ValidPrparationAnnotation JSR-303ncessite validation-api.jarPeut tre utilis avec Spring MVCncessite de dclarer 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 @ValidUtilisation /** 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 APIAnnotation JSR-303ncessite validation-api.jarNcessite une implmentation du standard !Les contraintes de validation sont directement dans lobjet validerVoir doc Spring
Gestion des erreursDocumentation18.2JSP & JSTLhttp://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 lobjet Errors dans la rponseCet objet contient toutes les erreursChaque erreur est identifies par un id le nom de la proprit en gnral
Le tag utilise cet objet pour afficher des messagesOn indique lid de lerreur vrifierle nom de la proprit en gnral
Lobjet Error est remplie par le Validatorpublic 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 i18nLe dclare o doivent tre plac les messages derreurs
Spring 3 MVC Series - Contact Manager
Contact Manager
First Name Last Name Affich uniquement si lerreur existe !