我是 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 的一个例子。如果我们同意使参数的名称成为可以访问 javabean 属性的有效 OGNL 表达式,那么很容易将该名称作为表达式传递给 OGNL。当然,这是在内部完成的;你真的不需要知道它是如何工作的,除非你正在破解 Struts 2 代码的那部分。
答案 #2
Action 对象位于 ValueStack 之上。 ValueStack 是可用的,通过它作为 ThreadLocal ActionContext 的一部分存在,来自在同一线程上执行的任何代码。由于 Web 应用程序使用单个线程来处理请求,我们知道结果层将能够到达 ValueStack 以检索数据,再次使用标签中的名称作为 OGNL 表达式。
注意:
所有这一切的关键部分是 ValueStack 可用于同一线程上执行的任何代码。这允许处理单个请求的所有代码都可以访问 ValueStack,它们可以通过 ThreadLocal ActionContext 获得(如果您不理解,请阅读 Java 的 ThreadLocal 类)。
params 拦截器然后可以尝试使用参数名称作为 OGNL 表达式来将数据写入 ValueStack(作为 OGNL 上下文的服务器——如果您不理解,请再次阅读 OGNL API)。然后 Result 类中处理响应呈现的代码可以将标记库中的各种名称和值解释为 OGNL 表达式,以从 ValueStack 中读取数据。
关于java - Struts 2 - 了解 OGNL 和参数拦截器之间的工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20853135/