所以我在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”),还是正在进行其他操作?
答案 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.