9.11 Apostila Caelum fj-21 - Problema na página de Alterar Contatos

Olá pessoal, estou realizando o exercício opcional da apostila CAELUM-JAVA-WEB FJ21 no exercício 9.11
AlterarContatosLogic.

Tenho todas as páginas criadas e aparentemente funcionando. a página de cadastro funciona perfeitamente.

CLASSE Adiciona Alunos HTML

Cadastro de Alunos
Nome: <input type="text" name="nome" /><br />
Email: <input type="text" name="email" /><br />
Data Nasc: <input type="text" name="datanasc"> <br />
Telefone: <input type="text" name="telefone" /><br />
Endereço: <input type="text" name="endereco" /><br />

<input type="submit" value="Gravar">
<a target="_blank" href="mvc?logica=ListaAlunosLogic">Alunos Cadastrados</a></a>

CLASSE AdicionaAlunosLogic

public class AdicionaAlunosLogic implements Logica{

@Override
public String executa(HttpServletRequest req, HttpServletResponse resp) throws Exception {

	String nome = req.getParameter("nome");
	String email = req.getParameter("email");
	String dataFormatada = req.getParameter("datanasc");
	
	Calendar datanasc = null;
	
	try {
		
		java.util.Date data = new SimpleDateFormat("dd/MM/yyyy").parse(dataFormatada);
		datanasc = Calendar.getInstance();
		datanasc.setTime(data);
		
	} catch (Exception e) {
		
		System.out.println("Impossível formatar a data!");
		
	}
	
	String telefone = req.getParameter("telefone");
	String endereco = req.getParameter("endereco");
	
	Aluno aluno = new Aluno();
	
	aluno.setNome(nome);
	aluno.setEmail(email);
	aluno.setDatanasc(datanasc);
	aluno.setTelefone(telefone);
	aluno.setEndereco(endereco);
	
	AlunoDao alunoDao = new AlunoDao();
	
	alunoDao.adicionaAluno(aluno);
	
	//return "mvc?logica=ListaAlunosLogic";
	return "adicionaAlunos.html";
}

}

CLASSE ListaAlunos jsp

	<!-- percorre contatos montando as linhas da tabela -->

	<tr>
		<th>Nome</th>
		<th>Data Nasc</th>
		<th>Email</th>
		<th>Telefone</th>
		<th>Endereço</th>
		<th>Remover</th>
		<th>Editar</th>
	</tr>

	<c:forEach var="aluno" items="${alunos}">

		<tr>
			<td>${aluno.nome}</td>
			
			<td><fmt:formatDate value="${aluno.datanasc.time}"
					pattern="dd/MM/yyyy" /></td>

			<td>
			<c:if test="${not empty aluno.email}">
					<a href="malito:{alunno.email}"> ${aluno.email} </a>
					
				</c:if> <c:if test="${empty aluno.email}">
				Email não informado!
			</c:if>
			</td>

			<td>${aluno.telefone}</td>
			<td>${aluno.endereco}</td>
			
			<td>
				<a href="mvc?logica=RemoveAlunosLogic&id=${aluno.id}">Remover</a></a>
			</td>
			
			<td>
				<a href="mvc?logica=PaginaAlteraAlunosLogic&id=${aluno.id}">Editar</a></a>
			</td>
			
		</tr>

	</c:forEach>
</table>

<c:import url="/WEB-INF/jsp/rodape.jsp" />

Classe RemoveAlunosLogic

public String executa(HttpServletRequest req, HttpServletResponse res)
throws Exception {

		int id = Integer.parseInt(req.getParameter("id"));
		
		Aluno aluno = new Aluno();
		aluno.setId(id);
		
		AlunoDao alunoDao = new AlunoDao();
		
		alunoDao.removeAluno(aluno);
		
		System.out.println("Aluno " + aluno.getId() + " " + aluno.getNome() + " Excluído com sucesso!");
	
			return "mvc?logica=ListaAlunosLogic"	
			
}

}

Esta tudo funcionando!

O problema é que quero na página de listagem clicar no botão editar de um determinado alunos e ser redirecionado para uma página identica a de adicionar Alunos, já com os dados preenchidos e la realizar a edição e clicar em salvar. Os métodos já estão prontos e funcionando, so não sei como chamar a página de edição através do link.

CLASSE AlteraAlunosLogic

public class AlteraAlunosLogic implements Logica {

@Override
public String executa(HttpServletRequest req, HttpServletResponse resp) throws Exception {

	String nome = req.getParameter("nome");
	String email = req.getParameter("email");
	String dataFormatada = req.getParameter("datanasc");

	Calendar datanasc = null;

	try {

		java.util.Date data = new SimpleDateFormat("dd/MM/yyyy").parse(dataFormatada);
		datanasc = Calendar.getInstance();
		datanasc.setTime(data);

	} catch (Exception e) {

		System.out.println("Impossível formatar a data!");

	}

	String telefone = req.getParameter("telefone");
	String endereco = req.getParameter("endereco");

	Aluno aluno = new Aluno();

	aluno.setNome(nome);
	aluno.setEmail(email);
	aluno.setDatanasc(datanasc);
	aluno.setTelefone(telefone);
	aluno.setEndereco(endereco);

	AlunoDao alunoDao = new AlunoDao();

	alunoDao.alteraAluno(aluno);

	return "mvc?logica=ListaAlunosLogic";
}

}

e a CLASSE AlteraAlunos jsp

Alterar Cadastros
<form action="mvc?logica=AlteraAlunosLogic" method="post">

	<c:forEach var="aluno" items="${alunos}">

Nome: <input type="text" name="novoNome" value="${aluno.nome}" />
		<br />
Email: <input type="text" name="novoEmail" />
		<br />
Data Nasc: <input type="text" name="novaDatanasc">
		<br />
Telefone: <input type="text" name="novoTelefone" />
		<br />
Endereço: <input type="text" name="novoEndereco" />
		<br />

		<input type="submit" value="Alterar">

	</c:forEach>

</form>

NÃO SEI COMO CHAMAR ESSA CLASSE JSP NO LINK DA PÁGINA DE LISTAGENS ANTERIORMENTE MOSTRADA.

criei uma classe apenas para chamar a classe jsp para alterar os dados, mas simplesmente não consigo chama-la pelo link da página de listagem

public class PaginaAlteraAlunosLogic implements Logica{

@Override
public String executa(HttpServletRequest req, HttpServletResponse resp) throws Exception {
	// TODO Auto-generated method stub
	return "/WEB-INF/jsp/alteraAlunos.jsp";
}

}

Trecho da página de listagem

                       <td>
				<a href="mvc?logica=RemoveAlunosLogic&id=${aluno.id}">Remover</a></a>
			</td>
			
			<td>
				<a href="mvc?logica=PaginaAlteraAlunosLogic&id=${aluno.id}">Editar</a></a>
			</td>

POR FAVOR ALGUEM PODE ME DAR UMA LUZ? Onde posso está errando?

Sempre que clico no link para chamar a página de edição, recebo uma página em branco como resultado, mas não retorna nem um erro!

Nesse método, você precisa ir no banco buscar o cadastro pelo id e adicioná-lo no atributo do request…

public String executa(HttpServletRequest req, HttpServletResponse resp) throws Exception {
    // busca aluno no banco pelo req.getParameter("id")...
    req.setAttribute("alunoSelecionado", aluno);
    return "/WEB-INF/jsp/alteraAlunos.jsp";
}

Depois no form de alteraAlunos.jsp, retire o forEach (afinal você quer apenas um cadastro e não todos certo?), inclua um hidden repassando o id e monte seu cadastro pelo atributo alunoSelecionado…

<form action="mvc?logica=AlteraAlunosLogic" method="post">
    <input type="hidden" name="id" value="${alunoSelecionado.id}">

    Nome: <input type="text" name="novoNome" value="${alunoSelecionado.nome}" />
    ....

Em AlteraAlunosLogic, não esqueça de pegar o id pelo getParameter(“id”) para atualizar o cadastro certo no banco, boa sorte!

Olá LostSoldier,

Muito obrigado pela atenção, acho que entendi o que voce disse, porém, o form de altera alunos ainda está vindo em branco, fiz as alterações que você informou mas ainda não obtive êxito.

Segue como ficou…

CLASSE PaginaAlteraAlunosLogic

public class PaginaAlteraAlunosLogic implements Logica{

@Override
public String executa(HttpServletRequest req, HttpServletResponse resp) throws Exception {

	
	int id = Integer.parseInt(req.getParameter("id"));
	Aluno aluno = new Aluno();
	aluno.setId(id);
	
	req.setAttribute("alunoSelecionado", aluno);
	
	return "/WEB-INF/jsp/alteraAlunos.jsp";
}

}

CLASSE AlteraAlunosLogic

public class AlteraAlunosLogic implements Logica {

@Override
public String executa(HttpServletRequest req, HttpServletResponse resp) throws Exception {
	
	int id = Integer.parseInt(req.getParameter("id"));
	
	String nome = req.getParameter("novoNome");
	String email = req.getParameter("novoEmail");
	String dataFormatada = req.getParameter("novaDatanasc");

	Calendar datanasc = null;

	try {

		java.util.Date data = new SimpleDateFormat("dd/MM/yyyy").parse(dataFormatada);
		datanasc = Calendar.getInstance();
		datanasc.setTime(data);

	} catch (Exception e) {

		System.out.println("Impossível formatar a data!");

	}

	String telefone = req.getParameter("novoTelefone");
	String endereco = req.getParameter("novoEndereco");

	Aluno aluno = new Aluno();
	
	aluno.setId(id);
	aluno.setNome(nome);
	aluno.setEmail(email);
	aluno.setDatanasc(datanasc);
	aluno.setTelefone(telefone);
	aluno.setEndereco(endereco);

	AlunoDao alunoDao = new AlunoDao();

	alunoDao.alteraAluno(aluno);

	return "mvc?logica=ListaAlunosLogic";
}

}

CLASSE alteraAlunos JSP

Alterar Cadastros
<form action="mvc?logica=AlteraAlunosLogic" method="post">

<input type="hidden" name="id" value="${alunoSelecionado.id}">

	Nome: <input type="text" name="novoNome" value="${alunoSelecionado.nome}" /> 
	<br />
	Email: <input type="text" name="novoEmail" value="${alunoSelecionado.email}"/> 
	<br /> 
	Data Nasc: <input type="text" name="novaDatanasc" value="${alunoSelecionado.datanasc}"/> 
	<br /> 
	Telefone: <input type="text" name="novoTelefone" value="${alunoSelecionado.telefone}"/> 
	<br />
	Endereço: <input type="text" name="novoEndereco" value="${alunoSelecionado.endereco}"/> 
	<br /> 
	<input type="submit" value="Alterar">
</form>

Não consegui visualizar onde ainda estou errando, poderia me dar mais uma dica de como posso resolver?

Antecipadamente, agradeço!

Você criando um aluno, obviamente o cadastro estará em branco…

int id = Integer.parseInt(req.getParameter("id"));
Aluno aluno = new Aluno();
aluno.setId(id);

req.setAttribute("alunoSelecionado", aluno);

Você precisa trazer o cadastro do banco pelo id, usando o DAO, etc…

Faz tempo que não vejo a apostila, mas creio que algo como…

int id = Integer.parseInt(req.getParameter("id"));
AlunoDAO dao = new AlunoDAO();
Aluno aluno = dao.pesquisar(id); //select * from alunos where id=?...

req.setAttribute("alunoSelecionado", aluno);

Se estiver usando tomcat no eclipse, às vezes precisa reiniciar o servidor ao modificar arquivos .java ok?

1 curtida

LostSoldier,

Desculpe-me pela ignorancia e falta de experiência nesse assunto, mas como percebeu ainda estou engatinhando em desenvolvimento. Tentei fazer as modificações mas também não obtive êxito.

Não sei como implementar o método pesquisar, que tipo de retorno ele utiliza, não sei se uso o mesmo para listar os alunos cadastrados.

Ficou assim a minha implementação…

CLASSE Pesquisar no DAO

public Aluno pesquisar(int id) {

	try {

		String sql = "select nome, datanasc, email, telefone, endereco from alunos where id=?";

		PreparedStatement stm = (PreparedStatement) connection.prepareStatement(sql);
		ResultSet rs = (ResultSet) stm.executeQuery();

		while (rs.next()) {

			Aluno aluno = new Aluno();

			aluno.setId(rs.getInt("id"));
			aluno.setNome(rs.getString("nome"));
			Calendar data = Calendar.getInstance();
			data.setTime(rs.getDate("datanasc"));
			aluno.setDatanasc(data);
			aluno.setEmail(rs.getString("email"));
			aluno.setTelefone(rs.getString("telefone"));
			aluno.setEndereco(rs.getString("endereco"));

		}

		rs.close();
		stm.close();
		return null;

	} catch (Exception e) {

		throw new RuntimeException(e);

	}

OBS: NÃO SEI SE ESSE MÉTODO É FEITO DESSA FORMA!!!
SE USO O RETORNO VOID, A CLASSE PaginaAlteraAlunosLogic RECLAMA.

}

Classe PaginaAlteraAlunosLogic

public class PaginaAlteraAlunosLogic implements Logica{

@Override
public String executa(HttpServletRequest req, HttpServletResponse resp) throws Exception {

	int id = Integer.parseInt(req.getParameter("id"));
	AlunoDao dao = new AlunoDao();
	
	Aluno aluno = dao.pesquisar(id);
	
	req.setAttribute("alunoSelecionado", aluno);
	
	return "/WEB-INF/jsp/alteraAlunos.jsp";
}

}

QUANDO EXECUTO TUDO, RECEBO O SEGUINTE ERRO…

HTTP Status 500 - A lógica de negócios causou uma exceção

type Exception report

message A lógica de negócios causou uma exceção

description The server encountered an internal error that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: A lógica de negócios causou uma exceção
br.com.listagens.mvc.servlets.ControllerServlets.service(ControllerServlets.java:36)
javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause

java.lang.RuntimeException: java.sql.SQLException: No value specified for parameter 1
br.com.listagens.dao.AlunoDao.pesquisar(AlunoDao.java:124)
br.com.listagens.mvc.logica.PaginaAlteraAlunosLogic.executa(PaginaAlteraAlunosLogic.java:17)
br.com.listagens.mvc.servlets.ControllerServlets.service(ControllerServlets.java:30)
javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause

java.sql.SQLException: No value specified for parameter 1
com.mysql.jdbc.SQLError.createSQLException(SQLError.java:910)
com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:1737)
com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:1685)
com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1396)
br.com.listagens.dao.AlunoDao.pesquisar(AlunoDao.java:98)
br.com.listagens.mvc.logica.PaginaAlteraAlunosLogic.executa(PaginaAlteraAlunosLogic.java:17)
br.com.listagens.mvc.servlets.ControllerServlets.service(ControllerServlets.java:30)
javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.75 logs.

AGRADEÇO PELA AJUDA MAIS UMA VEZ!

Apenas evite usar caixa alta nos textos, o que vai contra as boas práticas do fórum, pois significam desespero, urgência, e que você está literalmente “gritando”, além de ser extremamante desconfortável aos olhos…

Vamos por partes, seu método pesquisar precisa de alguns ajustes apenas…

public Aluno pesquisar(int id) {
    try {
        String sql...
        PreparedStatement stm = connection.prepareStatement(sql);
        stm.setInt(1, id); //linha importante
    
        ResultSet rs = stm.executeQuery();

        Aluno aluno = null; // valor padrao caso o usuario não seja encontrado na base

        if (rs.next()) {  // por ser um unico aluno, não precisa de while...
            aluno = new Aluno();
            aluno.set...
        }

        rs.close();
        stm.close();
        return aluno; // retornar o aluno preenchido e não null como voce tinha feito
    } catch...
}

Onde marquei linha importante, significa que você precisa passar um valor para cada ? encontrado na String sql… como lá diz id=?, logo você precisa passar esse valor começando pelo 1, assim o PreparedStatement faz a troca pra você…

A lógica começa a ser lida logo na declaração do método (assinatura), ou seja, o que o método faz, ele retorna um Aluno pelo id

public Aluno pesquisar(int id)...

Logo faz sentido eu retornar null? Não certo? Preciso retornar um Aluno preenchido… começou a clarear as idéias?

Bons estudos!

LostSoldier,

Primeiramente, Desculpe-me pela caixa alta, não foi a minha intenção demonstrar urgências ou ir de encontro às normas do grupo.

Realmente não estou conseguindo finalizar esta atividade, tenho muitas dificuldades nesse aprendizado e vejo o quanto necessito estudar. Mas não quero abusar da boa vontade alheia…

Fiz mais uma vez as alterações e continuo com erros.

Classe pesquisar

public Aluno pesquisar(int id) {

	try {

// String nome = null;
// Date datanasc = null;
// String email = null;
// String telefone = null;
// String endereco = null;

		String sql = "select nome, datanasc, email, telefone, endereco from alunos where id=?";

		PreparedStatement stm = (PreparedStatement) connection.prepareStatement(sql);

		stm.setInt(1, id);

// stm.setString(2, nome);
// stm.setDate(3, datanasc);
// stm.setString(4, email);
// stm.setString(5, telefone);
// stm.setString(6, endereco);

		ResultSet rs = (ResultSet) stm.executeQuery();

		Aluno aluno = null;
		
		if(rs.next()) {

			aluno = new Aluno();

			aluno.setId(rs.getInt("id"));
			aluno.setNome(rs.getString("nome"));
			Calendar data = Calendar.getInstance();
			data.setTime(rs.getDate("datanasc"));
			aluno.setDatanasc(data);
			aluno.setEmail(rs.getString("email"));
			aluno.setTelefone(rs.getString("telefone"));
			aluno.setEndereco(rs.getString("endereco"));

		}

		rs.close();
		stm.close();

		return aluno;

	} catch (Exception e) {

		throw new RuntimeException(e);

	}

}

Repare que alguns trechos estão comentados, mas quando os retiro e rodo recebo o seguinte erro

exception

javax.servlet.ServletException: A lógica de negócios causou uma exceção
br.com.listagens.mvc.servlets.ControllerServlets.service(ControllerServlets.java:36)
javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause

java.lang.RuntimeException: java.sql.SQLException: Parameter index out of range (2 > number of parameters, which is 1).
br.com.listagens.dao.AlunoDao.pesquisar(AlunoDao.java:139)
br.com.listagens.mvc.logica.PaginaAlteraAlunosLogic.executa(PaginaAlteraAlunosLogic.java:17)
br.com.listagens.mvc.servlets.ControllerServlets.service(ControllerServlets.java:30)
javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause

java.sql.SQLException: Parameter index out of range (2 > number of parameters, which is 1).
com.mysql.jdbc.SQLError.createSQLException(SQLError.java:910)
com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:2796)
com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:2827)
com.mysql.jdbc.PreparedStatement.setNull(PreparedStatement.java:2863)
com.mysql.jdbc.PreparedStatement.setString(PreparedStatement.java:3453)
br.com.listagens.dao.AlunoDao.pesquisar(AlunoDao.java:106)
br.com.listagens.mvc.logica.PaginaAlteraAlunosLogic.executa(PaginaAlteraAlunosLogic.java:17)
br.com.listagens.mvc.servlets.ControllerServlets.service(ControllerServlets.java:30)
javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.75 logs.

E se rodo com os comentários recebo o mesmo erro

Quanto aos parâmetros comentados…

// stm.setString(2, nome);
// stm.setDate(3, datanasc);
// stm.setString(4, email);
// stm.setString(5, telefone);
// stm.setString(6, endereco);

Esqueça-os. você só deve adicionar cada parâmetro, quando sua sql tiver ? no seu caso estamos filtrando apenas pelo id = ? certo até aqui?

Outra coisa, preste bem atenção nos campos do select que você está puxando, o id não está lá confere?

select nome, datanasc, email, telefone, endereco from...

Cadê o id nesse lista?

Feito a pergunta, como você quer chamá-lo, se nem definido está?

aluno.setId(rs.getInt("id")); // não foi definido no sql..,

Quando se usa stm.setAlgumaCoisa você está dizendo para o PreparedStatement para montar a query/sql com dados externos, e nesse caso somente o id está sendo passado pegou?

Já quando se usa rs.getAlgumaCoisa, você está pegando os campos declarados no select pegou?

Outra coisa, estou supondo que o campo id exista na tabela e que seja do tipo inteiro ok? Senão toda essa explicação que estou tentando te passar cai por terra :joy:

Admiro seu esforço em tentar aprender e entender como as coisas funcionam, continue assim pois o mecardo precisa de profissionais com sede de conhecimento.

E como o fórum é grande, mesmo que eu não consiga te responder, com certeza outro com maior conhecimento ou visão de mundo diferente fará, bons estudos!

LostSoldier,

Primeiramente muito obrigado pelo empenho em ajudar a resolver o meu problema. Justamente, você estava correto! O erro era a ausência do “id” no sql, após colocá-lo resolveu e funcionou.

Vejo o quanto ainda tenho a estudar e aprender, um dia espero retribuir a ajuda de pessoas como você e que também possa ajudar outras pessoa que enfrentam problemas como o meu. Valeu mesmo!

1 curtida

LostSoldier,

Desculpa abusar da sua boa vontade, mas surgiu mais uma dúvida em meus estudos, resolvi o problema de preencgher o formulário para alteração dos dados de alunos, porém, quando os dados são exibidos a data não está vindo com o padrão estabelecido “dd/yy/yyyy”, ela vem dessa forma aqui.

java.util.GregorianCalendar[time=295671600000,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id=

como resolvo isso?

Segue exemplo…

Classe alteraAlunos.jsp

Alterar Cadastros
<form action="mvc?logica=AlteraAlunosLogic" method="post">

<input type="hidden" name="id" value="${alunoSelecionado.id}">

	Nome: <input type="text" name="novoNome" value="${alunoSelecionado.nome}" /> 
	<br />
	Email: <input type="text" name="novoEmail" value="${alunoSelecionado.email}"/> 
	<br /> 

	Data Nasc: <input type="text" name="novaDatanasc" value="${alunoSelecionado.datanasc}"/> 
	<br /> 
	Telefone: <input type="text" name="novoTelefone" value="${alunoSelecionado.telefone}"/> 
	<br />
	Endereço: <input type="text" name="novoEndereco" value="${alunoSelecionado.endereco}"/> 
	<br /> 
	<input type="submit" value="Alterar">
</form>

Tentei usar dessa mesma forma como fiz no listaAlunos.jsp mas o campo vem em branco.

Alterar Cadastros
<form action="mvc?logica=AlteraAlunosLogic" method="post">

<input type="hidden" name="id" value="${alunoSelecionado.id}">

	<td><fmt:formatDate value="${aluno.datanasc.time}"
					pattern="dd/MM/yyyy" /></td>

</form>

Valeu!

Perceba que é alunoSelecionado e não aluno, cuidado com o copia e cola :joy:

Sim, Sim, LostSoldier
sei disso!

Esse código acima é do listaAlunos.jsp e está correto!
O do alteraAlunos.jsp é esse aqui.

Data Nasc: <input type=“text” name=“novaDatanasc” <fmt:formatDate value="${alunoSelecionado.datanasc.time}" pattern=“dd/MM/yyyy”/>>

Mas quando o utilizo, o campo dataNasc vem em branco e quando o retiro, vem

java.util.GregorianCalendar[time=295671600000,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id=

Veja se ajuda

<fmt:formatDate 
    value="${alunoSelecionado.datanasc.time}" 
    pattern="dd/MM/yyyy" 
    var="dataFormatada" />

Data Nasc: <input type="text" name="novaDatanasc" value="${dataFormatada}" />

Não se esqueça de importar o taglib assim como na pagina de listagem…

Valew LostSoldier,

Resolveu sim o meu problema cara. Obrigado!!!

1 curtida

Pessoal, estou com um problema bem parecido com esse e não estou coseguindo resolver.
Minhas classes são bem parecidas com as mostradas acima.
Eu tenho uma classe DAO:

package br.com.caelum.agenda.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import br.com.caelum.agenda.ConnectionFactory;
import br.com.caelum.agenda.modelo.Contato;

public class ContatoDao {
	private Connection connection;

	public ContatoDao() {
		try {
			this.connection = new ConnectionFactory().getConnection();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	public void adiciona(Contato contato) {
		try {
			String sql = "insert into contatos (nome, email, endereco, dataNascimento) values (?,?,?,?)";
			PreparedStatement stmt = connection.prepareStatement(sql);

			stmt.setString(1, contato.getNome());
			stmt.setString(2, contato.getEmail());
			stmt.setString(3, contato.getEndereco());
			stmt.setDate(4, new Date(contato.getDataNascimento().getTimeInMillis()));

			stmt.execute();
			stmt.close();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	public List<Contato> getLista() {
		try {
			List<Contato> contatos = new ArrayList<Contato>();
			PreparedStatement stmt = this.connection.prepareStatement("select * from contatos");

			ResultSet rs = stmt.executeQuery();

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

				//popula a data de nascimento do contato, fazendo a conversao
				Calendar data = Calendar.getInstance();
				data.setTime(rs.getDate("dataNascimento"));
				contato.setDataNascimento(data);

				//adiciona o contato na lista
				contatos.add(contato);
			}

			rs.close();
			stmt.close();

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

	public void exclui(Contato contato) {
		String sql = "delete from contatos where id=?";
		try {
			PreparedStatement stmt = this.connection.prepareStatement(sql);
			stmt.setLong(1, contato.getId());
			stmt.execute();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	public void atualiza(Contato contato) {
		String sql = "update contatos set id=?, nome = ?, email = ?, endereco = ?, dataNascimento = ? where id = ?";
		try {
			PreparedStatement stmt = this.connection.prepareStatement(sql);
			stmt.setString(1, contato.getNome());
			stmt.setString(2, contato.getEmail());
			stmt.setString(3, contato.getEndereco());
			stmt.setDate(4, new java.sql.Date(contato.getDataNascimento().getTimeInMillis()));
			stmt.setLong(5, contato.getId());

			stmt.execute();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
}

Uma classe para alterar o contato:

package br.com.caelum.mvc.logica;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import br.com.caelum.agenda.dao.ContatoDao;
import br.com.caelum.agenda.modelo.Contato;

public class AlterarContatoLinkLogica implements Logica{
	
	@Override
	    public void executa(HttpServletRequest request, HttpServletResponse response) throws Exception{
	        Contato contato = new Contato();
	        Calendar dataNascimento =null;
	        long id = Long.parseLong(request.getParameter("id"));
	        contato.setId(id);
	        contato.setNome(request.getParameter("nome"));
	        contato.setEndereco(request.getParameter("endereco"));
	        contato.setEmail(request.getParameter("email"));

	        String dataEmTexto = request.getParameter("dataNascimento");
	        Date date = new SimpleDateFormat("dd/MM/yyyy").parse(dataEmTexto);
	        dataNascimento = Calendar.getInstance();
	        dataNascimento.setTime(date);

	        contato.setDataNascimento(dataNascimento);
	        ContatoDao dao = new ContatoDao();
	        dao.atualiza(contato);
	        RequestDispatcher rd = request.getRequestDispatcher("/altera-contato-mvc.jsp");
	        rd.forward(request, response);
	        System.out.println("Manda para um pagina diferente ... "+contato.getNome());
	         
	    }
	protected void doPost(HttpServletRequest request, HttpServletRequest response) throws ServletException,IOException{
		
	}
	}

Uma jsp para alterar informações do contato:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ taglib tagdir="/WEB-INF/tags" prefix="caelum" %>

<c:import url="cabecalho.jsp"/>
Formulário para alteração de contatos:<br/>
<form action="mvc" method="POST">
    Id:
    <input type="text" name="id" value="${param.id}" readonly/><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/>
    <fmt:formatDate value="${param.dataNascimento.time}" pattern="dd/MM/yyyy" var="dataFormatada"></fmt:formatDate>
    Data de Nascimento: <input type="text" name="dataNascimento" value="${dataFormatada}" />
    <input type="hidden" name="logica" value="AlterarContatoLinkLogic"/>
    <input type="submit" value="Enviar"/>
</form>
<c:import url="rodape.jsp" />

E uma controladora:

package br.com.caelum.mvc.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import br.com.caelum.mvc.logica.Logica;

@WebServlet("/mvc")
public class ControllerServlet extends HttpServlet{
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		
		String parametro=request.getParameter("logica");
		System.out.println(parametro);
		String nomeDaClasse="br.com.caelum.mvc.logica." + parametro;
		
		try {
			Class classe = Class.forName(nomeDaClasse);
            Logica logica = (Logica) classe.newInstance();
            logica.executa(request, response);
			
		}catch(Exception e) {
			throw new ServletException("A lógica de negocios causou uma exceção",e);
		}
		
	}
}

Quando clico em alterar é gerado o erro:

jun 05, 2018 4:26:09 PM org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet [br.com.caelum.mvc.servlet.ControllerServlet] in context with path [/fj21-agenda] threw exception [A lógica de negocios causou uma exceção] with root cause
java.lang.NullPointerException
	at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1439)
	at java.text.DateFormat.parse(DateFormat.java:364)
	at br.com.caelum.mvc.logica.AlterarContatoLinkLogica.executa(AlterarContatoLinkLogica.java:29)
	at br.com.caelum.mvc.servlet.ControllerServlet.service(ControllerServlet.java:25)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:494)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:651)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:407)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:754)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1376)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)

Desde já agradeço a ajuda!