[resolvido] Imprimir dados de alteração

8 respostas
andreacerqueira

Estou tentando imprimir os dados de um registro pra possivel alteração.
É a página de alteração de contato da apostila da caelum.

Não sei se está certo, mas tem a pagina que lista os contatos, e coloquei um link assim nela.
<a href="altera-contato.jsp?id=${contato.id}">Editar</a>
Tá certo isso, ou eu teria que criar um servlet só pra mostrar essa página de edição. Dessa forma que eu fiz, me leva pra pagina altera-contato.jsp que está assim:
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>

<c:import url="header.jsp" />

<h1>Alteração de Contato</h1>

<!-- cria lista -->
<jsp:useBean id="dao" class="pack.modelo.ContatoDAO" />

<%
if (request.getParameter("id") != null) {
    String id = request.getParameter("id");
    Long idLong = Long.valueOf(id);
    //out.println(idLong);
}
%>
<c:forEach var="contato" items="${dao.contato(idLong)}">
    <form action="mvc" method="post">
        <p class="form1">
            <label>ID:</label>
            ${contato.id}
        </p>
        <p class="form1">
            <label>Nome:</label>
            <input type="text" name="nome" class="text-input" value="${contato.nome}" />
        </p>
        <p class="form1">
            <label>Email:</label>
            <input type="text" name="email" class="text-input" value="${contato.email}" />
        </p>
        <p class="form1">
            <label>Endereço:</label>
            <input type="text" name="endereco" class="text-input" value="${contato.endereco}" />
        </p>
        <p class="form1">
            <label>Data Nascimento:</label>
            <listagem:campoData id="dataNascimento" />
        </p>
        <p class="form1-but">
            <input type="hidden" value="logica" value="AlteraContatoLogica" />
            <input type="submit" value="Gravar" class="but" />
        </p>
    </form>
</c:forEach>

<br clear="all" />

<c:import url="footer.jsp" />
O DAO não tá pegando a lista gerada no método getContato(long id), esse metodo tá no meu DAO assim:
public List<Contato> getContato(long id) {
        try {
            List<Contato> contatos = new ArrayList<Contato>();

            String sql = "SELECT * FROM cadastros WHERE id = " + id;
            PreparedStatement stmt = this.connection.prepareStatement(sql);
            ResultSet rs = stmt.executeQuery();

            while (rs.next()) {
                // criando o objeto Contato
                Contato contato = new Contato();
                contato.setId(rs.getLong("id"));
                contato.setNome(rs.getString("nome"));
                contato.setEmail(rs.getString("email"));
                contato.setEndereco(rs.getString("endereco"));

                // montado a data através do calendar
                Calendar data = Calendar.getInstance();
                data.setTime(rs.getDate("dataNascimento"));
                contato.setDataNascimento(data);

                // adicionando o objeto à lista
                contatos.add(contato);
            }

            rs.close();
            stmt.close();
            return contatos;

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

Obrigado.

8 Respostas

andreacerqueira

Poxa, ninguém sabe mesmo? :frowning:

andreacerqueira

esquece faltou colocar o tipo :slight_smile:

nel

Andrea, muita calma nessa hora. Primeiro que trata-se de um fórum e muitos, assim como eu, trabalham e não conseguem estar constantemente aqui para ajudar. A segunda questão é que você postou na área de Java Basico uma dúvida de JEE, existe um local do fórum adequado a esse tipo de dúvida.

Minha recomendação é que o href faça uma referência a um Servlet e você deixe a cargo do teu Servlet a consulta ao banco, popular a lista e executar o redirect. Da forma que fez, fica a cargo do cliente e não é interessante isso em desenvolvimento WEB. Sobre mostrar os dados, me parece estar correto. Faça como eu disse, use um Servlet para o que precisa ser feito no lado servidor e retorne já a lista preenchida, depois basta recupera-la no seu JSP.

andreacerqueira

Blz Nel, é que eu postei isso faz 9 dias :)
Então minha única alternativa foi ficar tentando tudo que posso.
Como tô iniciando, pra mim isso era uma dúvida básica :)

Pegar o id pela url e usar o DAO está errado então?

tipo:

<!-- cria lista -->
<jsp:useBean id="dao" class="pack.modelo.ContatoDAO" />

<%
Long id = Long.parseLong(request.getParameter("id"));
List<Contato> contato = dao.getContato(id);

for (int i = 0; i < contato.size(); i++) {
    out.println("<p>" + contato.get(i).getEmail() + "</p>");
    out.println("<p>" + contato.get(i).getNome() + "</p>");
    out.println("<p>" + contato.get(i).getEndereco() + "</p>");
}
%>

Obrigado

nel
andreacerqueira:
Blz Nel, é que eu postei isso faz 9 dias :) Então minha única alternativa foi ficar tentando tudo que posso. Como tô iniciando, pra mim isso era uma dúvida básica :)

Pegar o id pela url e usar o DAO está errado então?

tipo:

<!-- cria lista -->
<jsp:useBean id="dao" class="pack.modelo.ContatoDAO" />

<%
Long id = Long.parseLong(request.getParameter("id"));
List<Contato> contato = dao.getContato(id);

for (int i = 0; i < contato.size(); i++) {
    out.println("<p>" + contato.get(i).getEmail() + "</p>");
    out.println("<p>" + contato.get(i).getNome() + "</p>");
    out.println("<p>" + contato.get(i).getEndereco() + "</p>");
}
%>

Obrigado

Dizer que está errado é complicado, mas eu só não aconselho. Acredito que isso seja algo a ser deixado a cargo do lado servidor e não do cliente. Quando você faz isso, ele não vai ao teu Servlet, ele simplesmente abre uma nova página e via scriplet faz uma consulta diretamente ao seu DAO, pula todas as outras camadas, concorda? Não é a maneira mais adequada a ser feita.

Veja essa linha:
List<Contato> contato = dao.getContato(id);

É uma consulta SQL dentro de uma página JSP. O que acontece se gerar exceção ? Não deveria redirecionar para uma página de erro ? Dar um rollback ? Se não encontrar nenhum item, nenhum contato, beleza ? Sem problemas ? Qual o tratamento ?

Entende porque eu digo que deve-se usar desenvolvimento em camadas e enviar a informação para o teu Servlet e não diretamente para a página?
Abraços Andrea.

andreacerqueira

Vlw Nell, era isso mesmo que eu queria saber.
Agora vou pesquisar melhor sobre servlets, pq me parece que terei que criar milhões delas e é isso que tô achando bizarro.
Vlw pela resposta :wink:

nel

andreacerqueira:
Vlw Nell, era isso mesmo que eu queria saber.
Agora vou pesquisar melhor sobre servlets, pq me parece que terei que criar milhões delas e é isso que tô achando bizarro.
Vlw pela resposta ;)

Você não precisa criar necessariamente um Servlet para cada necessidade. Como por exemplo, tu tem uma tela com o famoso CRUD, ou seja, Consulta, Deleta, Atualiza e Cria ok? Digamos que seja a tela de Cliente. Não precisa criar um “ClientServletCreate”, “ClientServletUpdate” e assim por diante (sou péssimo para dar nome aos ‘bois’). Mas tu pode ter um “ClientServlet” e nele centralizar todas as necessidades referentes a tela de Cliente.

Quando uma tela exige muitas funções, isso pode tornar trabalhoso e deixar o código na Servlet “feio” e pouco performático, esse seria um caso a usar um segundo Servlet, por exemplo. Bom, vai da sua experiência e necessidade, cada caso é um caso e deve ser analisado isoladamente.

Abraços .

andreacerqueira

Vlw agora esclareceu tudo :slight_smile:

Criado 15 de abril de 2012
Ultima resposta 24 de abr. de 2012
Respostas 8
Participantes 2