1.值栈在开发中的应用
主流应用:值栈 解决action向jsp传递数据问题
问题:action向jsp页面携带数据,都是什么样的数据
1.文本(字符串)
1.fieldError 校验数据错误信息提示
2.actionError 关于逻辑操作时的错误信息(例如登陆失败)
3.message 就是一个信息
2. 复杂数据
1.
需要注意的是这是将集合中迭代出来的每一个元素起个名称叫做user,而user是存储在context中的,不再root中。如果user要用就必须要写#号的
username:
password:
注意: 如果我们在使用进行迭代时,没有给迭代出的元素起名
username:
password:
用set存
username:
password:
关于默认压入到valueStack中的数据
1.访问的action对象会被压入到valueStack中。
action会被默认压入值栈,在拦截器调用前就压了。
Action如果想传递数据给jsp,只有将数据保存到成员变量,并且提供get方法就可以了
ActionContext是Action的上下文,Struts2在其中自动保存了一些Action执行过程中一些所需的对象,比如session、parameters、等
Struts2会根据每个执行HTTP请求的线程来创建对应的ActionContext,即一个线程有一个唯一的ActionContext。因此,使用者可以使用静态方法ActionContext.getContext()来获取当前线程的ActionContext,也正是由于这个原因,使用者不用操心让Action是线程安全的。
ActionContext本身的数据结构是映射结构,即一个Map,用key来映射value,所有使用者完全可以像使用Map一样来使用它。
Struts2本身在其中放入的数据有ActionInvocation、application,locale,action的name、request的参数,Http的session以及值栈等,可以参考API。
需要注意的是,它仅在由于request而创建的线程中有效(因为request发起时,才创建对用的actionContext),而在服务器启动的线程中(比如fliter的init方法)无效。
ValueStack于ActionContext的练习与区别
相同点:他们都是在一次Http请求的范围中使用的,即他们的生命周期都是一次请求。
不同点:值栈是栈的结构,ActionContext是映射Map的结构
联系:ValueStack.getContext()方法得到的Map其实就是ActionContext的map。
所以ValueStack和ActionContext本质上可以相互获得。
从actionContext中获取数据
put—–这个都是存到了request中了
1.什么是valueStack
valueStack主要是将action数据携带到页面上,通过ognl获取数据
2.valueStack和ActionContext是什么关系?
ActionContext ctx=ActionContext.getContext();
if(ctx!=null){
stack=ctx.getValueStack();
}
valueStack是每一次请求时,都会创建。
在ActionContext中持有了valueStack的引用。
3.如何获得值栈对象
对于valueStack获取有两种方式:
1.通过request获取
2.通过ActionContext获取
5.如何向valueStack中存储数据
主要有两个方法
1.push (Object obj)底层就是root.add(0,obj)将数据存到栈顶
2.set(String name,Object obj);—》底层就是将数据封装到HashMap中,在将这个HashMap通过push存贮