我在使用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}
我可能错误配置了一些东西,但我不知道在哪里看。有人能帮助我吗?
答案 0 :(得分:1)
令人感到奇怪的是,您正在编写JSP但包含Facelets库(这是一种更好的JSF视图技术)。
Facelets允许在模板文本中评估#{}
语法。
JSP中的延迟EL表达式只允许在支持它们的属性标记中使用(通常是JavaServer Faces组件,但是可以编写自己的自定义标记库来支持它们)。
来自JSP 2.2 spec:
模板文本中的表达式只允许使用
${}
语法。翻译 如果在模板文本中使用#{}
,则会导致错误,除非通过a关闭#{}
向后兼容机制。
由于您没有使用deferredSyntaxAllowedAsLiteral
页面指令并且没有收到错误,我猜您的web.xml会定义一个默认为JSP 2.0或更早规则的版本和你没有通过FacesServlet
映射处理页面。
答案 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">