[RESOLVIDO] Dificuldades para Exportar com Displaytag

5 respostas
J

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

J

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.

G

Olá,

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

J

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.

G

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

J

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