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

2023-12-30

我是 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 的一个例子。如果我们同意使参数名称成为可以访问 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(使用前将#替换为@)

Struts 2 - 了解 OGNL 和参数拦截器之间的工作原理 的相关文章

随机推荐

  • parse(text = str) 中出现意外符号错误,数字后带有连字符

    我正在尝试解析 R 中的字符串 当字符串中存在数字后跟连字符时 R 会抛出 意外符号 或 意外输入结束 异常 请参阅代码 搜索并尝试不同的方法来解决这个问题并没有帮助 可能是我的知识匮乏 任何帮助或建议将不胜感激 gt str lt abc
  • Umbraco 5询问用户是否有节点权限

    我正在使用 Umbraco 5 1 beta 在互联网上 此信息来自以前的版本 找不到最新的文档 我发现我可以询问节点用户是否具有访问权限 这样我想建立我的菜单 问题是 我无法让它工作 HasAccess 和 IsProtected 属性不
  • 如何使用 SwiftUI 扩展按钮的宽度

    我不知道如何更改 SwiftUI 中按钮的宽度 我已经尝试过 使用 frame minWidth 0 maxWidth infinity 在按钮和导航链接周围使用 Spacer 在文本字段上使用框架并在按钮上使用填充 查看文档以及我在网上搜
  • 为什么 PHP 对象运算符在浏览器中被视为结束标记? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在使用
  • 使用其他数组对对象数组进行排序

    我创建了这个对象数组 const palette color Blue brightness Soft color Blue brightness Medium color Blue brightness Principal color M
  • Magento 重写 getPrice()

    我已经通过覆盖 Magento 产品的价格规则getPrice 方法在 Mage Catalog Model Product Type Price 类 简单的产品工作正常 并显示我在中提到的更新价格getPrice i e public f
  • Haproxy ssl重定向握手失败

    我有 haproxy v1 5 4 可以使用 http 和 https 我将 80 和 443 绑定到相同的前端并使用相同的 acl 我想创建一个 http gt https 重定向 frontend http in bind 80 bin
  • NSXMLparser 错误代码 5

    我在我的应用程序中使用亚马逊的 simpledb 解析 xml 时出现错误 代码为 5 IE NSXMLParserErrorDomain 错误 5 有时它工作正常 并且导航没有任何重大变化就会出现该错误 当我多次重新启动应用程序而无需对系
  • Android:如何在主项目中使用测试项目

    我想在 Eclipse 中创建这样的项目结构 并将其与 Maven 一起使用 MyProject AndroidManifest xml res resources for main application src source code
  • div元素中额外空间的解决方案

    在我的应用程序中我使用的是div元素 div 元素下方和上方有一些额外的空间 我怎样才能删除它 Thanks 每个浏览器都有自己的各种元素的边距和填充的默认值 所以除非你明确设置例如 div margin 0 padding 0 在你的 C
  • 如何在不创建数据库的情况下保存谜语游戏的答案?

    我创建了一个具有不同级别的问答游戏 每个级别都包含一个问题 我没有用数据库创建它 我只是用了字符串 当用户回答第一级的问题时 他会被带到第二级 但是当用户返回到第一级时 他必须再次输入答案 即使他之前已经解决了该问题 无论如何 JAVA 是
  • Firemonkey Delphi TWebBrowser 获取文本/HTML

    我如何从 Firemonkey 平台 Android iOS 上的网页获取文本 html TWebBrowser 没有任何这方面的东西 经过一些测试 我结合了JAVAScript和Delphi代码 有一个workground 请参考我的文章
  • 不带列名的动态汇总

    如何根据列的字符串数组动态构造汇总语句 deviceTelemetry summarize
  • Node 7.1.0 new Promise() 解析器未定义不是函数

    我在 OSX 上使用最新的节点版本 7 1 0 但我仍然无法使用 Promises 我明白了 index js new Promise Error new Promise 类型错误 未定义的承诺解析器不是函数 Node 7 1 0不支持ES
  • 访问模块内的 IRQ 描述数组并显示操作名称

    我正在用 C 语言编写一个内核模块 该模块正在努力访问 IRQ 描述数组元素并显示这些元素的所有操作名称 一开始 我认为这个 irq desc 数组就像一个宏 但编译后我明白它不是 然后我使用了 for each irq desc irq
  • 安装 python 模块时出错

    我正在尝试使用标准安装 python 模块python setup py install但我收到以下错误 我对 python 相当陌生 但过去我已经能够以这种方式安装其他模块 我对这个模块的印象setuptools不是我应该从我的 pyth
  • 将初始查询集限制为 django-rest 框架中分页中的对象

    我正在定义一个ModelViewSet using django rest framework 我需要覆盖默认查询集 以便在渲染响应之前对查询集对象执行一些处理 这个过程非常耗时 因此我只想在由于分页响应而实际可供消费者使用的对象上执行它
  • oracle 18中通过json_table解析json

    有一个请求例如 with j sJson as select ID 1444284517 ID ORD 4255 2187606199 Vals CODE ONB2B3BB8 DORD 25 04 2021 from dual select
  • 如何在 RxSwift 中检测可观察对象在特定时间内是否未发出任何事件

    我正在尝试检测是否有可观察的 我的情况按钮 rx tap 在 3 秒内没有发出任何值 如果是的话 我想更新用户界面 到目前为止 这是我的尝试 Observable
  • Struts 2 - 了解 OGNL 和参数拦截器之间的工作原理

    我是 Struts 2 的新手 我正在从 Struts2 In Action 一书中学习它 我很难理解 OGNL 中的一些概念 如下所示 我们知道params拦截器将数据从请求参数移动到操作对象中ValueStack 现在 在阅读时 我看到