[VRaptor3] e JSR-286 (Portlets 2.0)

7 respostas
D

Olá,

Aparentemente o VRaptor não reconhece nativamente a especificação JSR-286 (Portlets 2.0)

Basicamente, no lado do servidor, o portlet é uma classe que estende de GenericPortlet, que é um HttpServlet…
Até aí tudo bem, mas o problema é que cada portlet deve ser declarado como um servlet no web.xml… e tenho que ficar trabalhando com request e response… além de nao ter suporte ao DI… ou seja, um saco.

Então eu estava pensando em criar um componente no VRaptor que encapsula este GenericPortlet, resolve as dependências e popula sozinho os atributos do método. Tipo transformar um portlet num Controller.

Alguém sabe por onde devo começar?

Abraços!

7 Respostas

Lucas_Cavalcanti

Não conheço essa especificação, mas se ela obriga o registro no web.xml não tem mto que se possa fazer…

o que vc pode fazer é um portlet que faz um dispatch pros controllers do VRaptor…

o que vc ganha usando o portlet?

[]'s

D

portlet é um pedacinho de um sistema web…
este pedacinho de sistema pode ser colocado em qualquer portlet container que implementa a especificação.

o que significa que partes do meu sistema podem estar dentro de outros sistemas.
este é o ganho de usar portlet.

essencial para um dashboard corporativo (ele tem varios pedaços de sistemas de vários sistemas diferentes)

ou seja, os meus portlets pode viver dentro do BEA Portal, ou o Portal da Oracle… ou de qualquer outro Portlet Container que implemente a JSR-286

A especificação nao obriga o registro no web.xml… é que como um portlet é um servlet, se nao usar framework nenhum, tem que registar o portlet (o servlet) no web.xml

acho que simplificando a minha dúvida seria:
Posso fazer um servlet comum (uma classe que estende HttpServlet) “se transformar” numa Controller do VRaptor? Com DI, popular sozinho os atributos, etc?

abraços!

Lucas_Cavalcanti

o problema é que não é o VRaptor que instanciaria a servlet/portlet, seria o portlet/servlet container…

o que dá pra tentar fazer é injeção por setter, field ou init method… mas daí a gente precisa conseguir capturar qual é o portlet que está servindo a requisição. Sabe se tem como fazer isso a partir de um Filter?

D

nao… nao da pra pegar a instancia do Servlet a partir de um Filter…

mas eu tava imaginando de outra forma:

  1. criar um único Servlet/Portlet (a tal classe que estende GenericPortlet) e mapeio no web.xml algo como /portlet/*
  2. pela URL da requisição (ex: /portlet/usuarios) eu instancio uma Controller do VRaptor que ta com o método mapeado com @Path(“usuarios”)
  3. coloco essa Controller no “contexto do VRaptor” pra ele tratar da DI, popular os parametros do request sozinho, dar suporte a Interceptor e etc…
  4. após terminar o método da Controller, o fluxo volta para o Servlet e eu pego o retorno do método da Controller (ou o Result) e coloco no request/response… e faço o dispatch para a JSP do portlet

é possivel fazer isso com o VRaptor?

abraços!

Lucas_Cavalcanti

vc pode simplesmente fazer um forward/requestDispatch pra url do VRaptor…

e vc pode prevenir que o vraptor chame a sua jsp padrão também

D

é verdade… nao pensei nisso…
mas nao ficaria mais lento? pois a requisição teria que passar inteira novamente pelo servidor web e pelo vraptor

como eu previno que o vraptor chame a jsp e volta o fluxo para meu servlet?

abraços!

Lucas_Cavalcanti

não ficaria tão mais lento, pq todo o processo seria no servidor, não teria outra requisição web.

pra prevenir que o vraptor chame a jsp vc pode criar um Interceptor simples:

@Intercepts(after=ExecuteMethodInterceptor.class, before=ForwardToDefaultViewInterceptor.class)
public class MyInterceptor implements Interceptor {

     accepts => true

    intercepts() {
         result.nothing();
         stack.next(..);
    }
}
Criado 22 de fevereiro de 2011
Ultima resposta 22 de fev. de 2011
Respostas 7
Participantes 2