【问题标题】:Tomcat 6 JSF/JSP filename configuration problemTomcat 6 JSF/JSP 文件名配置问题
【发布时间】:2010-03-05 12:57:36
【问题描述】:

我有一个从 Eclipse Ganymede 通过 Tomcat 6 部署的 JSF 应用程序。后者建议使用 JSP 2.0。我正在使用 Sun RI JSF 实现和 RichFaces 3.3.2SR1。

我的 index.jsp 文件应浏览器的请求导致控制台出现此错误:

05-Mar-2010 12:04:41 org.apache.catalina.core.ApplicationDispatcher invoke SEVERE: Servlet.service() for servlet jsp threw exception org.apache.jasper.JasperException: /index.jsp(35,41) #{..} is not allowed in template text ...

好的,我看过关于这个主题的各种其他帖子,包括各种 jars/taglibs/syntaxes 版本的不兼容等。

使用http://localhost:8989/myapp/index.jsf(或.jsp - 给出相同的错误)调用index.jsp,并包含

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:a4j="http://richfaces.org/a4j"
    xmlns:rich="http://richfaces.org/rich">

应该没问题,因为 facelets 在我正在使用的 Mojarra 2.0.2FCS 中。我似乎必须使用上述语法而不是例如。 &lt;%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%&gt; 作为 facelets URI 导致 Eclipse 说 Cannot find the tag library descriptor for "http://java.sun.com/jsf/facelets"

我的问题与我列出这些标签的方式有关吗?

我的 Ant 构建文件引用了这些 Tomcat jar:

    <fileset dir="${cliTomcatlib}">
        <include name="servlet-api.jar" />
        <include name="jsp-api.jar" />
    </fileset>

所以我很困惑如何绕过这个错误。感觉这将是一个简单的修复,但是当我使用应该与 JSP 2.0 兼容的最新 jar 时,我想知道为什么会出现这个错误。 JSF

编辑 针对BalusC的智慧,我更正了对外部jsp文件的两个引用,并将所有.jsp重命名为.xhtml。我记得也更新了我的faces-config.xml

当像这样请求index.xhtml 时,现在重新部署错误并出现大量重复错误:

05-Mar-2010 13:29:26 org.apache.catalina.core.ApplicationDispatcher invoke
SEVERE: Servlet.service() for servlet Faces Servlet threw exception
java.lang.StackOverflowError
    at org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:824)
    at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:216)
    at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:544)
...
    at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:216)
    at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:544)
    at com.sun.faces.context.ExternalContextImpl.getSession(ExternalContextImpl.java:151)
    at javax.faces.application.ViewHandler.calculateCharacterEncoding(ViewHandler.java:242)
    at javax.faces.application.ViewHandler.initView(ViewHandler.java:458)
    at com.sun.faces.application.view.MultiViewHandler.initView(MultiViewHandler.java:106)
    at org.ajax4jsf.application.ViewHandlerWrapper.initView(ViewHandlerWrapper.java:128)
    at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:109)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)

我承认这不是很有启发性,除了堆栈跟踪的前几行重复了很多次,我不得不在 Eclipse 上更改控制台缓冲区。如果有人以前看过这个,我会感激不尽。

标记

【问题讨论】:

    标签: jsp jsf tomcat6


    【解决方案1】:
    org.apache.jasper.JasperException: /index.jsp(35,41) #{..} is not allowed in template text 
    

    在 JSP 的模板文本中确实不允许使用统一 EL。它只允许在 Facelets 中使用。

    使用 http://localhost:8989/myapp/index.jsf 调用 index.jsp(或 .jsp - 给出相同的错误)并包含

    <ui:composition xmlns="http://www.w3.org/1999/xhtml"
         xmlns:ui="http://java.sun.com/jsf/facelets"
    

    您将 JSP 与 Facelets 混为一谈。你可以也不应该那样做。这是两种不同的视图技术。使用其中之一。 JSP 用于&lt;%@taglib %&gt; 的东西,而Facelets 是面向XHTML 的&lt;html xmlns&gt;&lt;ui:xxx&gt; 的东西。对于 JSF 2.0,您应该使用 Facelets。将所有文件从 *.jsp 重命名为 *.xhtml 并替换并删除任何 &lt;% %&gt;&lt;jsp:xxx&gt; 内容。

    要了解有关 Facelets 的更多信息,请从Java EE 6 tutorial part II chapter 5 开始。如果您想在 JSF 2.0 中退回到古老的 JSP 而不是 Facelets,那么您需要重新配置 JSF 中的视图处理程序。

    除了这个问题,顺便说一句,Tomcat 6.0 是 JSP 2.1,而不是 JSP 2.0。

    更新:getSession() 上的 StackOverflowError 表示 servlet/过滤器映射中的无限递归。您的FacesServlet 是如何映射的?它应该被映射为监听*.jsfurl-pattern,而不是*.xhtml。否则它将递归调用自身。请仔细参考/参考 JSF 2.0 books/tutorials/documentation 如何正确配置。

    【讨论】:

    • BalusC,请参阅我的问题更新。感谢您对此的帮助。
    • 这个答案的关键词是“咨询”、“文档”、“配置”和“正确”。感谢 BalusC 的掌声。
    【解决方案2】:

    将 JSF impl jar 添加到 Tomcat 的库或您的应用库中,然后重试。
    请参阅this 了解更多信息。

    【讨论】:

    • Tomcat 不附带任何 JSF impl(除非 OP 确实不必要地将它们放在那里)。
    • 感谢您的指出。我主要使用 GlassFish 和 JBoss。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 2010-12-05
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    相关资源
    最近更新 更多