当前位置: 首页 > 知识库问答 >
问题:

Struts 2-理解OGNL和params拦截器之间的工作

宋鸿云
2023-03-14

我是Struts2的新手。我正在从Struts2在行动这本书中学习它。我对OGNL中的一些概念理解有困难,具体如下-

>

  • 我们知道params拦截器将数据从请求参数移动到valueStack中的action对象。现在,在阅读的时候,我看到一行话--“作业的关键部分是将参数名称映射到valueStack上的实际属性。这就是OGNL的作用所在。params拦截器将请求参数名称解释为OGNL表达式,以便在valueStack上找到正确的目标属性”。

    问题1)这里,“解释”是什么意思?是params拦截器将请求参数翻译成某个OGNL表达式,然后OGNL表达式提供到ValueStack中属性的映射还是其他意思?

    当result开始呈现过程时,Struts2标记通过使用OGNL表达式引用特定值从ValueStack检索数据。

    问题2)所以标记采用OGNL表达式,但是数据是如何移动的呢?以前,params拦截器是移动数据的那个,但是现在没有params拦截器。那么数据是如何移动的呢?

  • 共有1个答案

    周鸿光
    2023-03-14

    答案1

    参数名是OGNL表达式。这是一个常规配置过剩的情况。如果我们同意让参数的名称成为可以访问javabeans属性的有效OGNL表达式,那么就很容易将该名称作为表达式交给OGNL。这当然是在内部完成的;您不需要知道它是如何工作的,除非您正在对Struts2代码的这一部分进行黑客攻击。

    答案二

    action对象位于ValueStack的顶部。ValueStack通过作为ThreadLocal ActionContext的一部分存在,可以从同一线程上执行的任何代码获得。由于web应用程序使用单个线程来处理请求,我们知道结果层将能够获得ValueStack以检索数据,再次使用标记中的名称作为OGNL表达式。

    注:

    这一切的关键部分是ValueStack对于在同一线程上执行的任何代码都可用。这允许处理单个请求的所有代码访问ValueStack,它们可以通过ThreadLocal ActionContext获得ValueStack(如果不理解,请阅读Java的ThreadLocal类)。

    然后,params拦截器可以尝试使用param名称作为OGNL表达式将数据写入ValueStack(它作为OGNL上下文服务器--如果不理解,请再次阅读OGNL API)。然后,处理响应呈现的结果类中的代码可以将标记库中的各种名称和值解释为OGNL表达式,以从ValueStack读取数据。

     类似资料:
    • 主要内容:Struts2框架的拦截器:,如何使用拦截器?,创建自定义的拦截器,创建拦截器类:,创建动作类:,创建视图,创建页面:,配置文件,堆叠多个拦截器:拦截器的概念是Servlet过滤器或JDK代理类一样的。拦截器允许横切功能分开实现的动作,以及框架。使用拦截器,可以实现如下: 提供预处理行动之前被称为逻辑。 提供后处理逻辑动作后被调用 捕获异常,这样可以进行替代处理。 Struts2框架提供的许多功能都使用拦截实现的例子包括异常处理,文件上传,生命周期回调和验证等事实上作为Struts2的

    • 本文向大家介绍详解Struts2拦截器机制,包括了详解Struts2拦截器机制的使用技巧和注意事项,需要的朋友参考一下 Struts2的核心在于它复杂的拦截器,几乎70%的工作都是由拦截器完成的。比如我们之前用于将上传的文件对应于action实例中的三个属性的fileUpload拦截器,还有用于将表单页面的http请求参数设置成action中对应的属性的param拦截器等。总之,在整个Struts

    • 本文向大家介绍Struts2之Action接收请求参数和拦截器详解,包括了Struts2之Action接收请求参数和拦截器详解的使用技巧和注意事项,需要的朋友参考一下 技术分析之在Struts2框架中使用Servlet的API 1. 在Action类中也可以获取到Servlet一些常用的API 需求:提供JSP的表单页面的数据,在Action中使用Servlet的API接收到,然后保存到三个域对象

    • 本文向大家介绍Struts2源码分析之ParametersInterceptor拦截器,包括了Struts2源码分析之ParametersInterceptor拦截器的使用技巧和注意事项,需要的朋友参考一下 前言 ParametersInterceptor拦截器其主要功能是把ActionContext中的请求参数设置到ValueStack中,如果栈顶是当前Action则把请求参数设置到了Actio

    • 主要内容:参考很多时候,相同的一组拦截器可以适用于不同的动作类,例如, 在上述情况下,它有许多重复工作以及不能重复使用。 幸运的是,在Struts 2自带的拦截器栈,使开发人员建立一组拦截到一个单元名为“栈名字”, 和可以通过“栈名字”引用操作它。 最佳做法 建议组合相同的一组拦截器到一个拦截器栈摆脱重复的工作,并增加了项目的可重用性。 在上面的例子更新,声明一个拦截器栈,命名为“defaultStackWit

    • 主要内容:1. 动作,2. JSP页面,3. 执行和等待拦截器,4. 示例,参考在Struts2中附带一个名为“execAndWait”一个非常有趣的“执行和等待”拦截器,这是一个非常方便的拦截器长时间运行操作在后台,显示用户的自定义的等待页面。在本教程中,它显示了一个完整的使用 Struts2 execAndWait 拦截器的例子。 1. 动作 一个普通的动作类,有一个长时间运行进程,证明了execAndWait效果。 LongProcessAction.java 2. J