`
一日一博
  • 浏览: 230480 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Struts2中OGNL、ActionContext和值栈及线程安全浅析

阅读更多

值栈(ValueStack)   
Struts2将OGNL上下文设置为Struts2中的ActionContext(内部使用的仍然是OgnlContext),并将值栈设为OGNL的根对象。    
OGNL上下文中的根对象可以用ONGL表达式以对象名直接访问的,不需要使用任何特殊的“标记”,而引用上下文中的其他对象则需要使用“#”来标记。由于值栈是OGNL上下文中的根对象,因此可以直接访问。那么对于值栈中的对象该如何访问呢?Struts2提供了一个特殊的OGNLPropertyAccessor,它可以自动查找栈内的所有对象(从栈顶到栈底),直接找到一个具有你所查找的属性的对象。也就是说,对于值栈中的任何对象都可以直接访问,而不需要使用“#”。    
值栈中的对象都是OGNL上下文中的根对象。这就是Struts2在OGNL基础上做出的改进。

ActionContext
ActionContext是Action的环境,一次Action调用都会创建一个ActionContext
调用:ActionContext context = ActionContext.getContext()

Struts2对OGNL上下文的概念又做了进一步扩充,在struts2中,OGNL上下文通常如下所示:

                        |--request 

                        | 

                        |--application 

                        | 

context map---|--OgnlValueStack(root) [ user, action, OgnlUtil, ... ] 

                        | 

                        |--session 

                        | 

                        |--attr 

                        | 

                        |--parameters 

在Struts2中,采用标准命名的上下文(Context)来处理OGNL表达式。处理OGNL的顶级对象是一个Map(也叫context map),而OGNL在这个context中就是一个顶级对象(root)。在用法上,顶级对象的属性访问,是不需要任何标记前缀的。而其它非顶级的对象访问,需要使用#标记。

例如:
<s:property value="%{#application.myApplicationKey}" />
<s:property value="%{#session.mySessionKey}" />
<s:property value="%{#request.myRequestKey}" />
<s:property value="%{#parameters.myParameterKey}" /> 


Struts2框架把OGNL Context设置为ActionContext。并且ValueStack作为OGNL的根对象。除value stack之外,Struts2框架还把代表application、session、request这些对象的Map对象也放到ActionContext中去。(这也就是Struts2建议在Action类中不要直接访问Servlet API的原因,他可以通过ActionContext对象来部分代替这些(Servlet API)功能。)



Struts2把页面上的值传到Action里面,这个过程从逻辑上说需要分成两步来完成:

1. 对于每个请求,都建立一个与相应Action对应的ActionContext作为OGNL的上下文环境和ValueStack,并且把Action里面的属性值压入ValueStack,这时的属性值都是初始化值。

2. 在请求进入Action代码前,通过某种通用的机制(就是Struts2的interceptor拦截器机制),搜集页面上传递过来的参数,这里调用的是params拦截器,准确来说是这个拦截器会找Action里面的所有属性的set方法,把页面的Struts2标签的对应名称的属性值set进去,这样Action里面的属性就成功赋值。



设计Struts2的团队初衷就是为了不用和那些Servlet API复杂的请求(Request)、响应(Response)关联在一起。





Struts2的线程安全
一般情况,我们的ActionContext都是通过:ActionContext context = (ActionContext) actionContext.get();来获取的。我们再来看看这里的actionContext对象的创建:static ThreadLocal actionContext = new ActionContextThreadLocal();,ActionContextThreadLocal是实现ThreadLocal的一个内部类。ThreadLocal可以命名为“线程局部变量”,它为每一个使用该变量的线程都提供一个变量值的副本,使每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。这样,我们ActionContext里的属性只会在对应的当前请求线程中可见,从而保证它是线程安全的。

Struts2的action中就像一个POJO一样,定义了很多的类变量。此时,就使用scope=prototype来指定是个原型模式,而不是单例,这样就解决了线程安全问题。每个线程都是一个新的实例。 
分享到:
评论

相关推荐

    struts2中的ActionContext与ognl

    ActionContext是Struts2框架中一个关键的组件,它提供了当前请求上下文的信息,而OGNL(Object-Graph Navigation Language)则是Struts2中的表达式语言,用于在模型和视图之间进行数据传递。下面将详细探讨这两个...

    struts2中的OGNL的源码

    6. **安全机制**:为了防止OGNL注入攻击,Struts2提供了安全配置,限制可以访问的对象和属性。 源码阅读可以帮助我们了解OGNL的工作原理,如如何解析表达式,如何找到正确的ValueResolver,以及如何处理上下文中的...

    struts2_OGNL表达式ActionContext及valuesStack

    在Struts2中,`#`符号主要用于访问OGNL上下文和ActionContext。ActionContext是Struts2框架的核心组件之一,它存储了请求处理过程中的各种上下文信息,如请求参数、会话属性、应用级属性等。通过`#parameters`,你...

    struts2OGNL表达式ActionContext及valuesStack.pdf

    在Struts2中,OGNL表达式的使用大大提升了代码的可读性和维护性。 首先,`#`字符在OGNL中扮演着关键角色。它主要用于访问OGNL上下文和Action上下文。`#`前缀可以用来获取`ActionContext`,这包含了四个重要的域:...

    struts2--3.Ognl与值栈

    在实际开发中,了解并熟练掌握OGNL和值栈的使用,能显著提高Struts2应用的开发效率和代码可维护性。通过阅读`struts_3`和`struts3_web`这两个文件,你可以进一步深入学习Struts2框架的这些关键特性,并通过实践加深...

    Struts2_OGNL

    在Struts2框架中,OGNL被广泛应用于值栈(Value Stack)之中。值栈是Struts2框架中的核心概念之一,它是一个用于临时存储对象的栈结构,这些对象包括Action实例、模型对象、临时对象等。值栈中的对象可以按照以下四...

    Struts2 使用OGNL表达式

    6. **值栈**:Struts2中的值栈是OGNL的主要工作区域,它存储了Action对象和其他相关数据。通过`#root`或`#action`关键字,可以直接访问值栈顶部的对象。 7. **表达式过滤器**:为了安全考虑,Struts2允许配置OGNL...

    struts2 中 OGNL表达式的使用

    struts2 中 OGNL表达式的使用struts2 中 OGNL表达式的使用

    struts2 ognl用法项目

    1. **值栈访问**:Struts2使用值栈存储请求中的所有对象,OGNL可以从值栈顶部找到并访问对象。例如,`#request.user.name`表示从HTTP请求对象中获取`user`属性的`name`。 2. **动态方法调用**:OGNL支持直接调用...

    struts2_OGNL Demo

    这个项目旨在帮助开发者理解和学习如何在Struts2中使用OGNL来操纵对象和数据。OGNL是Struts2中一个重要的组件,它允许在视图层和控制层之间传递和操作数据。 首先,我们来看`.classpath`、`.mymetadata`、`.project...

    linjin101#javaStudy#Struts2中的OGNL和值栈ValueStack1

    1、什么是值栈 2、值栈的内部结构 3、ActionContext和ValueStatck的关系 4、如何获取值栈对象 5、向值栈存数据 6、从值栈中获取数据

    struts2中OGNL的一些概念及原理说明

    ### Struts2中OGNL的概念及原理说明 #### 一、OGNL表达式的基本用法与特点 **OGNL**,即**Object Graphic Navigation Language**(对象图导航语言),是Struts2框架中用于处理对象及其属性的强大工具之一。通过...

    Struts2核心包ognl-2的源代码

    这种灵活性使得OGNL在Struts2中被广泛应用于视图层的渲染和动作类的值传递。 在源代码中,你会看到OGNL的解析器、表达式树构建、类型转换、上下文管理等多个关键部分。这些部分共同构成了OGNL的强大功能: 1. **...

    struts2 标签 OGNL

    在Struts2中,OGNL被广泛用于访问Action中的属性,以及在视图层(如JSP)中绑定和操作数据。 首先,OGNL使得访问对象属性变得非常直观。它支持点符号(.)和方括号([''])两种方式来访问属性。例如,如果在Action...

    struts2对Ognl的封装--PropertyAccessor

    在Struts2中,OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取和设置对象的属性。"struts2对Ognl的封装--PropertyAccessor"这个主题主要涉及Struts2框架如何处理OGNL表达式,特别是如何...

    struts2 ognl的用法

    ### Struts2中OGNL的使用详解 #### 一、OGNL简介 OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取或设置一个对象图中的属性。它在Struts2框架中扮演着极其重要的角色,是Struts2实现...

    Struts2之Ognl详解案例TextOgnl

    因此,在实际应用中,应确保对用户输入进行严格的校验和过滤,或者使用Struts2的安全插件来防止OGNL注入。 五、总结 OGNL在Struts2中扮演着关键角色,它简化了数据绑定和对象交互。然而,开发者也需要注意其潜在的...

    struts2中的ognl.jar

    - Struts2 ActionContext:OGNL与ActionContext紧密配合,ActionContext存储了请求相关的上下文信息,包括值栈和session等。 - 模板技术集成:FreeMarker、Velocity等模板引擎可以使用OGNL表达式来获取和操作数据...

    很全面的struts2_ognl总结

    OGNL(Object-Graph Navigation Language)是一种基于 Java 的表达式语言,Struts2 框架中使用 OGNL 来访问和操作 ValueStack 中的对象。在 Struts2 中,OGNL 是一个强大的工具,允许开发者访问和操作 ValueStack 中...

    Struts2 & OGNL

    OGNL(Object-Graph Navigation Language)是Struts2中的默认表达式语言,用于在视图和控制器之间传递数据。在这个主题中,我们将深入探讨Struts2与OGNL的整合以及它们在实际开发中的应用。 **Struts2框架概述** ...

Global site tag (gtag.js) - Google Analytics