无法解析java延迟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>
我的网络。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 楼答案
我不完全确定,但您需要将
#{nameBean.name}
放入JSF组件中。尝试使用<h:outputText value="#{nameBean.name}"/>
从统一表达式语言的a java.net article开始:
这意味着JSF负责计算延迟表达式,只有当它们被添加到JSF组件时,它才会识别它们。即时表达式仍然有效,这意味着在JSF完成呈现响应阶段后,servlet/JSP引擎将接管并计算这些表达式。因此,您甚至可以使用延迟表达式生成即时表达式(尽管未经测试)
# 2 楼答案
你没有关闭f:view标签——也许这就是问题所在?顺便说一句,它不应该跟在html标签后面吗
# 3 楼答案
我觉得奇怪的是,你在编写JSP,却包含了Facelets库(这是JSF更好的视图技术)
Facelets允许在模板文本中计算
#{}
语法JSP中的延迟EL表达式只允许在支持它们的属性标记中使用(通常是JavaServer Faces组件,但可以编写自己的自定义标记库来支持它们)
从JSP 2.2 spec开始:
由于您没有使用} 映射处理页面
deferredSyntaxAllowedAsLiteral
page指令,也没有出现错误,我猜您的web。xml定义了一个版本,默认为JSP 2.0或更早的规则和,您不通过^{# 4 楼答案
我重新安装了Tomcat服务器并修改了pom。xml到:
现在代码开始工作了
# 5 楼答案
必须使用Servlet API 2.5或更高版本
你必须改变你网站的版本。xml