我认为我遗漏了一些关于表达语言的基本知识。
按照预期, 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似乎无法评估这些变量? 这是一个范围问题,还是我错过了更大的东西?
答案 0 :(得分:3)
表达式语言构造
${a + b}
在页面,请求,会话和servlet上下文中查找具有键a
和b
的属性,返回它找到的第一个。它没有办法读取在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>