2011-07-15 32 views
1

我遇到了一些JSF的問題。 。延期的EL沒有得到解決

它看起來像遞延評價(如#{bean.property}沒有得到解決的立即評估(如${bean.property})似乎做工精細

以下JSF頁面:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1-strict.dtd"> 
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> 
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%> 
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%> 
<f:view> 
<html> 
<head> 
    <title>Hello World</title> 
</head> 
<body> 
    <h:form> 
    ${nameBean.name} 
    #{nameBean.name} 
    <h:outputText value="#{nameBean.name}"/> 
    </h:form> 
</body> 
</html> 
</f:view> 

我的web.xml看起來是這樣的:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 
    <display-name>JSF Test</display-name> 
    <context-param> 
    <param-name>javax.faces.CONFIG_FILES</param-name> 
    <param-value>/WEB-INF/faces-config.xml</param-value> 
    </context-param> 
    <context-param> 
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name> 
    <param-value>server</param-value> 
    </context-param> 
    <filter> 
    <display-name>Ajax4jsf Filter</display-name> 
    <filter-name>ajax4jsf</filter-name> 
    <filter-class>org.ajax4jsf.Filter</filter-class> 
    </filter> 
    <filter-mapping> 
    <filter-name>ajax4jsf</filter-name> 
    <servlet-name>Faces Servlet</servlet-name> 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>FORWARD</dispatcher> 
    <dispatcher>INCLUDE</dispatcher> 
    <dispatcher>ERROR</dispatcher> 
    </filter-mapping> 
    <servlet> 
    <servlet-name>Faces Servlet</servlet-name> 
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>Faces Servlet</servlet-name> 
    <url-pattern>*.faces</url-pattern> 
    </servlet-mapping> 
    <login-config> 
    <auth-method>BASIC</auth-method> 
    </login-config> 
    <welcome-file-list> 
    <welcome-file>index.jsp</welcome-file> 
    </welcome-file-list> 
</web-app> 

用下面的Maven依賴:

<dependency> 
    <groupId>jstl</groupId> 
    <artifactId>jstl</artifactId> 
    <version>1.2</version> 
</dependency> 
<dependency> 
    <groupId>javax.faces</groupId> 
    <artifactId>jsf-api</artifactId> 
    <version>1.2_12</version> 
</dependency> 
<dependency> 
    <groupId>javax.faces</groupId> 
    <artifactId>jsf-impl</artifactId> 
    <version>1.2_12</version> 
</dependency> 
<dependency> 
    <groupId>com.sun.facelets</groupId> 
    <artifactId>jsf-facelets</artifactId> 
    <version>1.1.14</version> 
</dependency> 

轉換爲包含HTML頁面:

NameInBean 
#{nameBean.name} 
#{nameBean.name} 

我可能錯誤地配置了一些東西,但我不知道去哪裏找。有人能幫我嗎?

回答

1

我重新安裝了Tomcat服務器並修改了POM .xml到:

<dependency> 
    <groupId>org.apache.myfaces.core</groupId> 
    <artifactId>myfaces-api</artifactId> 
    <version>1.2.2</version> 
    <scope>compile</scope> 
</dependency> 
<dependency> 
    <groupId>org.apache.myfaces.core</groupId> 
    <artifactId>myfaces-impl</artifactId> 
    <version>1.2.2</version> 
    <scope>compile</scope> 
</dependency> 
<dependency> 
    <groupId>org.apache.myfaces.tomahawk</groupId> 
    <artifactId>tomahawk</artifactId> 
    <version>1.1.6</version> 
    <scope>runtime</scope>  
    <exclusions> 
    <exclusion> 
     <groupId>javax.servlet</groupId> 
     <artifactId>jstl</artifactId> 
    </exclusion> 
    </exclusions>  
</dependency> 
<dependency> 
    <groupId>jstl</groupId> 
    <artifactId>jstl</artifactId> 
    <version>1.2</version> 
    <scope>runtime</scope> 
</dependency> 
<dependency> 
    <groupId>com.sun.facelets</groupId> 
    <artifactId>jsf-facelets</artifactId> 
    <version>1.1.11</version> 
</dependency> 

現在代碼有效。

0

我不完全確定,但您需要將#{nameBean.name}放入JSF組件。嘗試使用<h:outputText value="#{nameBean.name}"/>

a java.net article在統一表達式語言:

遞延評價意味着使用統一EL技術接管評價從JSP引擎的表達的責任,並在在合適的時間計算表達式頁面生命週期。 EL從JSP容器獲取控制權,以便在適當的時候評估表達式。 JSF EL表達式的格式爲#{defExpr}。 JSF表達式以這種方式工作。

這意味着JSF負責評估延遲表達式,並且只有將它們添加到JSF組件時它纔會識別它們。即時表達式仍然有效意味着在JSF完成了呈現響應階段之後,servlet/JSP引擎接管並評估這些表達式。因此,你甚至可以使用延遲的表達式生成即時表達式(雖然沒有經過測試)。

+0

不幸的是,讓我相同的輸出:'#{nameBean.name}',而不是'NameInBean' – Jasper

+0

你在聲明'nameBean' '面孔,config.xml'? – Thomas

+0

是的,我做了,'$ {nameBean.name}'從bean中檢索正確的名字。其他兩個選項都沒有。 – Jasper

0

你不關閉f:view-Tag - 也許這可能是問題?順便說一句。不應該遵循html標籤嗎?

+0

複製/粘貼時發生錯誤,我修復了代碼示例。 – Jasper

1

這讓我覺得很奇怪,您正在編寫JSP,但包含Facelets庫(這是JSF的更好的視圖技術)。

Facelets允許評估模板文本中的#{}語法。在JSP中


遞延EL表達式只允許在支持它們的屬性標籤(通常是JavaServer Faces組件,但它是可以編寫自己的自定義標籤庫來支持他們)。

JSP 2.2 spec

只有${}的語法允許在模板的文本表述。如果在模板文本中使用#{},將會產生翻譯 錯誤,除非通過 向後兼容性機制關閉#{}

既然你不使用deferredSyntaxAllowedAsLiteral頁面指令,並沒有得到一個錯誤,我猜你的web.xml定義版本,默認爲JSP 2.0或以上規則,你是不是通過FacesServlet映射處理頁面。

  • 檢查你的web.xml版本(說出你的目標服務器,版本,如果你需要更多的信息)
  • 檢查URL使用FacesServlet mapping
+0

我已將我的web.xml添加到原始帖子。我可以通過以下URL訪問我的頁面:'http:// localhost:8080/webproject/getName.faces'。 – Jasper

+0

@Psy - 我沒有看到任何明顯的web.xml問題。你正在測試什麼應用服務器/版本? – McDowell

+0

我在[Tomcat 6.0]上運行它(http://tomcat.apache.org/tomcat-6.0-doc/index.html)。 – Jasper

0

您必須使用Servlet API 2.5或更高版本。

你在你的web.xml中更改版本

<web-app 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    version="2.5">