[RESOLVIDO] Dificuldades para Exportar com Displaytag

5 respostas
JocaGenius

Bom dia, estou fazendo uma aplicação com displaytag e vraptor em que tenho de exportar uma tabela do jsp para excel, pdf ou csv.
Porém ao clicar no link que o displaytag gera na página dá erro 404.
Pelo que entendi, se eu utilizar as classes default do displaytag não teria de implementar nada, certo?
O SampleBean é uma classe que fiz para testar esse exemplo, ela contém apenas dois atributos (nome e número) com os respectivos getters e setters, equals e hashcode implementados.

Meu displaytag.properties está assim:

export.types=csv excel xml pdf
export.excel=true
export.csv=true
export.xml=true
export.pdf=true
export.excel.class=org.displaytag.export.DefaultExcelExportView
export.pdf.class=org.displaytag.export.DefaultPdfExportView
basic.msg.empty_list=Nenhum resultado obtido para a pesquisa
export.amount=list
export.csv.label=<span class="csv">CSV</span>
export.excel.label=<span class="excel">EXCEL</span>
export.xml.label=<span class="xml">XML</span>
export.pdf.label=<span class="pdf">PDF</span>
export.csv.filename=sampleBeanCSV.csv
export.excel.filename=sampleBeanExcel.xls
export.xml.filename=sampleBeanXML.xml
export.pdf.filename=sampleBeanPDF.pdf
export.csv.include_header=true
export.excel.include_header=true
export.pdf.include_header=true

Meu jsp está assim:

<div>
			<display:table 	pagesize="2" export="true" name="${sampleBeanList}" class="tablesorter" 
							defaultsort="1" uid="tabelaTest" sort="list" htmlId="testTabela" excludedParams="ajax">
				<display:setProperty name="basic.empty.showtable" value="true"/>
				<display:column value="${sampleBeanList}" class="itensLista" property="nome"/>
				<display:column value="${sampleBeanList}" class="itensLista" property="numero" 
								sortable="true" sortProperty="numero" />
				<display:setProperty name="export.excel.filename" value="sampleBeanExcel.xls" />  
		        <display:setProperty name="export.csv.filename" value="sampleBeanCSV.csv" />  
		        <display:setProperty name="export.pdf.filename" value="sampleBeanPDF.pdf"  />  
		        <display:setProperty name="export.pdf" value="true" />  
		        <display:setProperty name="export.xml" value="false" /> 								
			</display:table>
		</div>

Meu web.xml

<!-- Filtro VRaptor -->
	<filter>
		<filter-name>vraptor</filter-name>
		<filter-class>br.com.caelum.vraptor.VRaptor</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>vraptor</filter-name>
		<url-pattern>/*</url-pattern>
		<dispatcher>FORWARD</dispatcher>
		<dispatcher>REQUEST</dispatcher>
	</filter-mapping>
	
	<!-- Filtro Exporter Displaytag -->
	<filter>
	  <filter-name>ResponseOverrideFilter</filter-name>
	  <filter-class>org.displaytag.filter.ResponseOverrideFilter</filter-class>
	</filter>
	<filter-mapping>
	  <filter-name>ResponseOverrideFilter</filter-name>
	  <url-pattern>/*</url-pattern>
	</filter-mapping>

Meu controller

@Resource
@Path("/")
public class DisplayTagController{

	private final Result result;
	
	public DisplayTagController(Result result){
		this.result = result;
	}
	
	@Get("/exibirListaBean/")
	public List<SampleBean> displaytag(){
		
		List<SampleBean> lista = new ArrayList<SampleBean>();
		
		SampleBean bean = new SampleBean();
		bean.setNome("Nome Do Bean");
		bean.setNumero(1L);
		lista.add(bean);
		
		SampleBean bean2 = new SampleBean();
		bean2.setNome("Nome Do Bean2");
		bean2.setNumero(2L);
		lista.add(bean2);

		SampleBean bean3 = new SampleBean();
		bean3.setNome("Nome Do Bean3");
		bean3.setNumero(3L);
		lista.add(bean3);
		
		SampleBean bean4 = new SampleBean();
		bean4.setNome("Nome Do Bean4");
		bean4.setNumero(4L);
		lista.add(bean4);
		
		SampleBean bean5 = new SampleBean();
		bean5.setNome("Nome Do Bean5");
		bean5.setNumero(5L);
		lista.add(bean5);
		
		SampleBean bean6 = new SampleBean();
		bean6.setNome("Nome Do Bean6");
		bean6.setNumero(6L);
		lista.add(bean6);
		result.include("sucesso", "Objetos adicionados com sucesso!");
		return lista;
	}

Pelo log do console não exibe erro, apenas esta mensagem, que eu imagino ser o problema, com status de debug.

Não encontrei nada na documentação do displaytag que me esclareça, não encontrei nenhuma referencia a esse parametro, alguém tem alguma idéia de como resolver esse impasse, ou já passou por isso?

Obrigado.

5 Respostas

JocaGenius

Percebi uma coisa que não havia dado atenção, a url que eu chamo a aplicação é a seguinte:

http://localhost:8080/displaytag/exibirListaBean/

E quando clico em qualquer um dos links de exportação, ele redireciona para a seguinte url:

http://localhost:8080/displaytag/WEB-INF/jsp/displayTag/displaytag.jsp?6578706f7274=1&d-2640249-e=2

Acredito que este redirecionamento esteja “quebrando” o padrão do VRaptor.
Alguém tem alguma sugestão de como alterar o redirecionamento dos links gerados pelo displaytag?

Grato.

gomesrod

Olá,

O atributo requestURI pode ser usado para controlar a base dos links gerados pela displaytag

JocaGenius

gomesrod:
Olá,

O atributo requestURI pode ser usado para controlar a base dos links gerados pela displaytag

Bom dia gomesrod, me corrija se eu estiver errado, fiz um teste aqui com o requestURI, e ele altera todos os links referentes a tabela, não só os de exportação.
Você sabe como devo setar o requestURI para alterar apenas os links de exportação?

Obrigado.

gomesrod

Que eu saiba ele sempre altera de tudo mesmo, mas isso não tem problema porque todos os links (exportação, paginação) apontam para a mesma página

JocaGenius

Graaaaande gomesrod, descobri onde estava meu erro.
Após você dizer que os links deveriam redirecionar para a mesma página, eu encontrei o erro.
Esqueci de redirecionar a página para ela mesma com o result do VRaptor.

Faltou exatamente esta linha:

result.forwardTo(this).displaytag();

Muito obrigado por sua ajuda!

Criado 19 de junho de 2012
Ultima resposta 20 de jun. de 2012
Respostas 5
Participantes 2