java - Struts 2 - 了解 OGNL 和参数拦截器之间的工作

标签 java struts2 ognl valuestack struts2-interceptors

我是 Struts 2 的新手。我正在学习 Struts2 In Action 一书。我很难理解 OGNL 中的一些概念,如下所示-

  1. 我们知道 params 拦截器将数据从请求参数移动到 ValueStack 中的操作对象。现在在阅读时,我遇到了一行,上面写着- “这项工作的棘手部分是将参数的名称映射到 ValueStack 上的实际属性。这就是 OGNL 的用武之地。params 拦截器解释请求参数名称作为 OGNL 表达式以在 ValueStack 上定位正确的目标属性。

    问题 1) 在这里,“解释”是什么意思?是 params 拦截器将请求参数转换为一些 OGNL 表达式,然后 OGNL 表达式提供到 ValueStack 中的属性的映射,还是其他含义?

  2. 当结果开始其呈现过程时,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/

相关文章:

java - 异常由于从互联网/本地引用 struts.dtd 文件

jsp - 检查Struts2标签中的请求参数值

java - docx4j打开odt文件

Java/MySQL 准备语句错误

java - 如何在单词后标记空字符串

jsp - Struts2 - 另一个属性内的属性标记

java - Struts 2 登录表单问题

java - 从头开始设计 Java 应用程序时总是 'Entity first' 方法?

java - 覆盖 struts 2 拦截器

java - Google 应用引擎上的 Struts 2。问题