Tomcat 6 JSF / JSP文件名配置问题

时间:2010-03-05 12:57:36

标签: jsp jsf tomcat6

我有一个从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 ...

好的,我已经看过关于这个主题的各种其他帖子,包括各种jar / 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">

这应该是好的,因为facem在我正在使用的Mojarra 2.0.2FCS中。我似乎必须使用上面的语法而不是例如。 <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>因为facelets URI导致Eclipse说Cannot find the tag library descriptor for "http://java.sun.com/jsf/facelets"

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

My Ant构建文件引用这些Tomcat jar:

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

所以我很难过如何绕过这个错误。感觉这将是一个简单的修复,但因为我使用的最新jar应该与JSP 2.0兼容,我想知道为什么我会收到此错误。 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上的控制台缓冲区。如果有人以前见过这个,我会感激不尽。

标记

2 个答案:

答案 0 :(得分:6)

org.apache.jasper.JasperException: /index.jsp(35,41) #{..} is not allowed in template text 

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

  

使用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"

您正在将JSP与Facelets混合在一起。你可以而且不应该那样做。这是两种截然不同的视图技术。使用其中一个。 JSP用于<%@taglib %>内容,Facelets是面向XHTML的,具有<html xmlns><ui:xxx>内容。对于JSF 2.0,你应该使用Facelets。将所有文件重命名为*.jsp*.xhtml,并替换并删除所有<% %><jsp:xxx>内容。

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

除了之外,Tomcat 6.0就是JSP 2.1,而不是JSP 2.0。

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

答案 1 :(得分:0)

将JSF impl jar添加到Tomcat的lib或app lib中,然后重试 有关详情,请参阅this