Paginação no Struts 2

Ola,

Estou há tempos procurando fazer uma paginação utilizando somente o Struts 2, mas não consegui fazer. Sei que no JSF existe um componente para isso, mas como já estou terminando meu projeto utilizando o Struts não quero ter de trocar o Framework.

Alguém sabe alguma forma de fazer essa paginação, tem algum tutorial ou exemplo? Também estou utilizando o Hibernate.

Desde já agradeço.

Dê uma olhada na DisplayTag, uma excelente taglib para paginação de dados que se integra muito bem com o Struts 2.

Guilherme Mello,

Olhei e comecei a implementar o DisplayTag. Agradeço pela dica.
Mas estou enfrentando algumas dificuldades.

Coloquei o atributo “pagesize” da “table” para tentar fazer a paginação. O DisplayTag mostrou a qtde de registro e os números de páginas que tinha, quando tento paginar da o seguint erro:

javax.servlet.jsp.JspException: Attribute whith name ‘title’ + not found
at org.apache.tiles.taglib.AttributeTagSupport.doStartTag(AttributeTagSupport.java:108)
at org.apache.jsp.template.layoutLogin_jsp._jspx_meth_tiles_005fimportAttribute_005f0(layoutLogin_jsp.java:129)
at org.apache.jsp.template.layoutLogin_jsp._jspService(layoutLogin_jsp.java:67)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:414)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)

Se for possível me dizer qual o erro, agradeço.

Ah! Meu o código da JSP esta dessa forma.

<%@ taglib prefix=“s” uri="/struts-tags" %>
<%@ taglib uri=“http://displaytag.sf.net” prefix=“display” %>
<%request.getAttribute(“listaUsuario”); %>

   

" class="borderAll" pagesize="3" id="usu">  

Utilize o atributo requestURI da displaytag para ele avançar as páginas. Utilize como valor, a página atual.

Muito obrigado. Deu certo, agora está paginando.

Mais uma pergunta! Como é que eu faço para estar mudando de cores e layout a disponibilização da tabela do displayTag?

Como colocar a paginação embaixo da lista?

To começando a mexer agora com o DisplayTag.

Obrigado.

Solimar, para customizar a displaytag, basta criar o arquivo displaytag.properties no seu classpath. Você pode tomar como base o conteúdo do arquivo properties que devem dentro do JAR da displaytag. A partir dessa configuração, você pode ir customizando seu grid de acordo com a necessidade.

Como faço para passar um parâmetro através de uma uma url do displaytag para a Action do Struts 2?

Já olhei nos exemplos da net, mas não consegui entender!

estou utilizando as propriedades da tag Column como: href, paramId, paramProperty, sortable, paramScope…

Estava utilizando o “iterator” do struts e passando através das tags “url”, “param” e “a href”. Ia para a action configurada e direto para os atributo que eu tinha os get e set na Action.

A minha jsp é essa:

<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ taglib uri="http://displaytag.sf.net" prefix="display" %>
<%request.getAttribute("listaUsuario"); %>
<html>
	<center>
	<div class="titleDiv"><s:text name="application.title"/></div>
	<center><h1><s:text name="label.usuarios"/></h1></center>
	<s:url id="url" action="usuario" namespace="/manterUsuario" method="carregarIncluirUsuario" />
	<s:a href="%{url}"><s:text name="label.usuario.incluir"/></s:a>&nbsp;&nbsp;&nbsp;
	<s:set name="login" scope="session" value="login"/>
	<s:url id="url" action="usuario" namespace="/manterUsuario" method="paginaPrincipal"></s:url>
	<s:a href="%{url}"><s:text name="label.pagina.principal"/></s:a>
	<br><br>
	<s:form action="usuario" namespace="/manterUsuario" method="post">
		<s:textfield name="usuario.nomeLogin" key="label.consulta.por.login"></s:textfield>
		<s:submit name="action" key="label.consultar" cssClass="butStnd" method="carregarConsultarUsuario"></s:submit>
	</s:form>
	<display:table name="<%=request.getAttribute("listaUsuario")%>" class="borderAll" pagesize="5" id="usu" requestURI=""  >
		<display:column property="nomeLogin" title="Nome Login" />
		<display:column property="nome" title="Nome Usuario"/>
		<display:column property="senhaLogin" title="Senha Login"/>
		<display:column property="descricaoSexo" title="Descricao Sexo"/>
		<display:column property="descricaoPerfil" title="Perfil"/>
		<display:column property="dataNasc" title="Data de Nascimento"/>
		<display:column property="descricaoUF" title="UF"/>
		<display:column property="endereco" title="Endereço"/>
		<display:column property="telefone" title="Telefone"/>
		<display:column property="descricaoCurso" title="Curso"/>
		<display:column property="matricula" title="Matricula"/>
		<display:column class="nowrap" property="nomeLogin" href="usuario" title="Alterar" sortable="true" paramId="nomeLogin" paramProperty="nomeLogin" paramScope="request">
			<s:url id="url" action="usuario" namespace="/manterUsuario" method="carregarAlterarUsuario">
		    	<s:param name="nomeLogin" value="usu.nomeLogin"/>
		    </s:url>
				<s:a href="%{url}"><s:text name="label.alterar"/></s:a>&nbsp;
		</display:column>
	</display:table>
</center>
</html>

Desde já agradeço


Resultado:

[code]fooAction.do?id=foo.id[/code]

Ou então você pode utilizar um Decotaror para fazer isso. Na documentação da Displaytag tem alguns exemplos.

Resultado:

Ou então você pode utilizar um Decotaror para fazer isso. Na documentação da Displaytag tem alguns exemplos.

Muito obrigado novamente, deu certo.

Eu coloquei da seguinte forma:

<display:column class="nowrap" property="nomeLogin" href="usuario!carregarAlterarUsuario.action" title="Alterar" sortable="true" paramId="nomeLogin" paramProperty="nomeLogin" />

A maneira de chamar um método pelo Struts 2 é diferente, pelo menos como eu aprendi!

Fica ai mais uma vez meu agradecimento pela ajuda.

Também consegui customizar a tabela com o arquivo “displaytag.properties”.

[quote=solimar]Muito obrigado novamente, deu certo.

Eu coloquei da seguinte forma:

<display:column class="nowrap" property="nomeLogin" href="usuario!carregarAlterarUsuario.action" title="Alterar" sortable="true" paramId="nomeLogin" paramProperty="nomeLogin" />

A maneira de chamar um método pelo Struts 2 é diferente, pelo menos como eu aprendi!

Fica ai mais uma vez meu agradecimento pela ajuda.

Também consegui customizar a tabela com o arquivo “displaytag.properties”.[/quote]

Ótimo. Qualquer dúvida estamos por aqui. :wink:

Ola,

Alguém sabe como eu mostro as listas de radio button do struts 2 em colunas?

Tentei colocar,mas automaticamente ele já vem com um

e quebra a linha.

Eu tenho de colocar uma tabela como na primeira figura, mas com o struts eu consigo igual à segunda figura.

Boa tarde.

Eu estou com uma dúvida na exportação do displaytag para PDF.

Peguei um exemplo, conseguir colocar até uma figura para representar para qual extensão quero exportar.

o código é o seguinte:

<center><h1><s:text name="label.usuarios"/></h1></center>
	<s:url id="url" action="usuario" namespace="/manterUsuario" method="carregarIncluirUsuario" />
	<s:a href="%{url}"><s:text name="label.usuario.incluir"/></s:a>&nbsp;&nbsp;&nbsp;
	<s:set name="login" scope="session" value="login"/>
	<s:url id="url" action="usuario" namespace="/manterUsuario" method="paginaPrincipal"></s:url>
	<s:a href="%{url}"><s:text name="label.pagina.principal"/></s:a>
	<br><br>
<jsp:scriptlet> 
    	request.setAttribute( "listaUsuario", request.getAttribute("listaUsuario"));      
  	</jsp:scriptlet>
	<display:table name="listaUsuario" class="borderAll" pagesize="5" id="usu" requestURI="" export="true" >
		<display:setProperty name="export.pdf" value="true" />
		<display:setProperty name="export.excel" value="false"></display:setProperty>
		<display:setProperty name="export.csv" value="false"></display:setProperty>
		<display:setProperty name="export.xml" value="false"></display:setProperty>
		<display:column property="nome" title="Nome Usuario"/>
		<display:column property="senhaLogin" title="Senha Login"/>
		<display:column property="descricaoSexo" title="Descricao Sexo"/>
		<s:if test="perfis.size == 1">
			<display:column property="descricaoPerfil" title="Perfil"/>
		</s:if>
		<s:if test="perfis.size != 1">
			<display:column value="Mais de 1 perfil" title="Perfil"/>
		</s:if>
		<display:column property="dataNasc" title="Data de Nascimento"/>
		<display:column property="descricaoUF" title="UF"/>
		<display:column property="endereco" title="Endereço"/>
		<display:column property="telefone" title="Telefone"/>
		<display:column property="descricaoCurso" title="Curso"/>
		<display:column property="matricula" title="Matricula"/>
		<display:column class="nowrap" property="nomeLogin" href="usuario!carregarAlterarUsuario.action" title="Alterar" sortable="true" paramId="nomeLogin" paramProperty="nomeLogin" />
	</display:table>

Mas o link que é gerado para fazer a exportação é de um link utilizado dentro da pagina, chamando um outro método que não tem nada com exportação. Como faço para referenciar diretamente à exportação? Já pesquisei no arquivo “.properties” do displaytag e não vi referencia dessa.

Desde já agradeço.

[quote=solimar]Ola,

Alguém sabe como eu mostro as listas de radio button do struts 2 em colunas?

Tentei colocar,mas automaticamente ele já vem com um

e quebra a linha.

Eu tenho de colocar uma tabela como na primeira figura, mas com o struts eu consigo igual à segunda figura.

[/quote]

Você pode criar um template específico de acordo com a sua necessidade. Essa feature funciona muito bem.

Basta editar o template Freemarker referente a tag que vocês está utilizando e pronto.

http://struts.apache.org/2.x/docs/extending-themes.html

[quote=solimar]Boa tarde.

Eu estou com uma dúvida na exportação do displaytag para PDF.

Peguei um exemplo, conseguir colocar até uma figura para representar para qual extensão quero exportar.

o código é o seguinte:

<center><h1><s:text name="label.usuarios"/></h1></center>
	<s:url id="url" action="usuario" namespace="/manterUsuario" method="carregarIncluirUsuario" />
	<s:a href="%{url}"><s:text name="label.usuario.incluir"/></s:a>&nbsp;&nbsp;&nbsp;
	<s:set name="login" scope="session" value="login"/>
	<s:url id="url" action="usuario" namespace="/manterUsuario" method="paginaPrincipal"></s:url>
	<s:a href="%{url}"><s:text name="label.pagina.principal"/></s:a>
	<br><br>
<jsp:scriptlet> 
    	request.setAttribute( "listaUsuario", request.getAttribute("listaUsuario"));      
  	</jsp:scriptlet>
	<display:table name="listaUsuario" class="borderAll" pagesize="5" id="usu" requestURI="" export="true" >
		<display:setProperty name="export.pdf" value="true" />
		<display:setProperty name="export.excel" value="false"></display:setProperty>
		<display:setProperty name="export.csv" value="false"></display:setProperty>
		<display:setProperty name="export.xml" value="false"></display:setProperty>
		<display:column property="nome" title="Nome Usuario"/>
		<display:column property="senhaLogin" title="Senha Login"/>
		<display:column property="descricaoSexo" title="Descricao Sexo"/>
		<s:if test="perfis.size == 1">
			<display:column property="descricaoPerfil" title="Perfil"/>
		</s:if>
		<s:if test="perfis.size != 1">
			<display:column value="Mais de 1 perfil" title="Perfil"/>
		</s:if>
		<display:column property="dataNasc" title="Data de Nascimento"/>
		<display:column property="descricaoUF" title="UF"/>
		<display:column property="endereco" title="Endereço"/>
		<display:column property="telefone" title="Telefone"/>
		<display:column property="descricaoCurso" title="Curso"/>
		<display:column property="matricula" title="Matricula"/>
		<display:column class="nowrap" property="nomeLogin" href="usuario!carregarAlterarUsuario.action" title="Alterar" sortable="true" paramId="nomeLogin" paramProperty="nomeLogin" />
	</display:table>

Mas o link que é gerado para fazer a exportação é de um link utilizado dentro da pagina, chamando um outro método que não tem nada com exportação. Como faço para referenciar diretamente à exportação? Já pesquisei no arquivo “.properties” do displaytag e não vi referencia dessa.

Desde já agradeço.[/quote]

Não entendi muito bem o seu problema. A exportação é bem simples, não tem nada demais. Basta ativar a exportação e pronto. Ele gera o PDF automaticamente. Você quer fazer a geração do PDF através de um método que você criou ? Tente explicar melhor sua dúvida.

Eu ativei a exportação, mas ele não esta gerando o PDF!

Não estou querendo fazer através de método não. Mas quando passo o mouse por cima da figura para que ele gere o PDF, mostra um método que eu utilizo na jsp para outra funcionalidade (consultarUsuario).

Veja se estou certo na ativação da exportação:

Só quero o PDF.

<display:setProperty name="export.pdf" value="true" />
		<display:setProperty name="export.excel" value="false"></display:setProperty>
		<display:setProperty name="export.csv" value="false"></display:setProperty>
		<display:setProperty name="export.xml" value="false"></display:setProperty>

E no displaytag.properties fiz assim:

#Exportação das listas#
export.banner= <div class="exportlinks"><table width="100%" border="0" cellspacing="1" cellpadding="0"><tr class="titulo"><td colspan="0">Exportar: {0}</td></tr></table></div>
export.banner.sepchar=|
export.excel.label=<img src='../imgs/sisaviu/bt_excel.gif' alt='XLS' border='0'/>
export.csv.label=<img src='../imgs/sisaviu/bt_csv.gif' alt='CSV' border='0'/>
export.xml.label=<img src='../imgs/sisaviu/bt_xml.gif' alt='XML' border='0'/>
export.pdf.label=<img src='../imgs/sisaviu/bt_pdf.gif' alt='PDF' border='0'/>

Está certo? O que mais eu tenho de fazer?

Obrigado.

Sobre as tags do struts 2, eu já tinha procurado em todos os “src” de cada tag, mas não encontre no “ftl” do radiobutton as tags que geram o “

”. Encontrei o arquivo “radiomap.ftl” e o código que tem é esse:
<@s.iterator value="parameters.list">
    <#if parameters.listKey?exists>
        <#assign itemKey = stack.findValue(parameters.listKey)/>
    <#else>
        <#assign itemKey = stack.findValue('top')/>
    </#if>
    <#assign itemKeyStr = itemKey.toString() />
    <#if parameters.listValue?exists>
        <#assign itemValue = stack.findString(parameters.listValue)/>
    <#else>
        <#assign itemValue = stack.findString('top')/>
    </#if>
<input type="radio" name="${parameters.name?html}" id="${parameters.id?html}${itemKeyStr?html}"<#rt/>
<#if tag.contains(parameters.nameValue, itemKey)>
 checked="checked"<#rt/>
</#if>
<#if itemKey?exists>
 value="${itemKeyStr?html}"<#rt/>
</#if>
<#if parameters.disabled?default(false)>
 disabled="disabled"<#rt/>
</#if>
<#if parameters.tabindex?exists>
 tabindex="${parameters.tabindex?html}"<#rt/>
</#if>
<#if parameters.cssClass?exists>
 class="${parameters.cssClass?html}"<#rt/>
</#if>
<#if parameters.cssStyle?exists>
 style="${parameters.cssStyle?html}"<#rt/>
</#if>
<#if parameters.title?exists>
 title="${parameters.title?html}"<#rt/>
</#if>
<#include "/${parameters.templateDir}/simple/scripting-events.ftl" />
<#include "/${parameters.templateDir}/simple/common-attributes.ftl" />
/><#rt/>
<label for="${parameters.id?html}${itemKeyStr?html}"><#rt/>
    ${itemValue}<#t/>
</label>
</@s.iterator>

Realmente tentei modificar, mas não encontrei resultados.
Em outros arquivos “ftl”, como o checkboxlist.ftl tem as tags

, mas nesse ai não encontrei. Tentei fazer de outras formas, mas sem sucesso também.

Já me disseram que no JSF existe uma parametro especifico para isso, no Struts2 não tem não? E se não tiver, é nesse arquivo acima mesmo?

Muito obrigado pela ajuda!

O erro que está sendo gerado quando tento exportar para PDF é o seguinte:

o meu web.xml esta da seguinte forma:

[code]<?xml version="1.0" encoding="UTF-8"?>

ProjetoFinal

struts2

org.apache.struts2.dispatcher.FilterDispatcher



struts2
/*


javax.servlet.jsp.jstl.fmt.localizationContext
displaytag

<!-- Configuação do filtro de exportação da 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>
<filter-mapping>
  <filter-name>ResponseOverrideFilter</filter-name>
  <url-pattern>*.jsp</url-pattern>
</filter-mapping>


<!-- ======= -->

<!-- ================================================ -->
<servlet>
	<servlet-name>EmailServletConfig</servlet-name>
	<servlet-class>com.portaljava.support.mail.config.servlet.EmailSenderConfig</servlet-class>
	<!-- caso o nome do properties for diferente deste [ o diretório inicial considerado é /WEB-INF/classes ]
	<init-param>
		<param-name>config</param-name>
		<param-value>email.properties</param-value>
	</init-param> -->
	<load-on-startup>1</load-on-startup>
</servlet>
<!-- ================================================ -->
<listener>
	<listener-class>org.apache.tiles.listener.TilesListener</listener-class>
</listener>
<!-- ================================================ -->
<welcome-file-list>
	<welcome-file>/jsp/index.jsp</welcome-file>
</welcome-file-list>

[/code]

Se alguém puder me ajudar, agradeço

[quote=solimar]Sobre as tags do struts 2, eu já tinha procurado em todos os “src” de cada tag, mas não encontre no “ftl” do radiobutton as tags que geram o “

”. Encontrei o arquivo “radiomap.ftl” e o código que tem é esse:
<@s.iterator value="parameters.list">
    <#if parameters.listKey?exists>
        <#assign itemKey = stack.findValue(parameters.listKey)/>
    <#else>
        <#assign itemKey = stack.findValue('top')/>
    </#if>
    <#assign itemKeyStr = itemKey.toString() />
    <#if parameters.listValue?exists>
        <#assign itemValue = stack.findString(parameters.listValue)/>
    <#else>
        <#assign itemValue = stack.findString('top')/>
    </#if>
<input type="radio" name="${parameters.name?html}" id="${parameters.id?html}${itemKeyStr?html}"<#rt/>
<#if tag.contains(parameters.nameValue, itemKey)>
 checked="checked"<#rt/>
</#if>
<#if itemKey?exists>
 value="${itemKeyStr?html}"<#rt/>
</#if>
<#if parameters.disabled?default(false)>
 disabled="disabled"<#rt/>
</#if>
<#if parameters.tabindex?exists>
 tabindex="${parameters.tabindex?html}"<#rt/>
</#if>
<#if parameters.cssClass?exists>
 class="${parameters.cssClass?html}"<#rt/>
</#if>
<#if parameters.cssStyle?exists>
 style="${parameters.cssStyle?html}"<#rt/>
</#if>
<#if parameters.title?exists>
 title="${parameters.title?html}"<#rt/>
</#if>
<#include "/${parameters.templateDir}/simple/scripting-events.ftl" />
<#include "/${parameters.templateDir}/simple/common-attributes.ftl" />
/><#rt/>
<label for="${parameters.id?html}${itemKeyStr?html}"><#rt/>
    ${itemValue}<#t/>
</label>
</@s.iterator>

Realmente tentei modificar, mas não encontrei resultados.
Em outros arquivos “ftl”, como o checkboxlist.ftl tem as tags

, mas nesse ai não encontrei. Tentei fazer de outras formas, mas sem sucesso também.

Já me disseram que no JSF existe uma parametro especifico para isso, no Struts2 não tem não? E se não tiver, é nesse arquivo acima mesmo?

Muito obrigado pela ajuda![/quote]

Você fez o que te falei ? criou a template no src e a configurou no struts.xml ? Se você fizer isso, as alterações terão efeito.

[quote=solimar]O erro que está sendo gerado quando tento exportar para PDF é o seguinte:

o meu web.xml esta da seguinte forma:

[code]<?xml version="1.0" encoding="UTF-8"?>

ProjetoFinal

struts2

org.apache.struts2.dispatcher.FilterDispatcher



struts2
/*


javax.servlet.jsp.jstl.fmt.localizationContext
displaytag

<!-- Configuação do filtro de exportação da 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>
<filter-mapping>
  <filter-name>ResponseOverrideFilter</filter-name>
  <url-pattern>*.jsp</url-pattern>
</filter-mapping>


<!-- ======= -->

<!-- ================================================ -->
<servlet>
	<servlet-name>EmailServletConfig</servlet-name>
	<servlet-class>com.portaljava.support.mail.config.servlet.EmailSenderConfig</servlet-class>
	<!-- caso o nome do properties for diferente deste [ o diretório inicial considerado é /WEB-INF/classes ]
	<init-param>
		<param-name>config</param-name>
		<param-value>email.properties</param-value>
	</init-param> -->
	<load-on-startup>1</load-on-startup>
</servlet>
<!-- ================================================ -->
<listener>
	<listener-class>org.apache.tiles.listener.TilesListener</listener-class>
</listener>
<!-- ================================================ -->
<welcome-file-list>
	<welcome-file>/jsp/index.jsp</welcome-file>
</welcome-file-list>

[/code]

Se alguém puder me ajudar, agradeço[/quote]

http://www.javafree.org/javabb/viewtopic.jbb?t=862557
http://displaytag.sourceforge.net/10/export.html