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

vol*_*vox 1 jsf jsp 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">
Run Code Online (Sandbox Code Playgroud)

这应该是正常的,因为我正在使用的Mojarra 2.0.2FCS中有facelets.我似乎必须使用上面的语法而不是例如.<%@ 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".

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

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

    <fileset dir="${cliTomcatlib}">
        <include name="servlet-api.jar" />
        <include name="jsp-api.jar" />
    </fileset>
Run Code Online (Sandbox Code Playgroud)

所以我很难理解如何绕过这个错误.感觉这将是一个简单的修复,但因为我使用的最新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)
Run Code Online (Sandbox Code Playgroud)

我承认,除了堆栈跟踪的前几行重复这么多次,我不得不改变Eclipse上的控制台缓冲区.如果有人见过这个,我会满怀感激之情.

标记

Bal*_*usC 6

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

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"
Run Code Online (Sandbox Code Playgroud)

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

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

除了问题,Tomcat 6.0顺便说一下JSP 2.1,而不是JSP 2.0.

更新:StackOverflowErrorgetSession()表明在servlet /过滤器映射无限递归.你的FacesServlet映射怎么样?它应该被映射到听上url-pattern*.jsf,没有*.xhtml.否则它会递归调用自己.请查阅/参考JSF 2.0 书籍/教程/文档,了解如何正确配置它.