2009-09-11 3 views
0

Я работаю над некоторыми компонентами пользовательского интерфейса, которые я бы хотел использовать полностью, вместо написания XHTML.JSF - показ страницы без xhtml

Я совершенно доволен XHTML; однако я хочу разбить все на модули, а также разбить физическое соединение между URL-адресом и файлом в WAR или файловой системе. Я также хочу, чтобы он был полностью виртуальным, чтобы у меня был больший контроль над безопасностью.

Можно ли это сделать с помощью сервлет-фильтра? Я использую Seam 2.2.0.GA и должен иметь доступ к FacesContext, что означает, что у меня будет доступ к компоненту UIViewRoot, а также к набору рендеринга.

Это последняя ошибка я получаю - я предполагаю, что я не мои компоненты правильно сконфигурированы:

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: NPE. Если вы создали экземпляр своего UIViewRoot, убедитесь, что вы правильно настроили его. Обычно это делается с помощью ViewHandler. См. Http://java.sun.com/javaee/5/docs/api/javax/faces/application/ViewHandler.html#calculateRenderKitId%28javax.faces.context.FacesContext%29 и т. Д. – McDowell

ответ

0

Вы можете определенно изменить дерево компонентов из фильтра. Другой способ состоит в том, чтобы создать часть страницы как jsf, а затем привязать к компоненту, такому как групповой макет панели &, собрать компоненты внутри него из управляемого компонента.

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

Физическое соединение между URL & файл уже нарушена. Вы можете использовать правило навигации, чтобы указать на все, что хотите. Не уверен, что вы подразумеваете под абсолютно виртуальным в отношении безопасности.

Это мое мнение, но динамический компонентный подход не такой расширяемый, как метаданные jsf &.

+0

Я согласен с вашими комментариями о расширяемости - для большинства моих страниц они вписываются в простой шаблон. Есть несколько страниц, которые уникальны, требуют некоторой навигации, но я не хочу обрабатывать те, у кого есть фильтр сервлетов, я позволю Seam/JSF выполнить эту работу. Я думаю, мой вопрос в том, что на самом деле делает ворчание в чтении в файле xhtml в war/filesystem? Как JSF знает, что входящий запрос соответствует определенному файлу, а затем обрабатывает его? – 2009-09-12 15:14:50

0

Возможно ли это сделать с помощью сервлет-фильтра? Я использую Seam 2.2.0.GA и должен иметь доступ к FacesContext, что означает, что у меня будет доступ к компоненту UIViewRoot, а также к набору рендеринга.

A Filter, вероятно, не является подходящим местом для этого. Если используется память, FacesContext настроен и снесен в FacesServlet в основном JSF (вы можете знать меня лучше, если Seam требует, чтобы другие сервлеты выполняли некоторый подъем жизненного цикла). Таким образом, контекст, вероятно, не будет доступен в фильтре.

Предоставление собственного ViewHandler декоратора, вероятно, будет лучше. Вы можете расширить ViewHandlerWrapper и дать ему конструктор, который украшает ViewHandler из рамки. Это можно определить в faces-config.xml. Более подробную информацию вы найдете в спецификации.

+0

На самом деле - я только что написал FacesFilter, который, кажется, работает. У меня нет отображаемых рендеектов, поэтому я получил исключение. Однако, похоже, он работает. Я по существу скопировал исходный код FacesServlet и модифицировал его для работы внутри фильтра.Кажется, что шов работает по этой схеме. – 2009-09-15 15:46:06

+0

Я проверил в ViewHandler ... – 2009-09-15 15:47:00

+0

Имейте в виду, что 'FacesContext' является локальным артефактом потока, поэтому, если вы создаете его, а затем переходите к' FacesServlet', он будет заменен при создании метода 'service' один. Я не уверен, что это приведет к каким-либо неопределенным поведением. Если вы решите все эти усилия, подумайте о том, чтобы просто заменить «FacesServlet» своей собственной реализацией. – McDowell

Смежные вопросы