延期EL无法解决

时间:2011-07-15 11:22:48

标签: java jsf maven-2 el

我在使用JSF时遇到了一些问题。

看起来像延迟评估(例如。#{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}

我可能错误配置了一些东西,但我不知道在哪里看。有人能帮助我吗?

5 个答案:

答案 0 :(得分:1)

令人感到奇怪的是,您正在编写JSP但包含Facelets库(这是一种更好的JSF视图技术)。

Facelets允许在模板文本中评估#{}语法。


JSP中的延迟EL表达式只允许在支持它们的属性标记中使用(通常是JavaServer Faces组件,但是可以编写自己的自定义标记库来支持它们)。

来自JSP 2.2 spec

  

模板文本中的表达式只允许使用${}语法。翻译   如果在模板文本中使用#{},则会导致错误,除非通过a关闭#{}   向后兼容机制。

由于您没有使用deferredSyntaxAllowedAsLiteral页面指令并且没有收到错误,我猜您的web.xml会定义一个默认为JSP 2.0或更早规则的版本FacesServlet映射处理页面。

  • 检查您的web.xml版本(如果您需要更多信息,请说明您的目标服务器和版本)
  • 检查网址是否使用FacesServlet mapping

答案 1 :(得分: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>

现在代码可以运行了。

答案 2 :(得分: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引擎接管并评估这些表达式。因此,您甚至可以使用延迟表达式生成立即表达式(尽管未经过测试)。

答案 3 :(得分:0)

你没有关闭f:view-Tag - 也许这可能是问题所在?顺便说一句。不应该遵循html标签吗?

答案 4 :(得分: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">