Expression语言的requestScope对象如何在JSP文件中工作?

时间:2014-07-10 18:08:28

标签: java jsp servlets el

所以我在jsp文件中有这个简单的代码:

${requestScope.getClass()}

返回我:

class javax.servlet.jsp.el.ImplicitObjectELResolver$ScopeManager$9

这让我觉得这个对象是ImplicitObjectELResolver类型。 (即使在这里我可能也错了..)

好吧,当我看一下这个很好的类的文档here时:javax.servlet.jsp.el.ImplicitObjectELResolver ,我明白了:

  

定义EL隐式对象的可变分辨率行为   在JSP规范中定义。

     

以下变量由此ELResolver解析   JSP规范:

     

pageContext - PageContext对象。 pageScope - 将页面范围的属性名称映射到其值的映射。

     

requestScope - 将请求范围的属性名称映射到其值的映射。

现在我感到困惑,因为我认为我已经拥有了 Map 类型的对象。但我拥有的对象应该有一个名为 requestScope 的变量,它是一个Map ..

那么当我打电话

时会发生什么
${requestScope.firstName} 

例如?

我是否在Map对象上调用了getKey(“firstName”),还是正在进行其他操作?

2 个答案:

答案 0 :(得分:3)

作为EL解析的一部分,JSP servlet将使用ImplicitObjectELResolver来解析名称requestScope。该解决方案包括调用getRequestScopeMap(),它返回一个类型为EnumeratedMap<String, Object>的匿名内部类,它可以访问请求范围中的所有属性。

一旦返回EnumeratedMap,EL解析将继续尝试在EL表达式中使用给定名称调用Map的{​​{1}}方法。例如,

中的名称为get(..)
firstName

实施可能已从版本更改为版本。

答案 1 :(得分:0)

已经有一段时间了,所以我可能会离开这里,但我认为在决定如何解释你的财产之前,EL会在几个方面查看对象的类型。因此,如果您拨打电话(&#34; getClass()&#34;)并且该方法存在,则进行呼叫。否则,如果没有找到getClass()方法,EL可能会寻找地图。

另外,仅仅因为班级名称为javax.servlet.jsp.el.ImplicitObjectELResolver$ScopeManager$9并不意味着班级也无法实现Map这样的界面。我猜可能会这样。但它仍然是一个包含Object所有方法的类,除了Map接口之外,我还可以确定它自己的几种方法。

编辑:

ScopeManager不是地图,但几乎所有方法都会返回地图。查看reverse engineered docs I found.