Problemas para montar resultado de uma busca com Struts 2

Boa Noite pessoal…

Tô com uma dificuldade em um sisteminha q estou desenvolvendo utilizando o struts 2.

A minha dificuldade é a seguinte:

  • tenho uma tela de pesquisa, nela informo os filtros e solicito a busca. A mesma é realizada corretamente, mas não exibe na tela.

Segue o codigo da minha pagina de pesqusa

<body class="menu" style="margin: 0px; padding:0;">
	
	<s:include value="menu.jsp"></s:include>
	<s:div id="formulario" href="pesquisa!input.action" theme="ajax"></s:div>
	<s:div id="listaDocumento" href="listaDocumentos.action" theme="ajax" listenTopics="listagemDocumentos"></s:div>
	
</body>

codigo do formulario

<s:form id="formPesquisa" action="documento!pesquisar.action" theme="ajax" method="post">
	<s:textfield name="doctoNro" label="Número"></s:textfield>
	<s:textfield name="doctoAssunto" label="Assunto"></s:textfield>
	<s:select label="Visibilidade" name="visibilidade" list="listVisibilidade"></s:select>
	<s:select label="Status" name="status" list="listStatus"></s:select>
	<s:submit value="Pesquisar" notifyTopics="listagemDocumentos" ></s:submit>
</s:form>

codigo da pagina da tabela de resultados

<table width="750px" border="1" bordercolor="blue" cellpadding="2" cellspacing="2">
	<tr >
		<td width="30px">Número</td>
		<td width="80px">Assunto</td>
		<td width="20px">Visibilidade</td>
		<td width="20px">Status</td>
	</tr>
	<s:iterator value="documentos">
		<tr>
			<td width="30px"><s:property value="doctoNumero"/></td>
			<td width="80px"><s:property value="doctoAssunto"/></td>
			<td width="20px"><s:property value="doctoVisibilidade"/></td>
			<td width="20px"><s:property value="doctoStatus"/></td>
		</tr>
	</s:iterator>
</table>

segue o codigo da minha Action


import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import com.opensymphony.xwork2.ActionSupport;

import br.com.normas.model.Documento;
import br.com.normas.test.TesteDAO;
import br.com.normas.util.SegurancaWeb;

public class DocumentoAction extends ActionSupport{
		
	private static final long serialVersionUID = 1L;

	public List<Documento> documentos;
	
	private List<String> listVisibilidade;
	private List<String> listStatus;
	@SuppressWarnings("unused")
	private String visibilidade;
	@SuppressWarnings("unused")
	private String status;
	private List<Documento> doctos;
	
	
	public List<Documento> getDocumentos() {
		return documentos;
	}

	public void setDocumentos(List<Documento> documentos) {
		this.documentos = documentos;
	}
	
	public String listaDocumentos() {
		documentos = this.getDoctos();
		return "sucess";
	}

	public List<Documento> getDoctos() {
		return doctos;
	}

	public void setDoctos(List<Documento> doctos) {
		this.doctos = doctos;
	}

	public String input(){
		this.getListVisibilidade();
		this.getListStatus();
		return "resultado";
	}
	
	public List<String> getListStatus() {
		listStatus = new ArrayList<String>();
		listStatus.add("");
		if(SegurancaWeb.hasPrivilege("COMUM")){
			listStatus.add("VIGENTE");
		} 
		if (SegurancaWeb.hasPrivilege("APROVADOR")){
			listStatus.add("AG_APROVACAO");
			listStatus.add("EM_ELABORACAO");
			listStatus.add("OBSOLETO");
		}
		if (SegurancaWeb.hasPrivilege("CRIADOR")){
			listStatus.add("AG_APROVACAO");
			listStatus.add("EM_ELABORACAO");
		}
		return listStatus;
	}

	public void setListStatus(List<String> listStatus) {
		this.listStatus = listStatus;
	}

	public String getStatus() {
		return status = "";
	}

	public void setStatus(String status) {
		this.status = status;
	}

	public List<String> getListVisibilidade() {
		listVisibilidade = new ArrayList<String>();
		listVisibilidade.add("");
		listVisibilidade.add("CONFIDENCIAL");
		listVisibilidade.add("PUBLICO");
		return listVisibilidade;
	}

	public void setListVisibilidade(List<String> listVisibilidade) {
		this.listVisibilidade = listVisibilidade;
	}
	
	public String getVisibilidade() {
		return visibilidade = "PUBLICO";
	}

	public void setVisibilidade(String visibilidade) {
		this.visibilidade = visibilidade;
	}
	
	public void pesquisar(){
		this.setDoctos(TesteDAO.getListDocto());
		System.out.println(documentos.size());
	}
}

codigo do Struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Fundation//DTD Struts Configuration 2.0//EN"
	"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
	<include file="struts-default.xml"></include>
	<package name="defaut" extends="struts-default">
		<action name="login!*" method="{1}" class="br.com.normas.actions.LoginAction">
			<result name="sucess">/pesquisa.jsp</result>
			<result name="invalid">/login.jsp</result>
		</action>
		
		<action name="pesquisa!*" class="br.com.normas.actions.DocumentoAction" method="input">
			<result name="resultado">/formPesqDocto.jsp</result>
			<result></result>
		</action>
		
		<action name="listaDocumentos!*" class="br.com.normas.actions.DocumentoAction" method="listaDocumentos">
			<result name="sucess">/tabelaDocto.jsp</result>
		</action>
		
	</package>
</struts>

Quando clico no botao pesquisar, ele realiza a busca normalmente. Quando o metodo pesquisar termina, é chamado o metodo listaDocumentos. Neste ponto a lista listDoctos já se encontra vazia.

Se colocar a chamada dao no metodo listaDocumentos, a tabela resultado é preenchida corretamente, porem ao montar a tela ele já reliza a busca.

Se alguem tiver vendo uma solução… posta ai…

valeu

Daniel

Cara, também estou procurando a solução para um problema exatamente igual ao seu…

Como gambiarra (que não tenho orgulho nenhum de ter feito), fiz no método de busca uma gravação na sessão da lista retornada na pesquisa. E no método que o div ListaDocumento chama fiz a leitura do objeto que estava em sessão.

Na busca:

Map attributes = ActionContext.getContext().getSession(); attributes.put("users", getUsers());
Na listagem:

users = (List<User>) ActionContext.getContext().getSession().get("users");

Ficou feio… confesso, mas até alguem responder coerentemente o tópico (também estou aguardando), serve como paleativo.

Percebi que quando você manda pesquisar, por mais que esteja habilitada a pesquisa com ajax, a página inteira parece q sofre um reload.
Verifique que o método de ListaDocumento é chamado 2x e o de busca (Pesquisar) eh chamado 1x, mas o valor retornado nesta busca não fica persistente pelo reload.

Não sei se fui claro, mas explicar gambiarra não tem como.

Aguardo solução competente.

abraço!!!

e ai mcaixeta valeu pela dica…

fiz uma gambiarra parecida com a sua, mas antes de executar o metodo listaDocumentos precisei verificar se tinha uma lista na sessão, pois tava perdendo a lista retornada.

bom enquanto isso vamos aguardar até alguem postar uma solução elegante…

att Daniel