值栈的结构:
右边放的是一个个对象。并且里面有一些对象。
Map的操作, put(k,V); Get(k)
Stack的操作是,push(obj) 压栈 ;pop(obj);
结合—————–
一:存数据的过程
上文中,我们说到Struts2 的拦截器。那么在拦截的过程中会先创建值栈,在值栈里面放了一些初始化的数据。例如request,session,application等等。 如果应用过程中想用的话,直接用#就可以getSeeion到。
也会在栈中放入action对象。
同时还会经过其它拦截器。它会继续在值栈中添加信息。比如参数拦截器会继续在值栈中添加参数信息。ModelDriven 拦截器是把model放到栈顶。
实现的时候,也就是在对应的action中去实现ModelDriven接口。例如:
public class RoleAction extends ActionSupport implements ModelDriven<Role>
其中接口里面只有唯一的一个接口方法。我们实现如下:
private Role model=new Role();
public Role getModel(){
return model;
}
然后下一个拦截器是params。封装参数
此时栈里面有这个model对象(id;name) action对象(id;age)
如果当前请求地址是:
Xx.action?id=3&name=ab&age=20&xx=00
注意:该地址中传过了4个参数。id,name,age,xx
那这里的封装参数就是把参数放到对象中,会先放到属性中。从栈顶开始找 , 找到了就不会往下找了。当放Id的时候,会先
到model中的Id,然后就会把这个参数放到对象中。接着开始处理name。最后xx在对象中并没有对应的属性。则不放到栈中,但依然能用#方式取到该值。
二:取数据
此时,相当于数据中心有了数据。接下来就是我们怎么去应用它。
Action中需要通过ActionContext对象,里面有一个getContext,getValueStack
然后在JSP中通过OGNL表达式获取。
最后,在注意一个取值顺序。
这样就是整个值栈的完整过程。需要注意值栈对象的作用范围是一个请求。