Duvida Como atualizar meu objeto - JSP "Apostila Caelum"

6 respostas Resolvido
jspjava
Dayson_Rodrigues

Estou no Exercício 9.11 Já consigo persistir e Remover, só que ainda não estou sabendo é atualizar. Segue meu Codigo.

lista de Contatos que mostra minha tabela onde posso atualizar
`

<c:import url="../template/cabecalho.jsp" />
<table border="1">
	<thead>
		<tr>
			<td>ID</td>
			<td>Nome</td>
			<td>Email</td>
			<td>Endereco</td>
			<td>Data de Nascimento</td>
		</tr>
	</thead>
	<tbody>
		<c:forEach var="contatoindividual" items="${contatos}" varStatus="contador">
			<tr bgcolor="#${contador.count % 2 == 0 ? 'aaee88' : 'ffffff' }">
				<td>${contatoindividual.id}</td>
				<td>${contatoindividual.nome}</td>
				<td>
					<!-- Switch Case -->
					<c:choose> 
						<c:when test="${not empty contatoindividual.email }">
							<a href="mailto:${contatoindividual.email}">${contatoindividual.email}</a>
						</c:when>
						<c:otherwise> <!-- Default -->
						E-mail não foi informado!
						</c:otherwise>
					</c:choose>
				</td>
				<td>${contatoindividual.endereco}</td>
				<td>
					<fmt:formatDate	value="${contatoindividual.dataDeNascimento.time}" pattern="dd/MM/yyyy" />
				<td>
					<a href="mvc?logica=SalvaContatoLogic&id=${contatoindividual.id}">Alterar</a>
				</td>
				<td> 
					 -  <a href="mvc?logica=RemoveContatoLogic&id=${contatoindividual.id}">Remover</a>
				</td>
			</tr>
		</c:forEach>
	</tbody>
</table>
<br />
<a href="adicionaContato.jsp">Adicionar</a>
<c:import url="../template/rodape.jsp" />
`

Minha Rega de Negocio que atualiza se existir ou salva se for novo

public class SalvaContatoLogic implements Logica {

@Override
public String executa(HttpServletRequest request, HttpServletResponse response) throws Exception {
	
	Contato contatoAlterado = new Contato();
	Connection conn = (Connection) request.getAttribute("connection");
	ContatoDAO dao = new ContatoDAO(conn);

	if (request.getParameter("id") != "") {
		contatoAlterado.setId(Long.parseLong(request.getParameter("id")));
	}

	contatoAlterado.setNome(request.getParameter("nome"));
	contatoAlterado.setEmail(request.getParameter("email"));
	contatoAlterado.setEndereco(request.getParameter("endereco"));

	Calendar dataNascimento = Calendar.getInstance();
	Date data = new SimpleDateFormat("dd/MM/yyyy").parse(request.getParameter("dataDeNascimento"));
	dataNascimento.setTime(data);
	contatoAlterado.setDataDeNascimento(dataNascimento);


	if (request.getParameter("id") == "") {
		dao.adicionarContato(contatoAlterado);
	} else {
		dao.atualizaContato(contatoAlterado);
	}
	return "mvc?logica=ListaContatosLogic";
}

}

Quero encaminhar os dados para essa View para atualizar.

`<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
		<title>Insert title here</title>
	</head>
	<body>
		<c:import url="/WEB-INF/jsp/template/cabecalho.jsp" />
			<form action="/fj21-agenda/mvc">
				<input type="hidden" name="logica" value="SalvaContatoLogic"/>
				<input type="hidden" name="id" value="${contato.id }"/>
				Nome: <input type="text" name="nome" value = "${contato.nome }"/> <br/>
				Email: <input type="text" name="email" value="${contato.email }"/> <br/>
				Endereco: <input type="text" name="endereco" value="${contato.endereco }"/> <br/>
				
				<fmt:formatDate value="${contato.dataDeNascimento.time }" pattern="dd/MM/yyyy" var="dataDeNascimento"/>
				Data de Nascimento:<input type="text" name="dataNascimento" value="${dataDeNascimento}"/> <br/>
				
				<input type="submit" value="Salvar"/>
			</form>
		<c:import url="/WEB-INF/jsp/template/rodape.jsp" />
	</body>
</html>`

Como posso fazer isso?

6 Respostas

L

Em seu ListaContatosLogic, ao invés de chamar o SalvaContatoLogic, chame um EditaContatoLogic por exemplo…

<a href="mvc?logica=EditaContatoLogic&id=${contatoindividual.id}">Alterar</a>

No método executa do seu EditaContatoLogic…

long id = Long.parseLong(request.getParameter("id"));
Connection conn = (Connection) request.getAttribute("connection");
Contato contatoEditado = new ContatoDAO(conn).pesquisa(id);

request.setAttribute("contato", contatoEditado);
return "/WEB-INF/jsp/atualiza-contato.jsp"; //por exemplo...

O restante seu formulário já faz…

Dayson_Rodrigues

Consegui, mostrou o objeto até aqui OK!

Quando faço alteração ele está mostrando esse Erro

GRAVE: Servlet.service() for servlet [br.com.caelum.mvc.servlet.ControllerServlet] in context with path [/fj21-agenda] threw exception [Erro na lógica de negócios] with root cause
java.lang.NullPointerException
	at java.text.SimpleDateFormat.parse(Unknown Source)
	at java.text.DateFormat.parse(Unknown Source)
	at br.com.caelum.mvc.logica.SalvaContatoLogic.executa(SalvaContatoLogic.java:31)
	at br.com.caelum.mvc.servlet.ControllerServlet.service(ControllerServlet.java:30)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
	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 br.com.caelum.agenda.filtro.FiltroTempoDeExecucao.doFilter(FiltroTempoDeExecucao.java:22)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at br.com.caelum.agenda.filtro.FiltroConexao.doFilter(FiltroConexao.java:29)
	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:475)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:624)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:498)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:796)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1368)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Unknown Source)

OBS: Pelo que vi na Exception, tem algo haver com a Data? Está marcando essa linha.

Date data = new SimpleDateFormat("dd/MM/yyyy").parse(request.getParameter("dataDeNascimento"));
L

Pelo que percebi, você definiu no formulário

...
<input type="text" name="dataNascimento" value="${dataDeNascimento}"/>
...

E chamou na Logic…

...
request.getParameter("dataDeNascimento")
...

Percebeu a diferença?

Por padrão o servlet recebe null para parâmetros não enviados

Dayson_Rodrigues
Solucao aceita

consegui!

Obrigado

Dayson_Rodrigues

acho que entendi, esse name=dataDeNascimento" é o valor que ficou pendurado do objeto na requisição?

L

Costuma ser o name de algum input em formulário ou através de requisições get numa url como em…

http://localhost:8080/fj21-agenda/mvc?logica=ListaContatosLogic

O que acaba virando um parameter no request… pegou?

Criado 29 de abril de 2017
Ultima resposta 29 de abr. de 2017
Respostas 6
Participantes 2