我在我的程序中使用ExpressionFactory,我想使用EL表达式从JSP访问ValueExpressions和变量。
我无法理解:看起来我的变量我把它覆盖了正常变量,例如,迭代时由forEach标记设置的变量。我在想我的代码将用户放在pageScope中,而且每个标签都是如此,但我错了。
我应该如何处理工厂和值表达式,以便我可以访问变量,除非它们被覆盖,反之亦然,如下例所示?:
<%@page import="javax.el.ValueExpression"%>
<%@page import="javax.el.ELContext"%>
<%@page import="javax.el.ExpressionFactory"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Check Scopes</title>
</head>
<body>
<%
ExpressionFactory ef = JspFactory.getDefaultFactory().
getJspApplicationContext(application).getExpressionFactory();
ELContext ec = pageContext.getELContext();
ValueExpression ve = ef.createValueExpression(ec, "humangus", String.class);
pageContext.getELContext().getVariableMapper().setVariable("user", ve);
String[]users = new String[]{"mike", "bob", "kate"};
pageContext.setAttribute("users", users);
%>
<h3>List of Users:</h3>
<c:forEach var="user" items="${users}" varStatus="status">
${status.count}:
without specifying scope: ${user},
from page scope: ${pageScope.user}<br/>
</c:forEach>
</body>
</html>
这会产生以下结果:
用户列表:
1:未指定范围:humangus,来自页面范围:mike
2:未指定范围:humangus,来自页面范围:bob
3:未指定范围:humangus,来自页面范围:kate
答案 0 :(得分:1)
我玩了你的代码。
<%
pageContext.setAttribute("user", "humangus");
String[]users = new String[]{"mike", "bob", "kate"};
pageContext.setAttribute("users", users);
%>
Before forEach loop user is ${user}!<br/>
<c:forEach var="user" items="${users}" varStatus="status">
${status.count} user is ${user}<br/>
</c:forEach>
After forEach loop user is ${user}!
输出: 之前forEach循环用户是humangus! 1个用户是迈克 2个用户是bob 3位用户是凯特 在forEach循环用户之后!
???奇怪的是,在forEach循环之后没有找到任何值。