Não consigo utilizar request.setAttribute corretamente

Pessoal, estou estudando Struts pela apostila da Caelum fj21 e encontro o seguinte problema.

CLASSE ACTION

public class ListaContatosAction extends Action {

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

		// pesquisa no banco de dados a lista completa
		List<Contato> lista = new ContatoDAO().getLista();
		request.setAttribute("contatos", lista);

		// ok... para onde ir agora?
		return map.findForward("lista");
	}
}

STRUTS-CONFIG.xml

   <action path="/listaContatos" type="br.com.caelum.struts.action.ListaContatosAction">
          <forward name="lista" path="/lista.jsp"></forward>
    </action>

ARQUIVO JSP

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<c:forEach var="contato" items="${contatos}">
	${contato.id} - ${contato.nome} <br>
</c:forEach>
</body>
</html>

Quando a página é carregada no broswer, apenas é exibido o conteúdo:

${contato.id} - ${contato.nome}

parece que ele não executa o forEach, e não consegue recuperar a lista passada pelo request.setAttribute()…

Alguem poderia me ajudar?

agradeço!!!

Realmente vc fez certo mas na parte da visualização esta errado vc esta imprimindo a String ${contato.id} - ${contato.nome} e não objeto para isso utilize EL <c:out value=objeto />

Veja o exemplo


&lt;c:forEach var="contato" items="${contatos}"&gt;
 
        &lt;c:out value="${contato.id}"/&gt; - &lt;c:out value="${contato.nome}"/&gt; <br>

 &lt;/c:forEach&gt;

então ! eu já tentei fazer isso e mesmo assim continuo com o problema !!

Tenta colocar o jars do jstl.jar e standard.jar no teu classpath.

já estão la !

eu estou utilizando o Tomcat versão 6.0.9

imagino que esse problema não seja causado pelo fato de utilizar strut… de qualquer forma não consigo entender o porque não funciona, sendo que está exatamente igual ao criado na apostila…

Está dentro do diretório lib tb?

De uma olhada…talvez possa te ajudar:

http://www.guj.com.br/posts/list/42036.java

[]´s

Carlos

Tenta colocar no início da página JSP:

&lt;% pageContext.setAttribute("contatos", request.getAttribute("contatos")); %&gt;

Pessoal. é alguma coisa relacionada ao Struts… eu criei aki um exemplo semelhante porem ao inves de criar um Action, eu fiz uma classe extendida do httpservllet e utilizei o RequestDispacher pra chamar a pagina JSP

dessa maneira funcionou !! agora eu não sei onde esta o problema no struts

Eu tb estou executando o mesmo exemplo e tenho o mesmo prob. Já tentei tudo q foi citado acima e nada…

Tenho uma TagLib funcionando sem o uso do Struts.

Tá aki meu código da Action que não funciona corretamente:

	public ActionForward execute(ActionMapping map, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {		
		System.out.println("Executando o negócio... Listagem");
		
		List<Serie> serieList =  Serie.serieLista();
		System.out.println("Total da lista: " + serieList.size());
		request.setAttribute("listaseries", serieList);
		
		return map.findForward("oklista");
	}

O comando está imprimindo no console a quantidade corretamente. Mas este request é q é o problema. Por que qdo ele entra em ação, está aparentemente desabilitando TagLibs…

Acho q se a listagem estivesse sendo passada vazia para o request, ele não entraria no loop para imprimir " ${contato.id} - ${contato.nome} " na tela em vez de processá-lo devidamente como TagLib.

Se alguém puder ajudar fico agradecido.
Obrigado

é, consegui…

Caso esse passo a passo funcione com vc podemos concluir q é um bug no arquivo web.xml que vem no “struts-blank.1.3.8.war”.
Certamente vc fez a importação deste arquivo.
Originalmente ele está assim no começo dele:

<?xml version="1.0" encoding="ISO-8859-1" ?> 
 <!-- Vários de comentários...-->
<!DOCTYPE web-app (View Source for full doctype...)> 
<web-app>
  1. Vá no seu web.xml e exclua as linhas que estiverem acima de(acima não incluindo esta linha a seguir)
 <display-name> Nome da Aplicação</display-name>
  1. Depois inclua as seguintes linhas no começo do arquivo:
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" version="2.4">
  1. Deixe o sua JSP somente com o seguinte cabeçalho:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  1. Reinicie o tomcat

5)Então acesso seu http://localhost/seuContexo/suaAcao.do

Espero que funcione.
Kra, comigo ficou redondo MAS NÃO SEI EXPLICAR TECNICAMENTE AS MUDANÇAS.
Tem tanta coisa na vida q a gente faz e não sabe o porquê… está é só mais uma… Sou iniciante mas gostaria de ter uma explicação técnica. Caso alguem se habilite ficarei agradecido.

Obrigado.

ok

Eu editei o web.xml e funcionou. Não precisa editar a taglib da jsp

Estudando na web descobri o motivo.

Esta linha:

faz com que nossa web.xml que define a estrutura de nossa aplicação web entender o código do jsp. Caso esta linha não esteja adicionada o código ${variavel} não significa nada para o xml, visto ser nativo do jsp.

Espero ter ajudado.