[英]How does requestScope object of Expression Language work in a JSP file?
所以我在jsp文件中有以下简单代码:
${requestScope.getClass()}
返回我:
class javax.servlet.jsp.el.ImplicitObjectELResolver$ScopeManager$9
这使我认为该对象的类型为ImplicitObjectELResolver。 (即使在这里我也可能是错的。)
好吧,当我在这里查看有关该类的文档:javax.servlet.jsp.el.ImplicitObjectELResolver时,我看到了:
为JSP规范中定义的EL隐式对象定义可变分辨率行为。
根据JSP规范,此ELResolver解析以下变量:
pageContext-PageContext对象。 pageScope-将页面范围的属性名称映射为其值的Map。
requestScope-一个将请求范围的属性名称映射为其值的映射。
现在我很困惑,因为在这里我想我已经有了Map类型的对象。 但是我拥有的对象应该有一个名为requestScope的变量,它是一个Map。
所以当我打电话时实际发生了什么
${requestScope.firstName}
例如?
我是在Map对象上调用getKey(“ firstName”)还是发生其他事情?
作为EL解析的一部分,JSP servlet将使用ImplicitObjectELResolver
解析名称requestScope
。 该解决方案包括调用getRequestScopeMap()
,该方法返回一个匿名类EnumeratedMap<String, Object>
内部类,该类可以访问请求范围内的所有属性。
返回该EnumeratedMap
后,将通过尝试在EL表达式中使用给定名称调用Map
的get(..)
方法来继续执行EL解析。 例如,名称是firstName
在
${requestScope.firstName}
实施可能因版本而异。
已经有一段时间了,所以我可能不在这里,但是我认为EL在决定如何解释那里的财产之前会以几种方式查看对象的类型。 因此,如果您进行调用(“ getClass()
”)并且该方法存在,则会进行调用。 否则,如果EL找不到getClass()
方法,则EL可能会去寻找Map。
而且,仅因为类名是javax.servlet.jsp.el.ImplicitObjectELResolver$ScopeManager$9
并不意味着该类也不能实现Map
。 我猜可能是这样。 但是它仍然是一个包含Object
所有方法的类,而且我敢肯定,除了Map接口之外,它可能还拥有几种方法。
编辑:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.