我是 Struts 2 的新手。我正在从《Struts2 In Action》一书中学习它。我很难理解 OGNL 中的一些概念,如下所示-
-
我们知道params
拦截器将数据从请求参数移动到操作对象中ValueStack
。现在,在阅读时,我看到这样一行字:
“这项工作的棘手部分是将参数名称映射到ValueStack
。这就是 OGNL 发挥作用的地方。params
拦截器将请求参数名称解释为 OGNL 表达式,以在 ValueStack 上找到正确的目标属性”。
问题1)这里的“解释”是什么意思? params 拦截器是否将请求参数转换为某个 OGNL 表达式,然后 OGNL 表达式提供到 ValueStack 中属性的映射,或者它是否意味着其他含义?
-
当结果开始其呈现过程时,Struts 2 标记通过使用 OGNL 表达式引用特定值来从 ValueStack 检索数据。
问题 2)标签采用 OGNL 表达式,但是数据是如何移动的?早些时候,params
拦截器是移动数据的拦截器,但现在没有了params
拦截器。那么数据是如何移动的呢?
答案#1
参数名称是 OGNL 表达式。这是 ConventionOverConfiguraiton 的一个例子。如果我们同意使参数名称成为可以访问 javabeans 属性的有效 OGNL 表达式,那么很容易将该名称作为表达式传递给 OGNL。当然这是内部完成的;您实际上并不需要知道它是如何工作的,除非您正在破解 Struts 2 代码的那一部分。
答案#2
操作对象位于 ValueStack 的顶部。 ValueStack 作为 ThreadLocal ActionContext 的一部分存在,可以从同一线程上执行的任何代码中获得。由于 Web 应用程序使用单个线程来处理请求,因此我们知道结果层将能够访问 ValueStack 来检索数据,再次使用标签中的名称作为 OGNL 表达式。
Note:
所有这一切的关键部分是 ValueStack 可用于同一线程上执行的任何代码。这允许处理单个请求的所有代码都可以访问 ValueStack,它们可以通过 ThreadLocal ActionContext 获取 ValueStack(如果您不明白,请阅读 Java 的 ThreadLocal 类)。
然后,参数拦截器可以尝试使用参数名称作为 OGNL 表达式来将数据写入 ValueStack(它作为 OGNL 上下文 - 如果您不理解,请再次阅读 OGNL API)。然后,Result 类中处理响应呈现的代码可以将标签库中的各种名称和值解释为 OGNL 表达式,以从 ValueStack 读取数据。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)