spring mvc

45
Spring MVC Cedric Dumoulin

Upload: jamalia-crosby

Post on 03-Jan-2016

33 views

Category:

Documents


0 download

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 Presentation

TRANSCRIPT

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 !