看书,对ActionContext、ValueStack、Stack Context这三个词有点模糊,特从网上搜罗了下,也不知道哪些对哪些错,欢迎大家留言讨论:
看源码你就会发现,ActionContext这个类中有一个变量:
Map context,
实际上调用ActionContext的put,get 就相当于调用context的相就方法,你在页面上通过获取的就相当于调用context.get("request"),context.get("attr"),而你通过ac.put("list", List)也只能通过ac.get("list")获得。
而ActionContext.getValueStack()相当于调用context.get(OgnlValueStack.VALUE_STACK)所获取的与通过ActionContext.get("request")获取的是不一样的东西
=======================================================================================
ActionContext
一次Action调用都会创建一个ActionContext
调用:ActionContext context = ActionContext.getContext()
ValueStack
由OGNL框架实现
可以把它简单的看作一个List
Stack Object:放入stack中的对象,一般是action。
Stack Context(map):stack上下文,它包含一些列对象,包括request/session/attr/application map等。
EL:存取对象的任意属性,调用对象的方法,遍历整个对象结构图
=======================================================================================
ActionContext是Action上下文
可以得到request session application
ValueStack是值栈 存放表单中的值
Stack Context 栈上下文 也是用来存值的
=======================================================================================
你可以通过在页面中添加<s:debug/>标签察看ValueStack 和Stack Context中有哪些具体的内容。ValueStack里面的东西先入后出,很多没有id的元素使用完之后就退栈了。
StackContext提供了一些命名对象,这些命名对象与根对象无关,访问这些对象需要使用#前缀指名。比如这里面存在:parameters对象,request对象, session对象,application对象等等。
=======================================================================================
value stack contents ognl 值栈
stack context action上下文
action上下文是一个map对象,通过#key获得对象内容,在#request又可以得到值栈,值栈里存储的是一些action里的变量
于是获得action变量内容有三种方式
1,从值栈中直接获得
<s:property value="type"/>
${type }
2,从action上下文获得值栈的属性
<s:property value="#request['type']"/>或者<s:property value="#request.type"/>
=======================================================================================
1) ValueStack 可以用 request.getAttribute("struts.valueStack") 取得的一个 com.opensymphony.xwork2.util.OgnlValueStack 实例,它实现为一个栈,有 peek()、pop()、push(obj) 方法。
2) Stack Context 是在前面的 ValueStack 的上下中的一个 java.util.Stack 实例:
//stack 为 ValueStack 实例,COMPONENT_STACK="__component_stack"
// org.apache.struts2.components.Component.getComponentStack() 中的代码
Stack componentStack = (Stack) stack.getContext().get(COMPONENT_STACK);
分享到:
相关推荐
ActionContext提供了在Action、Servlet、ValueStack以及其他的Struts2组件之间传递数据的桥梁。在这个“JavaEE ActionContext存取数据示例”中,我们将深入探讨ActionContext的使用方法及其与OGNL(Object-Graph ...
精简全面讲解Struts 2.0Struts2产生背景 工作原理 实现步骤 标签 命名空间 转换器 国际化 输出 令牌机制 拦截器 表单校验(jQuery.validate验证框架) ...OGNL(ActionContext StackContext ValueStack区别)
ValueStack stack = context.getValueStack_r(); attribute = stack.findValue(name); } return attribute; // 返回最终找到的属性值 } } ``` #### 六、OGNL表达式在List和Map中的应用 OGNL不仅支持简单的...
获取到参数后,拦截器会创建一个Map对象(contextMap)来保存ActionContext中的context Map,即OgnlContext对象,然后通过ac.getValueStack()获取ValueStack。ValueStack是OGNL(Object-Graph Navigation Language)...
1. **通过ActionContext**: `ValueStack valueStack = ActionContext.getContext().getValueStack();` 2. **通过ServletActionContext**: `ValueStack valueStack = ServletActionContext.getValueStack...
ValueStack stack = ActionContext.getContext().getValueStack(); // 将对象压入栈顶 stack.push(new User("John", "Doe")); ``` - **取出数据**: ```java // 从栈顶取出对象 User user = (User) stack....
Stack Context是ValueStack的一部分,它包含了一些上下文相关的数据,如ActionContext,提供了对请求、响应、session、应用上下文的访问。 11. **Action总结** Action是Struts2的主要业务逻辑载体,它负责处理...
ValueStack stack = ActionContext.getContext().getValueStack(); Map, Object> context = new HashMap(); context.put("key1", "This is key1"); context.put("key2", "This is key2"); stack.push(context);...
OgnlValueStack stack = (OgnlValueStack) request.get("struts.valueStack"); HttpServletResponse response = (HttpServletResponse) stack.findValue("response"); // 使用 response 对象 } } ``` 方法 3:...
默认情况下,Struts2通过Action上下文(ActionContext)的ValueStack来查找对应的转换器。如果找不到内置的转换器,我们就可以提供自定义的转换器。 自定义转换类需要继承Struts2提供的`org.apache.struts2.util....