Java 表达式语言的requestScope对象如何在JSP文件中工作?
因此,我在jsp文件中有以下简单代码:Java 表达式语言的requestScope对象如何在JSP文件中工作?,java,jsp,servlets,el,Java,Jsp,Servlets,El,因此,我在jsp文件中有以下简单代码: ${requestScope.getClass()} 这让我回想起: class javax.servlet.jsp.el.ImplicitObjectELResolver$ScopeManager$9 这使我认为这个对象是隐式对象解析器类型。(即使在这里我也可能错了……) 好的,当我查看这个漂亮类的文档时:javax.servlet.jsp.el.ImplicitObjectELResolver ,我明白了: 定义EL隐式对象的变量分辨率行为 在JS
${requestScope.getClass()}
这让我回想起:
class javax.servlet.jsp.el.ImplicitObjectELResolver$ScopeManager$9
这使我认为这个对象是隐式对象解析器类型。(即使在这里我也可能错了……)
好的,当我查看这个漂亮类的文档时:javax.servlet.jsp.el.ImplicitObjectELResolver
,我明白了:
定义EL隐式对象的变量分辨率行为
在JSP规范中定义
以下变量由该ELResolver按照
JSP规范:
pageContext—pageContext对象。pageScope—将页面范围的属性名称映射到其值的映射
requestScope—将请求范围的属性名称映射到其值的映射
现在我很困惑,因为我想我已经有了类型映射的对象。但是我的对象应该有一个名为requestScope的变量,它是一个映射
那么当我打电话给你的时候会发生什么呢
${requestScope.firstName}
比如说
我是在地图对象上调用getKey(“firstName”),还是在进行其他操作 已经有一段时间了,所以我可能会离开这里,但我认为EL在决定如何解释您的属性之前,会从多个方面考虑对象的类型。因此,如果您进行调用(“
getClass()
”),并且该方法存在,则会进行调用。否则,如果EL没有找到getClass()
方法,它可能会去寻找一个映射
另外,仅仅因为类名是javax.servlet.jsp.el.ImplicitObjectELResolver$ScopeManager$9
,并不意味着该类也不能实现像Map
这样的接口。我想可能是的。但它仍然是一个类,包含了对象
中的所有方法,我相信除了Map接口之外,它可能还有自己的几个方法
编辑:
ScopeManager
不是映射,但它的几乎所有方法都返回映射。查看作为EL解析的一部分,JSP servlet将使用隐式对象解析程序
解析名称请求范围
。该解决方案包括调用getRequestScopeMap()
,它返回类型为EnumeratedMap
的匿名内部类,该类可以访问请求范围中的所有属性
返回EnumeratedMap
后,EL解析将继续,方法是使用EL表达式中的给定名称调用Map
的get(…)
方法。例如,中的名称为firstName
${requestScope.firstName}
实现可能已从一个版本更改为另一个版本。对象的类型为
javax.servlet.jsp.el.ImplicitObjectELResolver$ScopeManager$9
。这是类隐式对象解析器
的嵌套类ScopeManager
的匿名内部类。这让我很困惑:否则,如果EL没有找到getClass()方法,它可能会去寻找映射。我只是说编译器可以反射地查看对象并确定其类型,在决定如何查找属性之前。自己编写这样的方法并不难。我为自己编写的一些调试代码做了类似的工作。