我在使用 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>
我的网站.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}
我可能配置错误了一些东西,但我不知道去哪里看。有人可以帮助我吗?
我觉得很奇怪,你正在编写JSP,但包括Facelets库(这是JSF更好的视图技术(。
小面孔允许评估模板文本中的#{}
语法。
JSP 中的延迟 EL 表达式只允许在支持它们的属性标记中(通常是 JavaServer Faces 组件,但可以编写自己的自定义标记库来支持它们(。
从 JSP 2.2 规范:
模板文本中的表达式仅允许使用
${}
语法。翻译 如果在模板文本中使用#{}
将导致错误,#{}
除非通过 向后兼容机制。
由于您没有使用 deferredSyntaxAllowedAsLiteral
page 指令并且没有收到错误,我猜您的 web.xml 定义了一个默认为 JSP 2.0 或更早规则的版本,并且您没有通过FacesServlet
映射处理页面。
- 检查您的 Web.xml 版本(如果需要更多信息,请说明您的目标服务器和版本(
- 检查 URL 是否使用 FacesServlet 映射
我重新安装了我的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>
现在代码可以工作了。
我不完全确定,但您需要将#{nameBean.name}
放入 JSF 组件中。尝试使用 <h:outputText value="#{nameBean.name}"/>
。
来自一篇关于统一表达式语言的 java.net 文章:
延迟求值意味着使用统一 EL 的技术接管了从 JSP 引擎计算表达式的责任,并在页面生命周期中的适当时间评估表达式。EL 从 JSP 容器获取控制权,以便在适当的时间计算表达式。JSF EL 表达式采用
#{defExpr}
的形式。JSF 表达式以这种方式工作。
这意味着 JSF 负责计算延迟表达式,并且只有在将它们添加到 JSF 组件时才会识别它们。即时表达式仍然有效意味着在 JSF 完成渲染响应阶段之后,servlet/JSP 引擎接管并评估这些表达式。因此,您甚至可以使用延迟表达式生成即时表达式(尽管未经过测试(。
你不关闭f:view-Tag - 也许这可能是问题所在? 顺便说一句,它不应该遵循 html 标签吗?
您必须使用 Servlet API 2.5 或更高版本。
您必须更改网络中的版本.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">