Controller annotati con Spring MVC 2.5
Spring MVC
The Old Style
The annotated style @Controller @ RequestMapping( {"/my/*.html") public class MyController { @RequestMapping public void index() { // do something useful
Configuration No, thanks! (at least while I m writing the code)
WEB-INF/web.xml < web-app> < display-name> JavaDay 2009 Demo Web Application < /display-name> <!-- < context-param> < param-name> contextconfiglocation < /param-name> < param-value>/web-inf/applicationcontext.xml < /param-value> < /context-param> --> < listener> < listener-class>org.springframework.web.context.contextloaderlistener < /listener-class> < /listener> < servlet> < servlet-name>javaday < /servlet-name> < servlet-class>org.springframework.web.servlet.dispatcherservlet < /servlet-class> < load-on-startup >1< /load-on-startup> < /servlet> < servlet-mapping> < servlet-name> javaday < /servlet-name> < url-pattern >*.html < /url-pattern> < /servlet-mapping> < welcome-file-list> < welcome-file> redirect.jsp < /welcome-file> < /welcome-file-list> < /web-app>
WEB-INF/javaday-servlet.xml <?xml version=" 1. 0 " encoding="utf-8"? > <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2 001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> < context:component-scan base-package=" it.jugpadova.javaday.controller"/> <!-- <bean class="org.springframework.web.servlet.mvc.annotation.annotationmethodhandleradapter"> < property name="webbindinginitializer" > < bean class="it.jugpadova.javaday.javadaybindinginitializer"/ > < /property> < /bean> --> <bean id="viewresolver" class="org.springframework.web.servlet.view.internalresourceviewresolver" p:prefix="/web-inf/jsp/" p:suffix=".jsp" /> < /beans>
Parancoe meta-framework www.parancoe.org Spring MVC + Hibernate/JPA + easy DAO +...plugins
Using the model @Controller @ RequestMapping("/contact/ *.html") public class ContactController { @Resource private ContactDao contactdao; @RequestMapping public void list(model model) { List< Contact > contacts = contactdao.findall(); model.addattribute("contacts", contacts);
WEB-INF/jsp/contact/list.jsp < table> < c:foreach var="contact" items=" ${ contacts"> < tr> < td>${ contact.name </td> < td>${ contact.email </td> < td> < a href="edit.html?id= ${ contact.id " > Edit < /a> < a href="delete.html?id= ${ contact.id " > Delete < /a> < /td> < /tr> < /c:foreach> < /table> < c:if test=" ${ empty contacts" > No contacts in the DB < /c:if> < a href="edit.html" > New < /a>
More in the model @ModelAttribute( countries ) public List< Country > getcountries() { // producing and returning the list
Getting parameters @RequestMapping public String delete( @ RequestParam("id") Long id) { Contact contact = contactdao.get(id); if (contact == null) { throw new RuntimeException("Contact not found"); contactdao.delete(contact); return "redirect:list.html";
Preparing for a form @RequestMapping public void edit( @ RequestParam(value = "id", Model model) { required = false) Long id, Contact contact = null; if (id!= null) { contact = contactdao.get(id); if (contact == null) { throw new RuntimeException("Contact not found"); else { contact = new Contact(); model.addattribute("contact", contact);
WEB-INF/jsp/contact/edit.jsp < form:form commandname=" contact" method="post" action=" ${ cp /contact/save.html" > < table> < tr> < td> Name: < /td> < td> < form:input path="name"/ > < /td> < /tr> < tr> < td> E-mail: < /td> < td> < form:input path="email"/ > < /td> < /tr> < tr> < td > < /td> < td>< input type="submit" value="submit"/ >< /td> < /tr> < /table> < form:errors path=" *" cssclass="errorbox"/ > < /form:form>
Submit the form @Controller @ RequestMapping( {"/contact/*.html") @ SessionAttributes( {"contact") public class ContactController { //... @RequestMapping public String save( @ModelAttribute("contact") Contact contact, SessionStatus status) { contactdao.store(contact); status.setcomplete(); return "redirect:list.html";
Validation @Resource private Validator validator; @RequestMapping public String save( @ ModelAttribute("contact") Contact contact, BindingResult result, SessionStatus status) { validator.validate(contact, result); if (result.haserrors()) { return "contact/edit"; contactdao.store(contact); status.setcomplete(); return "redirect:list.html";
Parancoe validation @RequestMapping @Validation(view="contact/edit", continueonerrors=false) public String save( @ ModelAttribute("contact") Contact contact, BindingResult result, SessionStatus status) { contactdao.store(contact); status.setcomplete(); return "redirect:list.html";
File upload <form:form commandname="contact" method="post" action=" ${ cp /contact/save.html" enctype="multipart/form-data"> < table> <!--... --> < tr> < td> Picture: < /td> < td> < input type="file" name="picture" id="picture"/ > < /td> < /tr> <!--... --> < /form:form>
Changing the binding @InitBinder protected void initbinder(webdatabinder binder) { binder.registercustomeditor(byte [].class, new ByteArrayMultipartFileEditor());
Binary output @RequestMapping public void picture( @ RequestParam("id") Long id, throws IOException { OutputStream os) Contact contact = contactdao.get(id); os.write(contact.getpicture()); os.flush(); os.close(); < img src= ${ cp /contact/picture.html >
Questions??