2010-03-05 67 views
1

我有一個通過Tomcat 6從Eclipse Ganymede部署的JSF應用程序。後者提出了JSP 2.0。我正在使用Sun RI JSF實現和RichFaces 3.3.2SR1。Tomcat 6 JSF/JSP文件名配置問題

從瀏覽器請求我的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 ...

OK,我已經看到了其他各種職位,包括版本的不兼容性各個罐/標籤庫/語法等

中的index.jsp使用http://localhost:8989/myapp/index.jsf稱爲(或.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。我似乎不得不使用上述語法而不是例如。作爲facelets URI的<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>導致Eclipse說Cannot find the tag library descriptor for "http://java.sun.com/jsf/facelets"

我的問題是與我列出這些標籤的方式有關嗎?

我的Ant構建文件是指這些Tomcat的罐子:

<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) 

這點我承認不低於堆棧跟蹤的前幾行非常illuminatory其他重複這麼多次我不得不改變Eclipse上的控制檯緩衝區。如果有人曾經見過,我會感激不盡。

馬克

回答

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

統一EL的確不是在JSP模板文本允許的。它只允許在Facelets中使用。

中的index.jsp使用http://localhost:8989/myapp/index.jsf叫(或.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。

更新:StackOverflowErrorgetSession()表示servlet /過濾器映射中的無限遞歸。你的FacesServlet如何映射?它應該映射到*.jsfurl-pattern,而不是*.xhtml。否則它會遞歸地調用它自己。請仔細諮詢/參考JSF 2.0 books/tutorials/documentation如何正確配置它。

+0

BalusC,看到我的問題更新。感謝您的幫助。 – volvox 2010-03-05 13:30:39

+1

答案中的關鍵詞是'諮詢','文件','配置'和'正確'。感謝BalusC爲巴掌。 – volvox 2010-03-06 10:38:31

0

加入JSF IMPL罐子到Tomcat的lib或您的應用程序的lib,然後再試一次。
有關更多信息,請參見this

+0

Tomcat不附帶任何JSF impl(除非OP不必要地將它們放在那裏,的確如此)。 – BalusC 2010-03-05 13:02:05

+0

謝謝指出。我主要與GlassFish和JBoss合作。 – Padmarag 2010-03-05 13:03:12