EL ExpressionFactory, scopes, JSTL forEach tag, iterated var



我正在程序中使用 ExpressionFactory,我想让 ValueExpressions 和变量可以使用 EL 表达式从 JSP 访问。

我无法理解某些内容:看起来我放置的变量覆盖了普通变量,例如,迭代时由forEach标签设置的变量。我认为我的代码将用户放在 pageScope 中,并且 for Each 标签也是如此,但我错了。

应该如何使用工厂和值表达式,以便我可以访问变量,除非它们被覆盖,反之亦然,如以下示例所示?

<%@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:未指定范围:人类,从页面范围:迈克

2:未指定范围:人类,从页面范围:鲍勃

3:未指定范围:人类,来自页面范围:凯特

我玩了你的代码。

  <%
     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}!

输出:之前每个循环用户都是人类!1 个用户是迈克2 用户是鲍勃3 用户是凯特之后 for每个循环用户是 !

???奇怪的是,在 forEach 循环之后找不到任何值。

最新更新