Meu código:
Arquivo Conta.java
package br.com.caelum.contas.modelo;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.Calendar;
public class Conta {
private Long id;
/* Com as anotations, podemos colocar as restrições para cada atributo da classe e, ainda,
enviar mensagens para a tela do usuário para a ocorrência de erros. Para isso, devemos escrever essas
mensagens no arquivo ValidationMessages.properties, para que o Spring entenda que essas mensagens são
para erros de validação. */
/* Aqui, diferente do Servlet recebendo os parametros, tratanto, e enviando de volta com o Foward para a tela,
nós escrever apenas essa linha, tornando o código muito mais limpo.
*/
@NotNull(message="{conta.formulario.descricao.obrigatoria}")
@Size(min=5, message="{conta.formulario.descricao.tamanho}")
private String descricao;
private boolean paga;
private double valor;
@DateTimeFormat(pattern="dd/MM/yyyy")
private Calendar dataPagamento;
private TipoDaConta tipo;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getDescricao() {
return descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
public boolean isPaga() {
return paga;
}
public void setPaga(boolean paga) {
this.paga = paga;
}
public Calendar getDataPagamento() {
return dataPagamento;
}
public void setDataPagamento(Calendar dataPagamento) {
this.dataPagamento = dataPagamento;
}
public TipoDaConta getTipo() {
return tipo;
}
public void setTipo(TipoDaConta tipo) {
this.tipo = tipo;
}
public double getValor() {
return valor;
}
public void setValor(double valor) {
this.valor = valor;
}
}
Arquivo ContaController.java
package br.com.caelum.contas.controller;
import br.com.caelum.contas.dao.ContaDAO;
import br.com.caelum.contas.modelo.Conta;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import javax.validation.Valid;
import java.util.List;
@Controller
public class ContaController {
@RequestMapping("/form")
public String formulario() {
return "conta/formulario";
}
@RequestMapping("/adicionaConta")
public String adiciona(@Valid Conta conta, BindingResult result) {
// se tiver erro, redirecione para o formulário. O BindingResult vai verificar se houve erro na validação.
if(result.hasErrors()) {
return "conta/formulario";
}
ContaDAO dao = new ContaDAO();
dao.adiciona(conta);
return "conta/conta-adicionada";
}
Arquivo formulario.jsp
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Adcionar Contas</title>
</head>
<body>
<h3> Adicionar Contas</h3>
<form action="adicionaConta" method="post">
Descrição: <textarea name="descricao" rows="5" cols="100"></textarea>
<form:errors path="conta.descricao" />
<br/>
Valor:
<input type="text" name="valor"/>
<br>
Tipo:
<select name="tipo">
<option value="ENTRADA"> Entrada</option>
<option value="SAIDA"> Saida </option>
</select>
<br>
<input type="submit" value="Adicionar"/>
</form>
</body>
</html>
Arquivo ValidationMessages.properties
conta.formulario.sucesso=Conta adicionada com sucesso.
conta.formulario.descricao.obrigatoria=Descrição é obrigatória.
conta.formulario.descricao.tamanho=Descrição deve ter o mínimo de {min} caracteres.
Arquivo applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan base-package="br.com.caelum.contas" />
<mvc:annotation-driven />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
<bean id="conversionService"
class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="br.com.caelum.contas.conversion.StringToEnumConverterFactory"/>
</list>
</property>
</bean>
</beans>
Arquivo web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<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>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>