转自:http://blog.csdn.net/hanxuemin12345/article/details/38559979session
页面一个请求发送过来,依次通过一系列拦截器(处理公共部分,如:往数据中心(值栈)填充数据,所处理工做与业务无关),Action,Result。app
介绍其中的两个拦截器:ModelDriven、Params;spa
——一个请求过来,首先建立一个值栈对象,通过初始化,而后在Map和对象栈中放入一些数据:.net
Map中:request=…,session=…,application=…,attr=…,parameters=…;xml
对象栈中:action对象,…对象
——初始化完以后,还会通过不少拦截器,其中一个拦截器ModelDriven(封装model,把model放入对象栈的栈顶),一个拦截器Params(参数封装,放入参数);blog
Action中实现ModelDriven<>,并实现它的方法:get
Public class RoleActionextends ActionSupport implements ModelDriven<Role>{博客
private Role model = new Role();io
private Role getModel(){ //获取栈顶的model对象
return model;
}
}
ModelDriven的做用:把model对象放入对象栈栈顶(原来栈顶是action,如今栈顶是model了)
Params拦截器的做用:封装参数。
如何封装?——作了两件事:第一,先到对象栈中封装;第二,再到Map中封装;
例子:假如,如今对象栈中有model对象在(含有id、name属性)在栈顶,action对象(含有id、age属性);页面访问地址:xx.action?id=3&name=ab&age=20&xx=00;
通过Params拦截器时,它如何将参数封装?
——先从栈顶开始找,依次找到id、name、age属性,经过各自的Set方法依次设值id=3,name=ab,age=20(注:虽然对象栈中有两个id属性,可是因为model对象的id属性在栈顶,因此找到此id属性就设值,不会继续往下找),可是对象栈中没有xx属性,因而栈中就没有这个参数了,经过对象栈就没法获得xx参数,可是Map中有parameters,能够把全部参数放入parameters中,不管在对象栈中有没有写属性,在parameters中都能获得;
——通过一系列拦截器以后,此时数据中心就有了数据,那咱们就能够从中获取数据(Action、Jsp中都可从中获取并使用);
——一次请求。由于每发送一个请求过来,都要通过这样一系列过程:拦截器(往值栈中压入数据)——>Action——>Request
——ActionContext.getContext()
.put(k,v);//Map中放入数据
.get(k);//Map中获取数据
或:ActionContext.getContext.getValueStack()
.put(k,v);//Map中放入数据
.get(k);//Map中获取数据
——ActionContext.getContext().getValueStack()
.push(obj);//向对象栈中放入数据
.pop();//从对象栈中获取数据
——经过ActionContext()操做Map,操做对象栈
——经过OGNL表达式获取
OGNL表达式的格式和语法:
格式:
(1)在Struts.xml中的格式为:${ongl};
(2)在Jsp中的格式为:%{ongl};
(注:只能写在Struts2的自定义标签的属性中)
语法:
user =findValue("user");//从栈中获取user属性
#user = map.get("user"); //从Map中获取user对象
#user.name=map.get("user").getName();//从Map中获取user对象的name属性
(findvalue(expr))的查找顺序:
(1)从对象栈中查找指定名称的属性,从栈顶开始向下找,找到后就返回;
(2)若是从对象栈中没有找到属性,则从Map中查找对应的key值,找到后就返回。
例子: