2009-09-11 7 views
0

Je travaille sur certains composants d'interface utilisateur que je voudrais utiliser entièrement au lieu d'écrire le XHTML.JSF - servir une page sans xhtml

Je suis parfaitement satisfait de XHTML; cependant, je veux tout casser en modules aussi bien que rompre la connexion physique entre une URL et un fichier dans un WAR ou sur le système de fichiers. Je veux aussi qu'il soit entièrement virtuel pour avoir un meilleur contrôle de la sécurité. Est-il possible de faire cela en utilisant un filtre de servlet? J'utilise Seam 2.2.0.GA et devrait avoir accès au FacesContext ce qui signifie que j'aurai accès au composant UIViewRoot ainsi qu'au kit de rendu.

Ceci est la dernière erreur que je reçois - Je suppose que je n'ai pas mes composants correctement configurés:

java.lang.NullPointerException 
    at com.sun.faces.context.FacesContextImpl.getRenderKit(FacesContextImpl.java:258) 
    at com.sun.faces.renderkit.RenderKitUtils.getResponseStateManager(RenderKitUtils.java:237) 
    at com.sun.faces.lifecycle.LifecycleImpl.reload(LifecycleImpl.java:331) 
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:134) 
    at com.walterjwhite.seamCore.servlet.filter.FacesFilter.doFilter(FacesFilter.java:97) 
    at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) 
    at com.walterjwhite.webContent.servlet.filter.UploadedFileFilter.doFilter(UploadedFileFilter.java:97) 
    at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) 
    at com.walterjwhite.seamCore.servlet.filter.HttpRequestMonitoringFilter.doFilter(HttpRequestMonitoringFilter.java:59) 
    at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) 
    at org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:64) 
    at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) 
    at com.walterjwhite.seamCore.servlet.filter.ContextFilter$1.process(ContextFilter.java:60) 
    at org.jboss.seam.servlet.ContextualHttpServletRequest.run(ContextualHttpServletRequest.java:53) 
    at com.walterjwhite.seamCore.servlet.filter.ContextFilter.doFilter(ContextFilter.java:55) 
    at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) 
    at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:73) 
    at org.jboss.seam.web.HotDeployFilter.doFilter(HotDeployFilter.java:53) 
    at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) 
    at org.jboss.seam.web.LoggingFilter.doFilter(LoggingFilter.java:60) 
    at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) 
    at org.jboss.seam.servlet.SeamFilter.doFilter(SeamFilter.java:158) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1139) 
    at com.walterjwhite.seamCore.servlet.filter.DisableUrlSessionFilter.doFilter(DisableUrlSessionFilter.java:82) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1139) 
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:378) 
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181) 
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:417) 
    at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230) 
    at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at org.mortbay.jetty.Server.handle(Server.java:324) 
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:535) 
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:865) 
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:539) 
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212) 
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409) 
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:520) 

Walter

+0

RE: le NPE. Si vous instanciez votre propre UIViewRoot, assurez-vous de le configurer correctement. Cela est généralement fait par ViewHandler. Voir http://java.sun.com/javaee/5/docs/api/javax/faces/application/ViewHandler.html#calculateRenderKitId%28javax.faces.context.FacesContext%29 etc. – McDowell

Répondre

0

Vous pouvez modifier définitivement l'arborescence des composants d'un filtre. Une autre technique consiste à créer une partie de la page en tant que jsf, puis à lier à un composant tel qu'un modèle de groupe de panneaux & pour créer les composants à l'intérieur d'un bean géré.

UIComponent parent = ... 
for(...) { 
    parent.getChildren().add(...); 
} 

La connexion physique entre le fichier URL & est déjà cassé. Vous pouvez utiliser une règle de navigation pour pointer sur tout ce que vous voulez. Je ne sais pas ce que vous entendez par entièrement virtuel concernant la sécurité.

C'est juste mon opinion, mais une approche de composant dynamique n'est pas aussi extensible que jsf & metadata. Est-il possible de le faire en utilisant un filtre de servlet?

+0

Je suis d'accord avec votre commentaire sur l'extensibilité - Pour la plupart de mes pages, ils s'inscrivent dans un modèle simple. Il y a quelques pages qui sont uniques, nécessitent une certaine navigation, mais je ne veux pas gérer celles avec mon filtre de servlet, je vais laisser Seam/JSF faire le travail. Je suppose que ma question est, qu'est-ce que le grunt fonctionne réellement dans la lecture dans le fichier xhtml dans le war/filesystem? Comment JSF sait-il qu'une requête entrante correspond à un fichier particulier et le traite ensuite? –

0

J'utilise Seam 2.2.0.GA et devrait avoir accès au FacesContext ce qui signifie que j'aurai accès au composant UIViewRoot ainsi qu'au kit de rendu.

Un Filter n'est probablement pas un bon endroit pour le faire. Si la mémoire est bonne, le FacesContext est configuré et détruit dans le FacesServlet dans le noyau JSF (vous savez peut-être mieux que moi si Seam a besoin d'autres servlets pour faire un peu de lifecycle). Ainsi, le contexte ne sera probablement pas dans la portée du filtre. Offrir votre propre décorateur ViewHandler serait probablement un meilleur pari. Vous pouvez étendre ViewHandlerWrapper et lui donner un constructeur qui prend le ViewHandler décoré du cadre. Cela peut être défini dans votre faces-config.xml. Vous trouverez plus de détails dans la spécification.

+0

En fait, je viens d'écrire un FacesFilter qui semble fonctionner. Je n'ai pas mes renderkits mappés donc j'ai l'exception là-bas. Cependant, cela semble fonctionner. J'ai essentiellement copié le code source de FacesServlet et l'ai modifié pour fonctionner à l'intérieur d'un filtre.Seam semble également fonctionner sous ce schéma. –

+0

Je vais vérifier dans le ViewHandler ... –

+0

Sachez que le 'FacesContext' est un artefact local-thread, donc si vous en créez un, puis le transférez à' FacesServlet', il sera remplacé quand la méthode 'service' créera un. Je ne suis pas sûr si cela entraînerait un comportement indéfini. Si vous allez à tous ces efforts, pensez à remplacer le 'FacesServlet' avec votre propre implémentation. – McDowell

Questions connexes