[Resolvido] Struts 1, apostila da Caelum, dúvidas na action MostraContatoAction

Pessoal, estou com problemas para fazer a classe MostraContatoAction funcionar. Eis o código que apresenta o erro NullPointerException:

	@Override
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {

		MostraContatoForm formulario = (MostraContatoForm) form;
		Contato contato = formulario.getContato();
		Contato encontrado = new ContatoDAO().procura(contato.getId());
		request.setAttribute("contato", encontrado);
		
		return mapping.findForward("ok");
	}

Podem me ajudar?

Em que linha exatamente é o nullpointer?

Esse erro ocorre quando você tenta acessar um membro (Método, atributo) de um objeto que não foi inicializado com um “new”.
Nesse caso qualquer um dos parâmetros que chegou à sua action pode ser vindo nulo, devido à uma falha na configuração fora do escopo da sua action, e quando você tentou usá-lo esse erro foi disparado.

e ai jamesfrj blz,

provavelmente o erro é referente ao teu ContatoDAO(). primeiro vc cria um Objeto do tipo ContatoDAO depois vc chama o procura().

daveiga, o NullPointer ocorre nesta linha:

Blz, alezubokoff!
Justamente, conforme o código abaixo eu faço isso que você falou

MostraContatoForm formulario = (MostraContatoForm) form; Contato contato = formulario.getContato(); Contato encontrado = new ContatoDAO().procura(contato.getId()); request.setAttribute("contato", encontrado);
Só não sei se estou fazendo da maneira certa, rs

Como está o struts-config.xml?

Fala drsmachado! Segue o struts-config.xml

<struts-config>
	<form-beans>
		<form-bean name="ContatoForm" type="br.com.caelum.struts.form.ContatoForm"></form-bean>
		<form-bean name="RemoveContatoForm" type="br.com.caelum.struts.form.RemoveContatoForm"></form-bean>
		<form-bean name="MostraContatoForm" type="br.com.caelum.struts.form.MostraContatoForm"></form-bean>
	</form-beans>
	<action-mappings>
		<action path="/alteraContato" type="br.com.caelum.struts.action.AlteraContatoAction">
			<forward name="ok" path="/listaContatos.do"/>
		</action>
		<action path="/mostraContato" type="br.com.caelum.struts.action.MostraContatoAction">
			<forward name="ok" path="/mostraContato.do"/>
		</action>
		<action path="/mudaIdioma" type="br.com.caelum.struts.action.MudaIdiomaAction">
			<forward name="ok" path="/testa-mensagens.jsp"/>
		</action>
		<action path="/removeContato" name="RemoveContatoForm" 
			type="br.com.caelum.struts.action.RemoveContatoAction">
			<forward name="ok" path="/listaContatos.do"></forward>
		</action>
		<action path="/novoContato" name="ContatoForm" input="/novo.jsp"
			type="br.com.caelum.struts.action.AdicionaContatoAction" scope="request">
			<forward name="ok" path="/listaContatos.do"></forward>
		</action>
		<action path="/teste" type="br.com.caelum.struts.action.TesteSimplesAction">
			<forward name="ok" path="/exemplo.jsp"></forward>
		</action>
		<action path="/listaContatos" type="br.com.caelum.struts.action.ListaContatosAction">
			<forward name="lista" path="/lista.jsp" />
			<forward name="vazia" path="/lista-vazia.jsp"></forward>
		</action>
	</action-mappings>
	<!--  <message-resources parameter="MessageResources" />-->
</struts-config>

Não está faltando definir o atributo name desta action?

<action path="/mostraContato" type="br.com.caelum.struts.action.MostraContatoAction">  
            <forward name="ok" path="/mostraContato.do"/>  
        </action>  

Você estava certo, drsmachado! Adicionei o atributo name na action o meu struts-config.xml

	<form-beans>
		<form-bean name="ContatoForm" type="br.com.caelum.struts.form.ContatoForm"></form-bean>
		<form-bean name="RemoveContatoForm" type="br.com.caelum.struts.form.RemoveContatoForm"></form-bean>
		<form-bean name="MostraContatoForm" type="br.com.caelum.struts.form.MostraContatoForm"></form-bean>
	</form-beans>
	<action-mappings>
		<action path="/alteraContato" name="AlteraContatoForm" type="br.com.caelum.struts.action.AlteraContatoAction">
			<forward name="ok" path="/listaContatos.do"/>
		</action>
		<action path="/mostraContato" name="MostraContatoForm" type="br.com.caelum.struts.action.MostraContatoAction">
			<forward name="ok" path="/mostraContato.jsp"/>
		</action>

e agora passei por aquele problema! Porém agora está ocorrendo um outro erro nesta linha do MostraContatoAction

O erro que ocorre é este:


GRAVE: Servlet.service() for servlet jsp threw exception
javax.servlet.jsp.JspException: Cannot retrieve definition for form bean: "AlteraContatoForm" on action: "/alteraContato.do"
	at org.apache.struts.taglib.html.FormTag.lookup(FormTag.java:881)
	at org.apache.struts.taglib.html.FormTag.doStartTag(FormTag.java:488)
	at org.apache.jsp.mostraContato_jsp._jspx_meth_html_005fform_005f0(mostraContato_jsp.java:156)
	at org.apache.jsp.mostraContato_jsp._jspx_meth_html_005fhtml_005f0(mostraContato_jsp.java:106)
	at org.apache.jsp.mostraContato_jsp._jspService(mostraContato_jsp.java:72)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:388)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
	at org.apache.struts.chain.commands.servlet.PerformForward.handleAsForward(PerformForward.java:113)
	at org.apache.struts.chain.commands.servlet.PerformForward.perform(PerformForward.java:96)
	at org.apache.struts.chain.commands.AbstractPerformForward.execute(AbstractPerformForward.java:54)
	at org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
	at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191)
	at org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:305)
	at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191)
	at org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
	at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:449)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Unknown Source)
13/06/2012 10:05:10 org.apache.struts.chain.commands.AbstractExceptionHandler execute
AVISO: Unhandled exception
org.apache.jasper.JasperException: javax.servlet.ServletException: javax.servlet.jsp.JspException: Cannot retrieve definition for form bean: "AlteraContatoForm" on action: "/alteraContato.do"
	at org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:502)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:412)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
	at org.apache.struts.chain.commands.servlet.PerformForward.handleAsForward(PerformForward.java:113)
	at org.apache.struts.chain.commands.servlet.PerformForward.perform(PerformForward.java:96)
	at org.apache.struts.chain.commands.AbstractPerformForward.execute(AbstractPerformForward.java:54)
	at org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
	at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191)
	at org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:305)
	at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191)
	at org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
	at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:449)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Unknown Source)
Caused by: javax.servlet.ServletException: javax.servlet.jsp.JspException: Cannot retrieve definition for form bean: "AlteraContatoForm" on action: "/alteraContato.do"
	at org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:865)
	at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:794)
	at org.apache.jsp.mostraContato_jsp._jspService(mostraContato_jsp.java:79)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:388)
	... 33 more
Caused by: javax.servlet.jsp.JspException: Cannot retrieve definition for form bean: "AlteraContatoForm" on action: "/alteraContato.do"
	at org.apache.struts.taglib.html.FormTag.lookup(FormTag.java:881)
	at org.apache.struts.taglib.html.FormTag.doStartTag(FormTag.java:488)
	at org.apache.jsp.mostraContato_jsp._jspx_meth_html_005fform_005f0(mostraContato_jsp.java:156)
	at org.apache.jsp.mostraContato_jsp._jspx_meth_html_005fhtml_005f0(mostraContato_jsp.java:106)
	at org.apache.jsp.mostraContato_jsp._jspService(mostraContato_jsp.java:72)
	... 36 more
13/06/2012 10:05:10 org.apache.struts.chain.commands.ExceptionCatcher postprocess
AVISO: Exception from exceptionCommand 'servlet-exception'
org.apache.jasper.JasperException: javax.servlet.ServletException: javax.servlet.jsp.JspException: Cannot retrieve definition for form bean: "AlteraContatoForm" on action: "/alteraContato.do"
	at org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:502)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:412)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
	at org.apache.struts.chain.commands.servlet.PerformForward.handleAsForward(PerformForward.java:113)
	at org.apache.struts.chain.commands.servlet.PerformForward.perform(PerformForward.java:96)
	at org.apache.struts.chain.commands.AbstractPerformForward.execute(AbstractPerformForward.java:54)
	at org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
	at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191)
	at org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:305)
	at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191)
	at org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
	at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:449)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Unknown Source)
Caused by: javax.servlet.ServletException: javax.servlet.jsp.JspException: Cannot retrieve definition for form bean: "AlteraContatoForm" on action: "/alteraContato.do"
	at org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:865)
	at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:794)
	at org.apache.jsp.mostraContato_jsp._jspService(mostraContato_jsp.java:79)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:388)
	... 33 more
Caused by: javax.servlet.jsp.JspException: Cannot retrieve definition for form bean: "AlteraContatoForm" on action: "/alteraContato.do"
	at org.apache.struts.taglib.html.FormTag.lookup(FormTag.java:881)
	at org.apache.struts.taglib.html.FormTag.doStartTag(FormTag.java:488)
	at org.apache.jsp.mostraContato_jsp._jspx_meth_html_005fform_005f0(mostraContato_jsp.java:156)
	at org.apache.jsp.mostraContato_jsp._jspx_meth_html_005fhtml_005f0(mostraContato_jsp.java:106)
	at org.apache.jsp.mostraContato_jsp._jspService(mostraContato_jsp.java:72)
	... 36 more
13/06/2012 10:05:10 org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet testeDeStruts threw exception
javax.servlet.jsp.JspException: Cannot retrieve definition for form bean: "AlteraContatoForm" on action: "/alteraContato.do"
	at org.apache.struts.taglib.html.FormTag.lookup(FormTag.java:881)
	at org.apache.struts.taglib.html.FormTag.doStartTag(FormTag.java:488)
	at org.apache.jsp.mostraContato_jsp._jspx_meth_html_005fform_005f0(mostraContato_jsp.java:156)
	at org.apache.jsp.mostraContato_jsp._jspx_meth_html_005fhtml_005f0(mostraContato_jsp.java:106)
	at org.apache.jsp.mostraContato_jsp._jspService(mostraContato_jsp.java:72)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:388)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
	at org.apache.struts.chain.commands.servlet.PerformForward.handleAsForward(PerformForward.java:113)
	at org.apache.struts.chain.commands.servlet.PerformForward.perform(PerformForward.java:96)
	at org.apache.struts.chain.commands.AbstractPerformForward.execute(AbstractPerformForward.java:54)
	at org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
	at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191)
	at org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:305)
	at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191)
	at org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
	at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:449)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Unknown Source)

esse é o formulario motraContato.jsp

<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html:html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
	<title>Altera Contato</title>
</head>
<html:errors property="nome"/>
<html:form action="/alteraContato.do" focus="contato.nome">
	Nome:
		<html:text property="contato.nome" value="${contato.nome}"/>
		<br />
	Email:
		<html:text property="contato.email" value="${contato.email}"/>
		<br />
	Endereço:
		<html:text property="contato.endereco" value="${contato.endereco}"/>
		<br />	
		<html:submit>Enviar dados</html:submit>		
</html:form>
<body>

</body>
</html:html>

O que acha?

Senhores, consegui resolver! Corrigi meu struts-config.xml que estava sem a tag do formulário AlteraContatoForm:

	<form-beans>
		<form-bean name="ContatoForm" type="br.com.caelum.struts.form.ContatoForm"></form-bean>
		<form-bean name="RemoveContatoForm" type="br.com.caelum.struts.form.RemoveContatoForm"></form-bean>
		<form-bean name="MostraContatoForm" type="br.com.caelum.struts.form.MostraContatoForm"></form-bean>
		<form-bean name="AlteraContatoForm" type="br.com.caelum.struts.form.AlteraContatoForm"></form-bean>
	</form-beans>

Corrigi também o código do meu mostraContato.jsp que estava sem o id do contato como hidden:

<html:form action="/alteraContato.do" focus="contato.nome">
	<html:hidden property="contato.id" value="${contato.id}"/>
	Nome:
		<html:text property="contato.nome" value="${contato.nome}"/>
		<br />
	Email:
		<html:text property="contato.email" value="${contato.email}"/>
		<br />
	Endereço:
		<html:text property="contato.endereco" value="${contato.endereco}"/>
		<br />	
		<html:submit>Enviar dados</html:submit>		
</html:form>

[quote=jamesfrj]Senhores, consegui resolver! Corrigi meu struts-config.xml que estava sem a tag do formulário AlteraContatoForm:

	<form-beans>
		<form-bean name="ContatoForm" type="br.com.caelum.struts.form.ContatoForm"></form-bean>
		<form-bean name="RemoveContatoForm" type="br.com.caelum.struts.form.RemoveContatoForm"></form-bean>
		<form-bean name="MostraContatoForm" type="br.com.caelum.struts.form.MostraContatoForm"></form-bean>
		<form-bean name="AlteraContatoForm" type="br.com.caelum.struts.form.AlteraContatoForm"></form-bean>
	</form-beans>

Corrigi também o código do meu mostraContato.jsp que estava sem o id do contato como hidden:

<html:form action="/alteraContato.do" focus="contato.nome">
	<html:hidden property="contato.id" value="${contato.id}"/>
	Nome:
		<html:text property="contato.nome" value="${contato.nome}"/>
		<br />
	Email:
		<html:text property="contato.email" value="${contato.email}"/>
		<br />
	Endereço:
		<html:text property="contato.endereco" value="${contato.endereco}"/>
		<br />	
		<html:submit>Enviar dados</html:submit>		
</html:form>

[/quote]
Opa, parabéns.
Precisei dar um gás aqui numas coisas, não consegui acompanhar.
Mas é isso, valeu por postar o resultado aí.

Seguem os arquivos que alterei para resolver o problema (podem ajudar outro na mesma situação):

struts-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 1.0//EN"
	"http://jakarta.apache.org/struts/dtds/struts-config_1_0.dtd">

<struts-config>
	<form-beans>
		<form-bean name="ContatoForm" type="br.com.caelum.struts.form.ContatoForm"></form-bean>
		<form-bean name="RemoveContatoForm" type="br.com.caelum.struts.form.RemoveContatoForm"></form-bean>
		<form-bean name="MostraContatoForm" type="br.com.caelum.struts.form.MostraContatoForm"></form-bean>
		<form-bean name="AlteraContatoForm" type="br.com.caelum.struts.form.AlteraContatoForm"></form-bean>
	</form-beans>
	<action-mappings>
		<action path="/alteraContato" name="AlteraContatoForm" type="br.com.caelum.struts.action.AlteraContatoAction">
			<forward name="ok" path="/listaContatos.do"/>
		</action>
		<action path="/mostraContato" name="MostraContatoForm" type="br.com.caelum.struts.action.MostraContatoAction">
			<forward name="ok" path="/mostraContato.jsp"/>
		</action>
		<action path="/mudaIdioma" type="br.com.caelum.struts.action.MudaIdiomaAction">
			<forward name="ok" path="/testa-mensagens.jsp"/>
		</action>
		<action path="/removeContato" name="RemoveContatoForm" 
			type="br.com.caelum.struts.action.RemoveContatoAction">
			<forward name="ok" path="/listaContatos.do"></forward>
		</action>
		<action path="/novoContato" name="ContatoForm" input="/novo.jsp"
			type="br.com.caelum.struts.action.AdicionaContatoAction" scope="request">
			<forward name="ok" path="/listaContatos.do"></forward>
		</action>
		<action path="/teste" type="br.com.caelum.struts.action.TesteSimplesAction">
			<forward name="ok" path="/exemplo.jsp"></forward>
		</action>
		<action path="/listaContatos" type="br.com.caelum.struts.action.ListaContatosAction">
			<forward name="lista" path="/lista.jsp" />
			<forward name="vazia" path="/lista-vazia.jsp"></forward>
		</action>
	</action-mappings>
	<!--  <message-resources parameter="MessageResources" />-->
</struts-config>

mostraContato.jsp

<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html:html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
	<title>Altera Contato</title>
</head>
<html:errors property="nome"/>
<html:form action="/alteraContato.do" focus="contato.nome">
	<html:hidden property="contato.id" value="${contato.id}"/>
	Nome:
		<html:text property="contato.nome" value="${contato.nome}"/>
		<br />
	Email:
		<html:text property="contato.email" value="${contato.email}"/>
		<br />
	Endereço:
		<html:text property="contato.endereco" value="${contato.endereco}"/>
		<br />	
		<html:submit>Enviar dados</html:submit>		
</html:form>
<body>

</body>
</html:html>

Obrigado a todos pela atenção e paciência!
Grande abraço!

Senhores, como marco este tópico como resolvido?

Basta editar o tópico original e, no título, incluir [RESOLVIDO] antes do mesmo.

Desculpem a minha ignorância. Não consegui achar a opção para editar o título do meu tópico “Struts 1, apostila da Caelum, dúvidas na action MostraContatoAction” na tela de “Índice dos Fóruns”. Talvez eu esteja sem permissão para ver a opção de editar… :frowning: Será que o moderador tem acesso para colocar como resolvido?

Desculpem o incômodo…

Pessoal, aprendi aqui como fazer!!
Mais uma vez obrigado!