Vediamo ora un esempio di web application; più precisamente vediamo come implementare un controller e delle jsp che permettano di aggiungere un libro ad una collezione di libri.
Prima di tutto, nel nostro web.xml, configuriamo il WebApplicationContext e mappiamo la DispatcherServlet:
<!-- SPRING -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- MVC -->
<servlet>
<servlet-name>spring-mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring-mvc</servlet-name>
<url-pattern>/action/*</url-pattern>
</servlet-mapping>
Fatto questo creiamo la nostra classe Book:
public class Book {
@Size(min=1,message="Il campo nome non può essere vuoto")
@Pattern(regexp="[A-Za-z0-9 _]+",message="Il campo nome può essere composto solo da lettere")
private String nome;
@NotNull
@Size(min=1,message="Il campo autore non può essere vuoto")
@Pattern(regexp="[A-Za-z ']+",message="Il campo autore può essere composto solo da lettere")
private String autore;
@DateTimeFormat(pattern="dd/MM/yyyy")
@NotNull(message="Il campo Data di Uscita non può essere vuoto")
private Date dataDiUscita;
//getters and setters.................
//..........
}
Come si può notare il nostro Book ha tre attributi:
- nome del libro
- autore
- data di uscita
Vediamo però che, oltre alla definizione degli attributi, sono presenti anche delle annotations. Queste annotations fanno parte della JSR-303 e, se una implemtazione di queste API è presente nel classpath, Spring è in grado di validare il nostro model. Per abilitare la validazione basta solamente aggiungere le annotations agli attributi del nostro model e aggiungere l'annotazione @Valid accanto al paremetro di input del nostro controller:
@Controller
public class BookController {
private List<Book> bookList;
public BookController(){
bookList = new ArrayList<Book>();
}
//Mostra la pagina di creazione
@RequestMapping(value = "/createBook", method = RequestMethod.GET)
public String welcome(Model model) {
model.addAttribute("book",new Book());
return "/book/createBook";
}
//controlla se ci sono errori di validazione e in caso contrario aggiunge il libro alla lista
@RequestMapping(value = "/create", method = RequestMethod.POST)
public String create(@Valid Book book, BindingResult result) {
if(result.hasErrors()){
return "/book/createBook";
}
bookList.add(book);
return "redirect:getview";
}
//mostra la lista dei libri
@RequestMapping(value = "/getview")
public String view(Model model) {
model.addAttribute("bookList",bookList);
return "/book/view";
}
}
vediamo ora le due jsp:
1) WEB-INF/jsp/book/createBook.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Aggiungi un libro</title>
</head>
<body>
<form:form commandName="book" method="post" action="create">
<fieldset>
<legend>Aggiungi un libro</legend>
<p>
<form:label for="nome" path="nome">Nome</form:label><br/>
<form:input path="nome" /> <form:errors path="nome" />
</p>
<p>
<form:label for="autore" path="autore">Autore</form:label><br/>
<form:input path="autore" /> <form:errors path="autore" />
</p>
<p>
<form:label for="dataDiUscita" path="dataDiUscita">Data di Creazione</form:label><br/>
<form:input path="dataDiUscita" /> <form:errors path="dataDiUscita" />
</p>
<p>
<input type="submit" value="Crea Libro" />
</p>
</fieldset>
</form:form>
</body>
</html>
2) WEB-INF/jsp/book/view.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Lista dei libri</title>
</head>
<body>
<p>
<a href="createBook">Inserisci un altro libro</a>
</p>
<fieldset>
<legend>Libri inseriti</legend>
<c:forEach items="${bookList}" var="book">
Nome: <c:out value="${book.nome}" /><br/><br/>
Autore: <c:out value="${book.autore}" /><br/><br/>
Anno: <c:out value="${book.dataDiUscita}" /><br/><br/>
<hr/>
</c:forEach>
</fieldset>
</body>
</html>
Per finire vediamo il contenuto di WEB-INF/spring-mvc-servlet.xml:
<!-- ABILITO LE ANNOTATIONS -->
<mvc:annotation-driven />
<!-- CONTROLLER -->
<bean class="it.mrwebmaster.mvc.BookController" scope="session"/>
<!-- VIEW RESOLVER -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>