Popular um .jsp para alteração de forma elegante

eu queria popular um jsp de uma forma mais elegante que isso: [É do exercício 9.9 da apostila da Caelum]

<td><a href="testa-altera-mvc.jsp?id=${contato.id}&nome=${contato.nome}&email=${contato.email}&data=<fmt:formatDate value="${contato.dataNascimento.time}" pattern="dd/MM/yyyy" />&endereco=${contato.endereco}">alterar</a>

fiz assim, mas com certeza deve haver uma maneira melhor de fazer. O meu jsp está assim:

Formulário para alteração de contatos: <br /> <form action="mvc" method="POST"> Id: <input type="text" name="id" value="${param.id}"/><br /> Nome: <input type="text" name="nome" value="${param.nome }" /><br /> E-mail: <input type="text" name="email" value="${param.email}" /><br /> Endereço: <input type="text" name="endereco" value="${param.endereco}"/><br /> Data de Nascimento: <input type="text" name="dataNascimento" value="${param.data}"/> <input type="hidden" name="logica" value="AlteraContatoLogic" /> <input type="submit" value="Enviar" />

está funcionando tranquilamente, porém acho muito feio aquele código lá em cima :confused:

em java normal eu sei fazer isso, seria só mandar um objeto e tal, mas aqui estou um pouco confuso em como fazer

O que voce nao gosta, isso? id=${contato.id}&nome=${contato.nome}&outrosatributos=${expressao}…
Ou especificamente isso? data=<fmt:formatDate value="${contato.dataNascimento.time}" pattern=“dd/MM/yyyy” />
Ou as duas coisas…?

Do primeiro não dá para fugir muito não - a não ser em um framework orientado a componentes em que não precise escrever o HTML dos links, mas não é o caso, não vamos mudar a arquitetura por causa desse detalhe!

E sobre o segundo item, que é uma tag dentro do atributo: também não me agrada fazer desse jeito, e há uma solução. A maioria das tags de formatação de dados possui a opção de armazenar o valor em uma variável, que pode ser usada em seguida como uma expressão.
Ficaria assim:<fmt:formatDate value="${contato.dataNascimento.time}" pattern="dd/MM/yyyy" var="dataFormatadaLink" /> <a href=testa-altera-mvc.jsp?id=${contato.id}&nome=${contato.nome}&email=${contato.email}&data=${dataFormatadaLink}&endereco=${contato.endereco}...

E mais uma coisa que pode ser considerada nesse caso específico: existe a opção de passar apenas o ID no link, e na página de alteração fazer uma nova pesquisa no banco para trazer os detalhes. Essa solução tem a vantagem de garantir melhor a consistência dos dados na alteração (além de melhorar bastante a aparência do link…), mas a desvantagem de precisar de uma nova consulta. Analise os prós e contras e veja o que é melhor para você!

Muito obrigado pela resposta!
Bom saber a parte da variável, imaginei que teria algo do tipo, mas não sabia como. Já melhora bastante o código.

Exatamente isso que eu queria! Nesse caso teria que recorrer as JTLS ? tipo um useBean?

Está usando MVC? Algum framework? Ou é JSP puro?

puro!

Bom, vou dizer porque vc está aprendendo e o melhor é ir mesmo com uma coisa de cada vez, mas prometa que vai estudar MVC antes de qualquer projeto real!

No início da testa-altera-mvc.jsp coloque um scriptlet para fazer a pesquisa, aí guarde o resultado em um atributo do request e pode usar normal no restante da página. Mais ou menos assim:

<%
String idParam = request.getParameter("id");

int id = Integer.parseInt(idParam); // Aqui supondo que o tipo é int. Use o mais apropriado para seu caso
// E também coloque um tratamento de erro para o caso de o valor ser invalido

Contato contato = new ContatoDao().pesquisarContato(id); // Supondo que ContatoDao.pesquisarContato é a classe responsável pela consulta no banco
request.setAttribute("contato", contato);
%>

Form: Id: <input type="text" name="id" value="${contato.id}"/><br /> Nome: <input type="text" name="nome" value="${contato.nome }" /><br /> E-mail: <input type="text" name="email" value="${contato.email}" /><br /> -- e assim por diante

valeu gamesrod! achei que era isso mesmo, mas aqui na apostila “condenam” o uso de scriplets…
vou dar uma olhada sim no MVC, mas tu quis dizer mais especificamente Struts 2, Hibernate, etc?
abraço!

E condenam com razão… O código fica uma bagunça, e um sistema feito desse jeito tende a virar um “monstro” à medida que é desenvolvido e recebe novas funcionalidades.
Como eu já disse, só expliquei desse jeito para que vc possa aprender um passo de cada vez, mas nem pense em usar em um projeto real! :?

Com o MVC as responsabilidades ficam distribuídas, a parte de visão (JSP) separada da lógica de navegação e tratamento das requisições, e ambas separadas da lógica de regras de negócio. Bem melhor…

O padrão MVC pode ser implementado apenas com Servlets ou utilizando frameworks (Struts, SpringMVC, VRaptor, entre outros). Eu recomendaria primeiro aprender só com servlets pois isso lhe dará uma boa base para entender qualquer framework.

  • Obs: sobre o Hibernate, ele não tem nenhum papel no MVC (trata da camada de persistência/banco de dados) embora geralmente sejam usados em conjunto.

Por favor…

Referente ao primeiro post do nosso amigo caematos.

Para eu popular o form, além de value="${contato.id}", precisei da tag <c:forEach var=“cliente” items="${dao.listaClientes}">

Assim exibiu na tela todos os registros do banco, pois o for está em todo o form.

Gostaria que aparecesse um de cada vez e com os botões Primeiro Anterior Proximo Ultimo navegar pelos dados. Como devo implementar?

Bom dia Prezados,

Estou estudando um componente datepicker, gostaria de recuperar uma data no banco e carregar no datepicker, conforme abaixo. alguém pode ajudar?

desde já obrigado.

      <%@ attribute name="id" required="true" %>
       <input id="${id}" name="${id}" />
     <script>
         $("#${id}").datepicker({dateFormat: 'dd/mm/yy'});
      </script>

Data de Nascimento:
<caelum:campoData id=“dataNascimento” /> -->


Data de Nascimento: ( não carrega o componente)