Struts学习之值栈的理解
2015-08-23 13:21
417 查看
转自:http://blog.csdn.net/hanxuemin12345/article/details/38559979
页面一个请求发送过来,依次经过一系列拦截器(处理公共部分,如:往数据中心(值栈)填充数据,所处理工作与业务无关),Action,Result。
![](http://img.blog.csdn.net/20140814161129639?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGFueHVlbWluMTIzNDU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
——一个请求过来,首先创建一个值栈对象,经过初始化,然后在Map和对象栈中放入一些数据:
![](http://img.blog.csdn.net/20140814161202305?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGFueHVlbWluMTIzNDU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
对象栈中:action对象,…
——初始化完之后,还会经过很多拦截器,其中一个拦截器ModelDriven(封装model,把model放入对象栈的栈顶),一个拦截器Params(参数封装,放入参数);
Public class RoleActionextends ActionSupport implements ModelDriven<Role>{
private Role model = new Role();
private Role getModel(){ //获取栈顶的model对象
return model;
}
}
ModelDriven的作用:把model对象放入对象栈栈顶(原来栈顶是action,现在栈顶是model了)
如何封装?——做了两件事:第一,先到对象栈中封装;第二,再到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中均可从中获取并使用);
.put(k,v);//Map中放入数据
.get(k);//Map中获取数据
或:ActionContext.getContext.getValueStack()
.put(k,v);//Map中放入数据
.get(k);//Map中获取数据
.push(obj);//向对象栈中放入数据
.pop();//从对象栈中获取数据
![](http://img.blog.csdn.net/20140814161237718?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGFueHVlbWluMTIzNDU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
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值,找到后就返回。
例子:
![](http://img.blog.csdn.net/20140814163146831?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGFueHVlbWluMTIzNDU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
(1)页面一个请求过来,Struts2中依次经过了哪几个过程?
—— 一系列拦截器——>Action——>Request;
——ModelDriven和Params拦截器分别的主要作用;
(2)值栈的概念?
——值栈的结构:对象栈、Map;
——对象栈、Map分别存放什么数据;
(3)(1)和(2)是如何结合在一起的?
——请求过来,一开始经过拦截器,初始化并创建对象栈,经过ModelDriven和Params拦截器时,分别往值栈中封装对象和封装参数,分别封装到相应的地方,此时数据中心中有就有了数据。
以上均是拦截器为我们做的工作,我们只需写Action(通过ActionContext()操作Map,操作对象栈)和Jsp(通过OGNL表达式获取栈中数据)即可。
页面一个请求发送过来,依次经过一系列拦截器(处理公共部分,如:往数据中心(值栈)填充数据,所处理工作与业务无关),Action,Result。
1,经过一系列拦截器
介绍其中的两个拦截器:ModelDriven、Params;——一个请求过来,首先创建一个值栈对象,经过初始化,然后在Map和对象栈中放入一些数据:
(1)值栈的结构:
(2)在Map和对象栈中分别存入什么数据:
Map中:request=…,session=…,application=…,attr=…,parameters=…;对象栈中:action对象,…
——初始化完之后,还会经过很多拦截器,其中一个拦截器ModelDriven(封装model,把model放入对象栈的栈顶),一个拦截器Params(参数封装,放入参数);
(1)经过…拦截器
(2)再经过ModelDriven拦截器:
Action中实现ModelDriven<>,并实现它的方法:Public class RoleActionextends ActionSupport implements ModelDriven<Role>{
private Role model = new Role();
private Role getModel(){ //获取栈顶的model对象
return model;
}
}
ModelDriven的作用:把model对象放入对象栈栈顶(原来栈顶是action,现在栈顶是model了)
(3)经过…拦截器
(4)再经过Params拦截器
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中均可从中获取并使用);
2,思考:值栈对象作用范围是什么?
——一次请求。因为每发送一个请求过来,都要经过这样一系列过程:拦截器(往值栈中压入数据)——>Action——>Request3,细节扩充:
(1)由值栈对象,如何操作Map?
——ActionContext.getContext().put(k,v);//Map中放入数据
.get(k);//Map中获取数据
或:ActionContext.getContext.getValueStack()
.put(k,v);//Map中放入数据
.get(k);//Map中获取数据
(2)有了值栈对象,如何操作对象栈?
——ActionContext.getContext().getValueStack().push(obj);//向对象栈中放入数据
.pop();//从对象栈中获取数据
(3)所以,值栈中有了对象,Action中如何使用栈中的数据:
——通过ActionContext()操作Map,操作对象栈(4)所以,值栈中有了对象,jsp中如何使用栈中的数据:
——通过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值,找到后就返回。
例子:
4,总结
通过此篇博客,我们需要了解什么?(1)页面一个请求过来,Struts2中依次经过了哪几个过程?
—— 一系列拦截器——>Action——>Request;
——ModelDriven和Params拦截器分别的主要作用;
(2)值栈的概念?
——值栈的结构:对象栈、Map;
——对象栈、Map分别存放什么数据;
(3)(1)和(2)是如何结合在一起的?
——请求过来,一开始经过拦截器,初始化并创建对象栈,经过ModelDriven和Params拦截器时,分别往值栈中封装对象和封装参数,分别封装到相应的地方,此时数据中心中有就有了数据。
以上均是拦截器为我们做的工作,我们只需写Action(通过ActionContext()操作Map,操作对象栈)和Jsp(通过OGNL表达式获取栈中数据)即可。
相关文章推荐
- MyEclipse中文乱码问题
- 关于Myeclipse导入ExtJS出错的问题解决:
- 更改myeclipse中的@author
- JAVA2游戏编程——Button(1)
- Struts学习之自定义结果集
- java对文件新建,删除,复制,剪切,重命名
- java线程池的使用,实现大量数据的更新操作
- 阿里巴巴2015秋季笔试研发工程师JAVA
- Struts学习之集成Ajax
- java反射学习总结
- SSH三大框架整合后的配置文件详解
- Eclipse常用快捷键
- 在Sublime Text 3中配置编译和运行Java程序
- 在eclipse.ini中为eclipse指定jdk启动
- HDU 5351(MZL's Border-Java的BigInteger类)
- Java 线程详解
- java类型转换
- 基于Java的打包jar、war、ear包的作用与区别详解
- java-多线程-同步的优化
- 阿里校招-java研发 题目