我是Struts 2的新手。我正在从《 Struts2 In Action》一书中学习它。我很难理解OGNL中的一些概念,如下所示:
我们知道params
拦截器将数据从请求参数移到ValueStack
中的操作对象。现在,在阅读的同时,我遇到了一条说:
“这项工作的棘手部分是将参数名称映射到ValueStack
上的实际属性。这是OGNL出现的地方。params
拦截器将请求参数名称解释为OGNL表达式,以找到正确的目的地。属性。
问题1)在这里,“解释”是什么意思?是参数拦截器将请求参数转换为某些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应用程序使用单个线程来处理请求的处理,因此我们知道Result层将能够到达ValueStack来检索数据,再次使用标记中的名称作为OGNL表达式。
注意:
所有这些的关键部分在于,ValueStack可用于在同一线程上执行的任何代码。这样,所有处理单个请求的代码都可以访问ValueStack,可以通过ThreadLocal ActionContext获得该值(如果您不了解,请阅读Java的ThreadLocal类)。
然后,params拦截器可以尝试将param名称用作OGNL表达式,以将数据写入ValueStack(该服务器作为OGNL上下文,如果您不了解,请再次阅读OGNL API)。然后,用于处理响应呈现的Result类中的代码可以将标记库中的各种名称和值解释为OGNL表达式,以从ValueStack读取数据。