Struts 2 Não está "pendurando" objetos no response. ( ou ...eu ? )

Pessoal ,

Estou intrigado com um probleminha que estou tendo com Struts2 : A lógica é simples, dado uma tabela "contatos"
o struts2 deveria passar as informações para a jsp. O problema é que chamando pela url , a impressão dos contatos ,
só ocorre na segunda vez que a url é acessada.

o jsp de exibição está assim :

–> listaTarefas.jsp

Lista Tarefas

<c:forEach items="${tarefas}" var="tarefa">
	<tr>
		<td>${tarefa.id}</td>
		<td>${tarefa.descricao}</td>
		<c:if test="${tarefa.finalizado eq false}"><td>Não Finalizado</td></c:if> 
		<c:if test="${tarefa.finalizado}"><td>Finalizado</td></c:if>
		<td><fmt:formatDate value="${tarefa.dataFinalizacao.time}" pattern="dd/MM/yyyy" /></td>
	</tr>
</c:forEach>
Id Descrição Finalizado Data de Finalização

–> o que chama está assim (formularioTarefas.jsp)

Descrição:


Testa:

-------- minha action

@ParentPackage(“tarefasCrud”)
public class TarefasCrudAction extends ActionSupport {

private static final Log LOG = LogFactory.getLog(TarefasCrudAction.class);
private static final long serialVersionUID = 1L;
private Tarefa tarefa;
private List<Tarefa> tarefas;


public String adiciona (){
	LOG.info("adicionando tarefa: "+tarefa.getDescricao());
	new TarefaDAO().adiciona(tarefa);
	return SUCCESS;
}

public String lista (){
	LOG.info("listando tarefas");
	tarefas = new TarefaDAO().getLista();

// System.out.println(tarefas);
return SUCCESS;
}

/* GETTERS AND SETTERS */

public List<Tarefa> getTarefas() {
	LOG.info("entrei getTarefas()");
	System.out.println("passei no get list tarefas");
	return tarefas;
}

public void setTarefas(List<Tarefa> tarefas) {
	LOG.info("entrei setTarefas()");
	System.out.println("passei no set list tarefas");
	this.tarefas = tarefas;
}

public Tarefa getTarefa() {
	LOG.info("entrei getTarefa()");
	System.out.println("passei no get tarefa");
	return tarefa;
}

public void setTarefa(Tarefa tarefa) {
	LOG.info("entrei setTarefa");
	System.out.println("passei no set tarefa");
	this.tarefa = tarefa;
}

}

-------- e por fim o struts xml

	<!-- setup the default-stack exception mapping interceptor so that any 
		exceptions not caught by this application will be logged and then handled 
		by the global exception mapping -->
	<interceptors>
		<interceptor-stack name="appDefault">
			<interceptor-ref name="defaultStack">
				<param name="exception.logEnabled">true</param>
				<param name="exception.logLevel">ERROR</param>
			</interceptor-ref>
		</interceptor-stack>
	</interceptors>
	<default-interceptor-ref name="appDefault" />

	<global-exception-mappings>
		<exception-mapping result="runtime" exception="java.lang.Exception" />
	</global-exception-mappings>


	<action name="adiciona" method="adiciona"
		class="br.com.cavazin.tarefas.action.TarefasCrudAction">
		<result name="success">/jsp/tarefaAdicionada.jsp</result>
	</action>

	<action name="listaTarefa" method="lista"
		class="br.com.cavazin.tarefas.action.TarefasCrudAction">
		<result name="success">/jsp/listaTarefas.jsp</result>
	</action>
</package>

não tem nenhum erro de digitação ou qualquer coisa, pelo que eu entedi ,
porque o problema não é que não funciona , quando eu acesso a url direto , funciona. (http://localhost:8080/listadetarefas/jsp/listaTarefa.action)
Mas quando eu clico no form ( listaTarefa.action ) ele não imprime , quando eu clico , voltar e no botão do form de novo ,
dai os detalhes aparecem … estou intrigado a um tempo e não achei o problema . Quem quiser ver o code
está em http://github.com/rafaelcavazin/listadetarefas ( é o exercício da apostila fj21 : 11.10 mas sem anotation e com maven jetty :slight_smile: )

quem descobrir essa zica , ganha um tutu de java beans :smiley:

Olá.

Amigo, gostaria de fazer alguma observações:

1. Poderia ter feito tudo sem mapear as actions em XML, bastando a anotação @Action sobre os métodos que deseja mapear.
2. Poderia ter dispensado a anotação @ParentPackage para essa e todas as outras Actions do seu projeto caso usasse o parâmetro de configuração struts.convention.default.parent.package=tarefasCrud
3. Recomento fortemente trocar as tags JSTL por tags Struts2
<c:forEach> => <s:iterator> (é bem mais fácil saber quando se está na primeira ou na última linha ou se está numa linha par ou ímpar)
fmt:formatDate => <s:date> (a formatação é padrão “dd/MM/yyyy” para nosso Locale pt_BR)
<c:if> => <s:if> (aqui há um <s:else> que evita “2 ifs” como no JSTL)
4. Não precisa por o sufixo “.action” para invocar os mapeamentos. O nome do mapemento sem “.action” funciona, além de ficar mais “elegante” (pelo menos eu acho)

Bem, quanto ao seu problema, acredito que da primeira vez a lista não é populada com a tupla do banco de dados. Você usou DEBUG em sua action?