Vraptor3 + displaytag

Oi.

Toda vez que mudo a página, o parâmetro que indica a página (d-6891346-p) não está sendo preenchido na variável “page” do controller. Está vindo sempre NULL. Preciso dessa variável para fazer paginação por demanda. Pra quem não sabe, este parâmetro é gerado automaticamente pelo displaytag e é algo neste formato: “d-codigodoidoqualquer-b”. Ex: “d-6891346-p”.

Então, eu mapeei o método do controller da seguinte maneira:

	@Get
	@Path("/montador/pesquisa/")
	public void pesquisar(@Named("montador") Montador montadores, @Named("d-6891346-p") Integer page) {
		System.out.println(page);
	        //usei a annotation @Named("montador") soh pra ver se funfava e funfou....
	}

jsp:

  <display:table htmlId="montadorList" name="montadorList" id="montadorList"   
      pagesize="20" requestURI="/montador/pesquisa/" >
    <display:column property="id" title="codigo"/>
    <display:column property="cpf" title="cpf"/>
    <display:column property="nome" title="nome"/>
  </display:table>[/code]



No console lança a seguinte exception:
[code]08:15:33,754 INFO  [STDOUT] 08:15:33,753 DEBUG [OgnlParametersProvider] unable to parse expression 'd-6891346-p'
ognl.InappropriateExpressionException: Inappropriate OGNL expression: (d - 6891346) - p
	at ognl.SimpleNode.setValueBody(SimpleNode.java:312)
	at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220)
	at ognl.SimpleNode.setValue(SimpleNode.java:279)
	at ognl.Ognl.setValue(Ognl.java:737)
	at ognl.Ognl.setValue(Ognl.java:783)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createViaOgnl(OgnlParametersProvider.java:132)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createRoot(OgnlParametersProvider.java:108)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.getParametersFor(OgnlParametersProvider.java:90)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.getParametersFor(ParametersInstantiatorInterceptor.java:104)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:77)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
	at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.indados.inguard.interceptor.ControleAcessoInterceptor.intercept(ControleAcessoInterceptor.java:81)
	at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.indados.mvmontagem.web.NoCacheInterceptor.intercept(NoCacheInterceptor.java:47)
	at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:81)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129)
	at com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
	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:173)
	at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:182)
	at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
	at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:241)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Thread.java:619)

Alguém poderia me ajudar ??

baco, vc experimentou colocar o argumento “page” como String pra ver se pega o valor do displayTag?

nao sei se funciona expressão regular, tipo: “d-/*/-p”, tentou isso?

alabe… nao funcionou desse jeito…

o que vc precisa pra pegar os parâmetros do displaytag é isso:
http://displaytag.sourceforge.net/11/tut_externalSortAndPage.html

o que vc pode fazer pra enganar o VRaptor é criar esse interceptor e annotation:

se algo não funcionar me avisa, que eu mudo o gist

Cara ! Funcionou! Valeu… só tem um porem… continua lançando a exception no console!

E tem que mudar de:

[code] String tableId = method.getMethod().getAnnotation(DisplayTag.java).value();

    String sortParam = new ParamEncoder(tableId).encodeParameterName(TableTagParameters.PARAMETER_SORT));
    String orderParam = new ParamEncoder(tableId).encodeParameterName(TableTagParameters.PARAMETER_ORDER));
    String pageParam = new ParamEncoder(tableId).encodeParameterName(TableTagParameters.PARAMETER_PAGE));

[/code]

Para:

[code] String tableId = method.getMethod().getAnnotation(DisplayTag.class).value();

    String sortParam = new ParamEncoder(tableId).encodeParameterName(TableTagParameters.PARAMETER_SORT);
    String orderParam = new ParamEncoder(tableId).encodeParameterName(TableTagParameters.PARAMETER_ORDER);
    String pageParam = new ParamEncoder(tableId).encodeParameterName(TableTagParameters.PARAMETER_PAGE);[/code]

Mas valeu ai champz! Se tiver tirar esta exception do console, depois você posta aqui!

Valeu!!

pra tirar essa exception só tirando (ou diminuindo) o log do vraptor… vc pode ignorar sem problemas… se eu não me engano na última versão do vraptor esse log está como debug, então é só setar o log do VRaptor como info

bacofrb gotaria de ver os fontes ! é possível ?

web2ajax@gmail.com

Obrigado !

jr

[quote=Lucas Cavalcanti]o que vc precisa pra pegar os parâmetros do displaytag é isso:
http://displaytag.sourceforge.net/11/tut_externalSortAndPage.html

o que vc pode fazer pra enganar o VRaptor é criar esse interceptor e annotation:

se algo não funcionar me avisa, que eu mudo o gist[/quote]]]

Boa noite , esta maneira de trabalhar com paginação ainda funciona para a versão atual do Vraptor (3.4) ? Usar o displaytag ainda é indicado , ou surgiu alguma outra maneira mais eficiente para isto ? Eu já ví e gostei do Gridy do Washington Botelho , funciona muito bem , mas fico meio receoso pois queria usar uma solução mais genérica para grid.

deveria funcionar ainda.

tenta ver algum plugin do jQuery, por exemplo o datatables.net

[quote=Lucas Cavalcanti]deveria funcionar ainda.

tenta ver algum plugin do jQuery, por exemplo o datatables.net

[/quote]
Achei muito interessante e pratico o datatables . Fiz um teste com uma listagem já pronta e ele já funciona paginação , ordenação , e pesquisa praticamente sem trabalho nenhum.Como esta minha listagem esta vindo de um LoadAll , a unica coisa que ele faz e dividir os dados em páginas , eu terei que mudar isto para não ficar pesado ?

se forem muitos dados talvez seja bom mudar… se não forem tantos, é mais simples não se preocupar em dividir :wink:

[quote=Lucas Cavalcanti]se forem muitos dados talvez seja bom mudar… se não forem tantos, é mais simples não se preocupar em dividir ;)[/quote] Mas para fazer um carregamento dinamico eu terei que parar de usar o datatables , ou tem como implementar nele ? Aquele método maxresult do hibernate não se aplicaria aqui não né ?

tem como implementar tb… vc só precisa montar uma tabela, e mandar o datatables se aplicar nessa tabela… isso não precisa ser no load da página, pode ser depois.

Fiz as implementações comentadas aqui, entretanto não funcionou

O controller está assim

@DisplayTag("CE_HORA_ESTUDO")
    public void list(Integer sort, Integer order, Integer page) {
		boolean existeCiclo = result.included().containsKey("ciclo");
		if (!existeCiclo) {
			Collection<Ciclo> ciclos = cicloDAO.ativosByUser(userSession.getUser());
			for (Ciclo c : ciclos) {
				result.include("ciclo",ciclos.iterator().next());
			}
		}
    }
	
	@Path("/horaEstudo/list/{ciclo.id}")
	public Collection<HoraEstudo> list(Ciclo ciclo) {

A view está assim

<display:table id="horaEstudo" name="${horaEstudoList}" class="dataTable" defaultsort="2" defaultorder="descending" pagesize="20" export="false" style="width: 600px" 
	requestURI="list/${ciclo.id}">

mas quando executo o link da página 2 fica assim
http://localhost:8080/ControleEstudos/horaEstudo/list/7?sort=&order=&page=&d-2520922-p=2

Alguém sabe o que pode ser?

Eu tenho uma implementação do Displaytag que funciona muito bem, mas ela está dentro de um aplicativo meu.

Estou extraindo para um “plugin” do VRaptor.

Ainda não consegui passar tudo, mas basicamente você recebe uma interface por injeção de dependencia na sua controladora e ela contém toda a informação sobre a paginação.

O projeto ta no github e assim que eu tiver uma versão funcionando eu aviso aqui, caso alguém tenha interesse: https://github.com/nykolaslima/vraptor-plugin-pagination