Spring framework - Qual destas implementações de cadastro é melhor? Direto ou com ajax?

0 respostas
M

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.

Criado 5 de julho de 2012
Respostas 0
Participantes 1