表达语言:变量与属性

时间:2013-11-17 19:32:13

标签: java jsp el scriptlet

我认为我遗漏了一些关于表达语言的基本知识。

按照预期,

practice.jsp (下方)输出14

<jsp:scriptlet>
    request.setAttribute("a", 5);
    request.setAttribute("b", 9);
</jsp:scriptlet>

${a+b}

practice2.jsp (下方)输出0

<jsp:scriptlet>
    Integer a = 5;
    Integer b = 9;
</jsp:scriptlet>

${a+b}

practice2.jsp中发生了什么? 为什么EL似乎无法评估这些变量? 这是一个范围问题,还是我错过了更大的东西?

3 个答案:

答案 0 :(得分:3)

表达式语言构造

${a + b}

在页面,请求,会话和servlet上下文中查找具有键ab的属性,返回它找到的第一个。它没有办法读取在scriptlet中声明的变量,而没有明确地将它们添加到任何具有您想要访问它们的键的上下文中。

我建议您立即放弃scriptlet,原因在于this article和其他人。

答案 1 :(得分:3)

JSP 2.2 specification描述了如何解析变量:

${product}
     

此表达式将查找名为 product 的属性,进行搜索   页面,请求,会话和应用程序范围,并将返回   它的价值。如果未找到该属性,则返回null。

这些范围记录为:

  
      
  • pageScope - 将page-scoped属性名称映射到其值的Map
  •   
  • requestScope - 将request-scoped属性名称映射到其值的Map
  •   
  • sessionScope - 将session-scoped属性名称映射到其值的Map
  •   
  • applicationScope - 将application-scoped属性名称映射到其值的Map
  •   

Scriptlets<% %>)是一种古老的机制,允许您将Java代码直接注入到从JSP语法生成的servlet中。也就是说,它们允许您将业务逻辑注入到视图中。

由于您的代码未将值设置为上述任何范围,因此表达式语言variable resolver无法看到它们。

答案 2 :(得分:2)

scriptlet中的变量范围仅限于scriptlet,
试试这个:

<jsp:scriptlet>
    Integer a = 5;
    Integer b = 9;
    pageContext.setAttribute("a", a);
    pageContext.setAttribute("b", b);
</jsp:scriptlet>