【问题标题】:jsf sevlet-mapping for *.jsp*.jsp 的 jsf sevlet 映射
【发布时间】:2011-03-24 07:18:18
【问题描述】:

有没有一种方法可以告诉我的应用程序让每个页面(比如 .jsp 页面)进入 faces 上下文?

在我的web.xml 中,我可以轻松地进行类似于以下的 servlet 映射:

<servlet-mapping>
   <servlet-name>Faces Servlet</servlet-name>
   <url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
   <servlet-name>Faces Servlet</servlet-name>
   <url-pattern>*.jsf</url-pattern>
</servlet-mapping>

我可以在其中映射每个 url,包括 /faces/ 虚拟路径或以 .jsf 结尾,以由代表 jsf 引擎的 servlet 处理。

但是如果我希望我的应用程序中的所有内容都在 faces 上下文中呢? 我尝试添加:

<servlet-mapping>
   <servlet-name>Faces Servlet</servlet-name>
   <url-pattern>*.jsp</url-pattern>
</servlet-mapping>

但似乎应用程序立即崩溃:

NAQ Exception in PhaseListener RESTORE_VIEW(1) afterPhase
java.lang.NullPointerException
 at net.sf.jsfcomp.clientvalidators.ValidatorResourceLoader.afterPhase(Unknown Source)
 at org.apache.myfaces.lifecycle.PhaseListenerManager.informPhaseListenersAfter(PhaseListenerManager.java:92)
 at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:99)
 at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:70)
 at javax.faces.webapp.FacesServlet.service(FacesServlet.java:139)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
 at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:691)
 at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:469)
 at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:403)
 at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)
 at org.apache.myfaces.context.servlet.ServletExternalContextImpl.dispatch(ServletExternalContextImpl.java:419)
 at org.apache.myfaces.application.jsp.JspViewHandlerImpl.renderView(JspViewHandlerImpl.java:211)
 at it.asg.utility.viewhandlers.UrlParameterViewHandler.renderView(UrlParameterViewHandler.java:116)
 at org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:41)
 at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:132)
 at javax.faces.webapp.FacesServlet.service(FacesServlet.java:140)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
 at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:691)
 at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:469)
 at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:403)
 at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)
 at org.apache.myfaces.context.servlet.ServletExternalContextImpl.dispatch(ServletExternalContextImpl.java:419)
 at org.apache.myfaces.application.jsp.JspViewHandlerImpl.renderView(JspViewHandlerImpl.java:211)
 at it.asg.utility.viewhandlers.UrlParameterViewHandler.renderView(UrlParameterViewHandler.java:116)
 at org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:41)
 at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:132)
 at javax.faces.webapp.FacesServlet.service(FacesServlet.java:140)

怎么了?有没有办法让面孔上下文适用于我的应用程序中的每个页面?

【问题讨论】:

    标签: jsf servlet-filters contextpath


    【解决方案1】:

    这是不可能的,因为 *.jsp 将由 servletcontainer 的内置 JspServlet 解析。

    理论上您可以使用/* 中的url-pattern。

    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
    

    这在实践中是行不通的(FacesServlet 不允许),它只会给不需要经历整个 JSF 生命周期的请求增加不必要的开销。

    尽量不要思考/寻找艰难/繁琐的方式。只需使用*.jsf 并在必要时在*.jsp 上添加安全约束以阻止直接访问JSP,正如我在previous question 中所建议的那样。这是常见的做法。

    或者,您也可以从 JSP 升级到基于 XHTML/XML 的 Facelets。这样您就可以使用*.xhtml 甚至*.html 作为Facelets 后缀和FacesServlet 映射。

    【讨论】:

    • 问题是我正在处理一个现有项目,多年来制作,有数千个指向实际上是 jsf 页面的 jsp 页面的链接,我正在寻找一种方法来避免运行 trought所有项目(jsp、jsf、javascript、html、java bean、数据库表)并使用“.jsf”后缀修改 url。不过似乎没有其他解决方案:(
    • 很多不错的文本编辑器都有“在所有文件中查找和替换”选项。
    猜你喜欢
    • 2012-03-22
    • 2014-08-05
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    • 2012-10-17
    • 2022-11-28
    • 1970-01-01
    相关资源
    最近更新 更多