valueStack也被称作值栈对象.. 当用户访问Action,都会创建一个Action对象,ActionContext对象、valueStack对象.. 将valueStack放进request域中,传入JSP页面(key: struts.valueStack) JSP页面就可以使用OGNL表达式获取值栈中的数据了! (vs1 == vs2);//true } valueStack内部存储结构 上面已经说了,用户访问Action时,会创建Action对象,valueStack对象。 Struts2内部会将Action对象存到valueStack对象之中…那么valueStack的存储结构是什么样的呢???我们来看看 ? valueStack存储着OgnlContext对象。
OGNL表达式功能强大,struts2默认采用OGNL表达式访问Action的数据,实际上是通过ValueStack对象来访问的Action。 ValueStack封装了Action的数据,并允许JSP通过OGNL来对其进行访问。 7.ValueStack原理 ? 8.EL表达式如何访问ValueStack struts2将数据封装与ValueStack,默认使用OGNL取值。 struts2也支持使用EL表达式取值,那么EL是从哪里取的值呢,如何取的值呢? ---实际上,EL也是从ValueStack中取的值。 默认的取值范围是page,request,session,application ---struts2重写了request的getAttribute方法,先试图从原始request中取值,如果没取到再在ValueStack
2、 ValueStack此对象主要是由OGNL框架实现,具体的实现类是com.opensymphony.xwork2.util.ValueStack;它主要包含了一个Map类型的Context对象, 要完成这个功能,有很大程度上,Struts 2要依赖于ValueStack对象。这个对象贯穿整个Action的生命周期(每个Action类的对象实例会拥有一个ValueStack对象)。 当Struts2接收到一个.action的请求后,会先建立Action类的对象实例,并且将Action类的对象实例压入ValueStack对象中(实际上,ValueStack对象相当于一个栈),而ValueStack 从这一点可以看出,ValueStack对象就象一个传送带,当客户端请求 .action时,Struts2在创建相对应Action对象后就将Action对象放到了ValueStack传送带上,然后ValueStack 这个过程从逻辑上说需要分成两步来完成: 1、 对于每个请求,都建立一个与相应Action对应的ActionContext作为OGNL的上下文环境和ValueStack,并且把Action压入ValueStack
OGNL中的上下文即struts2中的actionContext OGNL中的root即struts2中的valueStack ctionContext和valueStack是什么,他们之间什么关系 VALUE_STACK:值栈,存放着valueStack对象,也就是说,通过ActionContext能够获取到valueStack。 action中手动向valueStack中放数据。 3.3、ActionContext和valueStack的关系(重要) 也就是说,通过valueStack可以获取到actionContext,通过ActionContext也可以获取到valueStack valueStack是对root进行操作,而actionContext是对context进行操作。
二、值栈概述 2.1 什么是值栈 ValueStack是Struts的一个接口,字面意义为值栈, OgnlValueStack是ValueStack的实现类,客户端发起一个请求 struts2架构会创建一个 ActionContext获取值栈对象】:常用方式 //第一种方式:获取值栈对象, ActionContext context=ActionContext.getContext(); ValueStack stack=context.getValueStack(); 【通过request域获取值栈对象】 //第二种方式:获取值栈对象 ValueStack stack2=(ValueStack )ServletActionContext.getRequest().getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY); 2.4 操作值栈
6:ValueStack, 即值栈对象(根元素的值存储在root中,非跟元素的值存储在context中)。 (1):值栈对象是整个struts数据存储的核心,或者叫中转站。 (3):(key: struts.valueStack); 开发者只需要通过ActionContext对象就可以访问struts的其他的关键对象。 vs = (ValueStack) request.getAttribute("struts.valueStack"); 30 31 //获取值栈对象,方式二: 32 ActionContext ac = ActionContext.getContext(); 33 ValueStack vs2 = ac.getValueStack( -- 页面: 必须要拿到ValueStack --> 19
解说OGNL比先了解ValueStack(值栈),Struts2核心. 2.值栈是相应每个请求对象的轻量级的内存数据中心。 (把一次请求相关的所有数据所有保存到ValueStack对象). (2).ValueStack贯穿整个Action的生命周期:每一个Action类的实例都拥有一个ValueStack对象。 (3).Struts2框架把ValueStack对象保存在名为“struts.valueStack”的request属性中。 request.setAttribute(“struts.valueStack”,vs); 3.ValueStack内部结构 ValueStack中存两个属性: 1.root:根, 类型 CompoundRoot (“struts.valueStack”); 方式2: ValueStack vs = ActionContext.getContext().getValueStack(); 5
在每次动作执行前,核心控制器StrutsPrepareAndExecuteFilter都会创建一个ActionContext和ValueStack对象。且每次动作访问都会创建。 对象的方法&存数据 //1 使用ActionContext对象获取 ValueStack valueStack = ActionContext.getContext().getValueStack() ; valueStack.push(new Student("LIANG","123456")); //获取数据 方法一用ActionContext对象获取Request 获取值栈 Map<String ,Object> requestMap = (Map<String,Object>)ActionContext.getContext().get("request"); ValueStack valueStack1 = (ValueStack)requestMap.get("struts.valueStack"); //第三种获取值栈的方法 使用ServletActionContext获取request 获取值栈
如清晰度低,可转PC网页观看高清版本: http://v.qq.com/x/page/q0567vth0ol.html ValueStack 值栈:(接口) 在filter执行后,初始化对象,封装数据
ValueStack实际上就是一个容器。它由Struts框架创建,当前端页面如jsp发送一个请求时,Struts的默认拦截器会将请求中的数据进行封装,并入ValueStack的栈顶。 ValueStack是Struts2的一个接口,字面意义为值栈,OgnlValueStack是 ValueStack的实现类,客 户端发起一个请求,struts2架构会创建一个action实例同时创建一个 通过源码查看到:当请求过来的时候,执行过滤器中的doFilter方法,在这个方法中创建ActionContext,在创建ActionContext的过程中,创建ValueStack对象,将ValueStack 对象传递给ActionContext对象,所以可以通过ActionContext对象获取ValueStack对象。 vs1 =ActionContext.getContext().getValueStack(); // 第二种 通过request对象获取 ValueStack vs2 = (ValueStack
ValueStack实际上就是一个容器。 Struts框架中的数据就都保存到了ValueStack中,各种域也是被包含在值栈当中,存到域当中只能在页面中把它取出来存到值栈当中可以在任何地方取出数据 ValueStack贯穿整个action的生命周期 对象 将valueStack对象传递给ActionContext对象。 获取值栈 ValueStack valueStack = ActionContext.getContext().getValueStack(); 根区 // getRoot()可以省略 Student stu = new Student(); valueStack.getRoot().push(stu); valueStack.getRoot().pop(); 非根区 ActionContext.getContext
key.contains("#")) { try { // If not found, then try the ValueStack ---- 总结: ValueStack(值栈): I. 可以从 ActionContext 中获取值栈对象 II. 贯穿整个 Action 的生命周期(每个 Action 类的对象实例都拥有一个 ValueStack 对象). 相当于一个数据的中转站. 在其中保存当前 Action 对象和其他相关对象. Struts 框架把 ValueStack 对象保存在名为 “struts.valueStack” 的请求属性中 ? ---- 在 ValueStack 对象的内部有两个逻辑部分: ObjectStack: Struts 把 Action 和相关对象压入 ObjectStack 中 ContextMap: Struts
== 'undefined' ){ valueStack.push(calculator(tmpOperator, valueStack.pop(), valueStack.pop (calculator(operatorStack.pop(), valueStack.pop(), valueStack.pop())); } == 'undefined' ){ valueStack.push(calculator(tmpOperator, valueStack.pop(), valueStack.pop()) == 'undefined' ){ valueStack.push(translate(tmpOperator, valueStack.pop(), valueStack.pop == 'undefined' ){ valueStack.push(translate(tmpOperator, valueStack.pop(), valueStack.pop()))
要完成这个功能,有很大程度上,Struts 2要依赖于ValueStack对象。这个对象贯穿整个Action的生命周期(每个Action类的对象实例会拥有一个ValueStack对象)。 当 Struts 2接收到一个.action的请求后,会先建立Action类的对象实例,但并不会调用Action方法,而是先将Action类的相应属性放到 ValueStack对象的顶层节点(ValueStack 而ValueStack对象 就象一个传送带,将属性值从一个拦截器传到了另一个拦截器(当然,在这其间,属性值可能改变),最后会传到Action对象,并将ValueStack对 象中的属性的值终值赋给Action 要完成这个功能,有很大程度上,Struts 2要依赖于ValueStack对象。这个对象贯穿整个Action的生命周期(每个Action类的对象实例会拥有一个ValueStack对象)。 而ValueStack对象 就象一个传送带,将属性值从一个拦截器传到了另一个拦截器(当然,在这其间,属性值可能改变),最后会传到Action对象,并将ValueStack对 象中的属性的值终值赋给Action
1、存数据: 需要熟悉 ActionContext类 和 ValueStack接口 的 API 。框架为我们存数据。 1.2、利用 ValueStack 存数据 a、如何获取ValueStack呢? ? b、ValueStack中的getRoot()方法。 ? b、取contextMap里面ValueStack中对象的属性:直接写属性名 ? ? 如果遇有对象的属性的名称相同(属性名同名),可以通过OGNL表达式,选择查找的起始位置。 2.2、ValueStack的其他方法 a、setValue方法 ? ? ? ? b、set方法 ? ? ? 中查找了,返回了ValueStack中栈顶对象name属性的值。
当客户端每次发送请求到action,都会被前端控制器拦截,会在里面创建ValueStack(特点 : 访问一次创建一次,在action之前创建) 创建完ValueStack后,会将页面的参数数据, ValueStack是一个接口,我们玩的是它的实现类 : ognlValueStack ValueStack的结构 : root区域 : list context区域 : map 当客户端每次发送请求到action,都会被前端控制器拦截,会创建ActionContext 然后再创建ValueStack,并且会把创建封装好的ValueStack放在ActionContext ("struts.valueStack",valueStack); 通过request对象获取 : ValueStack valueStack2 = (ValueStack)ServletActionContext.getRequest ().getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY); 操作ValueStack 往ValueStack
ValueStack和OGNL ValueStack是保存与请求处理相关的所有数据的一个存储区域。可以将其当做一个便签,Struts 2将所有相关的数据集中保存在ValueStack中。 定义 Struts 2使用ValueStack作为请求处理过程中所需的应用程序域数据的***存储区域***。数据被放入ValueStack为请求处理作准备。在动作执行过程中,数据在这里被操作。 更准确地说,它是一个允许你引用或者操作ValueStack中的数据的表达式语言. 定义 OGNL是一个用来引用、操作ValueStack中数据的强大的表达式语言(还不止于此)。 拦截器和结果都可以使用OGNL表达式语言来指向ValueStack中的值,ValueStack中的数据跟着处理请求经过所有阶段,它贯穿框架的整个过程。 在框架里的多个地方都使用OGNL来引用、操作ValueStack中的数据。
那么,为什么user对象会在ValueStack中呢?它是什么时候被压入ValueStack的呢?答案是:ModelDrivenInterceptor。 关键的原因是在执行到updateInput之前,user对象(在getMode()方法中创建的对象)被压到ValueStack中,这时候,UserAction和ValueStack都指向同一个user对象 ValueStack中是旧的user对象,而UserAction中是新的user对象! 理解上述问题很重要,当你理解了问题,那么问题的解决方法就可以有很多了: 比如,你可以把新对象的属性拷贝到旧对象上;比如,你可以先把旧对象从ValueStack中移除,然后再把新对象压入ValueStack struts2的解决方案就是:先把旧的model对象从ValueStack中移除,然后再把新的model对象压入ValueStack!
user.name", map, user)); } } 在struts2中可以通过ognl表达式获取数据,在strut2将ActionContext对象作为ognl的上下文对象,ValueStack ValueStack是一个栈接口,称为值栈。在一个请求来时会创建一个ValueStack,将Action的属性值放入值栈中。创建Action处理类后将值栈中的属性值设置到处理类中上。 Action中的属性值会放入到ValueStack。在请求结束时ValueStack消亡。
ActionContext; 4 import com.opensymphony.xwork2.ActionSupport; 5 import com.opensymphony.xwork2.util.ValueStack "studentName:" + studentName); 28 System.out.println("password:" + password); 29 // ValueStack ActionContext.getContext().getValueStack(); 30 ActionContext context = ActionContext.getContext(); 31 ValueStack "studentName:" + studentName); 21 System.out.println("password:" + password); 22 // ValueStack ActionContext.getContext().getValueStack(); 23 ActionContext context = ActionContext.getContext(); 24 ValueStack