繁体   English   中英

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

[英]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表达式中使用给定名称调用Mapget(..)方法来继续执行EL解析。 例如,名称是firstName

${requestScope.firstName} 

实施可能因版本而异。

已经有一段时间了,所以我可能不在这里,但是我认为EL在决定如何解释那里的财产之前会以几种方式查看对象的类型。 因此,如果您进行调用(“ getClass() ”)并且该方法存在,则会进行调用。 否则,如果EL找不到getClass()方法,则EL可能会去寻找Map。

而且,仅因为类名是javax.servlet.jsp.el.ImplicitObjectELResolver$ScopeManager$9并不意味着该类也不能实现Map 我猜可能是这样。 但是它仍然是一个包含Object所有方法的类,而且我敢肯定,除了Map接口之外,它可能还拥有几种方法。

编辑:

ScopeManager不是Map,但是几乎所有的方法都返回一张map。 查看我发现反向工程文档。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM