Boa noite a todos!! Não trabalho com java, apenas dou uma fuçada e gosto mto de usar o spring + spring mvc. Tenho uma situação em que o usuário informa os dados num formulario e ao enviar os dados são cadastrados no banco. Após o cadastro ele é redirecionado para uma página informando q o cadastro foi bem sucedido. Caso o formulário contenha alguns erros o sistema retorna ao formulário e indica quais são os erros. Colocarei uma porção do código aqui para q deem uma olhada:
<form:form commandName="usuario" method="post" action="salvar.html">
<table>
<tr>
<td><form:label path="nome">Nome:</form:label></td>
<td><form:input path="nome" /> <br />
<form:errors path="nome" cssClass="form_error" htmlEscape="<br />" /></td>
</tr>
<!--Mais campos para entrada do usuário -->
<tr>
<td><form:label path="password">Senha:</form:label></td>
<td><form:password path="password" /> <br />
<form:errors path="password" cssClass="form_error" htmlEscape="<br />" /></td>
</tr>
<tr>
<td><input type="submit" value="Enviar" id="enviar"/>
</tr>
</table>
</form:form>
Este formulário é processado pelo controller abaixo. As tags <form:errors … /> São usadas para exibir o erro caso o usuário informe algum dado errado ou incoerente (minha classe usuario possui os atributos anotados com @notnull, @min, @max, etc) caso o controller retorne para o formulario.
Heis o meu controller
@RequestMapping(value="/salvar", method=RequestMethod.POST)
public String salvar(@Valid Usuario usuario, BindingResult result){
if(result.hasFieldErrors("nome") || result.hasFieldErrors("sobrenome") || result.hasFieldErrors("username") ||
result.hasFieldErrors("password") || result.hasFieldErrors("repSenha")){
return "usuario/novo";
}
try{
usuarioModel.salvar(usuario);
return "usuario/salvo_sucesso";
}
catch (DataIntegrityViolationException e) {
String mensagem = e.getMessage();
if(mensagem.contains("email")){
result.reject("email", "E-mail já cadastrado");
}
if(mensagem.contains("username")){
result.reject("username", "Já existe usuário cadastrado com este apelido");
}
/** Mais um monte de verificações ... */
return "redirect:/usuario/novo";
}
}
Repare que primeiro verifico se há erros nos campos se tiver retorna para o formulário que é preenchido com as msgs padroes de erros pela tag <form:errors …/>. Caso nao tenha erros eu tento salvar no banco. Outra duvida crucial: eu faço um select primeiro para verificar se ja existe ou tento salvar direto e pela exceção vejo q não foi possível?? (como estou fazendo neste caso)
Este exemplo funciona mas achei mais interessante a seguinte abordagem: ao clicar no botao enviar eu mando via ajax e peço q retorne um JSON. Crio um javascript q processa o retorno e preenche a tela com os erros ou com a informação de q houve sucesso. Meu formulario nao precisaria neste caso da tag <form:errors …/ > e meu controller ficaria parecido com isso:
@RequestMapping(value="/salvar", method=RequestMethod.POST)
public @ResponseBody Map<String, String> salvar(@Valid Usuario usuario, BindingResult result){
Map<String, String> json = new HashMap<String, String>();
if(result.hasFieldErrors("nome") || result.hasFieldErrors("sobrenome") || result.hasFieldErrors("username") ||
result.hasFieldErrors("password") || result.hasFieldErrors("repSenha")){
for (FieldError erro : result.getFieldErrors()) {
json.put(erro.getField(), erro.getDefaultMessage());
}
return json;
}
try{
usuarioModel.salvar(usuario);
json.put("sucesso", "sucesso");
}
catch (DataIntegrityViolationException e) {
String mensagem = e.getMessage();
if(mensagem.contains("email")){
json.put("email", "error");
}
/*Mesmas verificacoes anteriores porém coloco tdo num mapa*/
}
return json;
}
A principal diferenca está na anotacao @responseBody na assinatura do método informa q o spring vai pegar o retorno e transformar em um JSON e q as validações adicionam itens em um hashMap.
Ambas as implementações funcionaram, mas eu gostaria de saber o q acham de cada uma, prós e contras… Me desculpem pelo exceço de código, tentei minimizar o máximo possível. Qualquer dúvida é só postar.