2

我在 Eclipse IDE 中使用 JBoss4.2。当我hellojsf使用 JSP 视图技术运行程序时,它运行良好。当我尝试使用相同组件的 Facelets 时,出现以下异常:

2012-06-20 12:41:30,941 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/HelloJSF].[Faces Servlet]] Servlet.service() for servlet Faces Servlet threw exception
java.lang.StackOverflowError
    at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:216)
    at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:545)
    at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:216)
    at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:545)
    at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:216)
    at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:545)

这是如何引起的,我该如何解决?

4

1 回答 1

3

FacesServlet在无限循环中运行。如果您使用旧的 JSF 1.2 而不是新的 JSF 2.x 并且没有正确配置 JSF 以使用 XHTML 而不是 JSP,则可能会发生这种情况。JSF 1.2 不支持 Facelets,而 JSF 2.x 捆绑了 Facelets。

如果升级到 JSF 2.0 不是一个选项(JBoss 4.2 作为 Servlet 2.5 兼容的容器应该支持它),那么您需要单独安装 Facelets 1.x。下载jsf-facelets-1.1.15.jar并将其放入/WEB-INF/lib并编辑web.xml以告诉 JSF.xhtml用作默认后缀。

<context-param>
    <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
    <param-value>.xhtml</param-value>
</context-param>

FacesServlet映射 URL 模式不能是,这*.xhtml会导致它在无限循环中运行。就留着吧*.jsf

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

此外不要忘记在faces-config.xml.

<application>
    <view-handler>com.sun.facelets.FaceletViewHandler</view-handler>    
</application> 

现在您可以像打开 JSP 文件一样使用通常的方式打开 Facelets 文件http://localhost:8080/context/page.jsf,唯一的区别是您应该有一个page.xhtml文件而不是page.jsp.

使用 JSF 2.x 时,不需要上下文参数和视图处理程序,因为它们已经是 JSF 2.x 的默认值。此外,在使用 JSF 2.x 时,可以安全地将 URL 模式设置为*.xhtml.

也可以看看:

于 2012-06-20T14:04:15.910 回答