Strut 2如何对请求参数的封装
来源:互联网 发布:智慧树网络选修课答案 编辑:程序博客网 时间:2024/05/19 03:24
众所周知,Strut 2的Action类通过属性可以获得所有相关的值,如请求参数、Action配置参数、向其他Action传递属性值(通过chain结果)等等。要获得 这些参数值,我们要做的唯一一件事就是在Action类中声明与参数同名的属性,在Struts 2调用Action类的Action方法(默认是execute方法)之前,就会为相应的Action属性赋值。
要完成这个功能,有很大程度上,Struts 2要依赖于ValueStack对象。这个对象贯穿整个Action的生命周期(每个Action类的对象实例会拥有一个ValueStack对象)。当 Struts 2接收到一个.action的请求后,会先建立Action类的对象实例,但并不会调用Action方法,而是先将Action类的相应属性放到 ValueStack对象的顶层节点(ValueStack对象相当于一个栈)。只是所有的属性值都是默认的值,如String类型的属性值为 null,int类型的属性值为0等。
在处理完上述工作后,Struts 2就会调用拦截器链中的拦截器,当调用完所有的拦截器后,最后会调用Action类的Action方法,在调用Action方法之前,会将 ValueStack对象顶层节点中的属性值赋给Action类中相应的属性。大家要注意,在这里就给我们带来了很大的灵活性。也就是说,在Struts 2调用拦截器的过程中,可以改变ValueStack对象中属性的值,当改变某个属性值后,Action类的相应属性值就会变成在拦截器中最后改变该属性 的这个值。
从上面的描述很容易知道,在Struts 2的的Action类可以获得与属性同名的参数值就是通过不同的拦截器来处理的,如获得请求参数的拦截器是params,获得Action的配置参数的拦 截器是staticParams等。在这些拦截器内部读取相应的值,并更新ValueStack对象顶层节点的相应属性的值。而ValueStack对象 就象一个传送带,将属性值从一个拦截器传到了另一个拦截器(当然,在这其间,属性值可能改变),最后会传到Action对象,并将ValueStack对 象中的属性的值终值赋给Action类的相应属性 。
当我们在显示层使用EL表达式,不仅可以访问到EL表达式中11个隐藏对象里的属性,也能够访问到valueStack中的对象属性值,是因为struts2对HttpServletRequest做了进一步的封装.
[java] view plaincopy
[java] view plaincopy
public class StrutsRequestWrapper extends HttpServletRequestWrapper {
public StrutsRequestWrapper(HttpServletRequest req) {
super(req);
}
public Object getAttribute(String s) {
......
ActionContext ctx = ActionContext.getContext();
Object attribute = super.getAttribute(s);//先从request范围获取属性值
if (ctx != null) {
if (attribute == null) {//如果从request范围没有找到属性值,即从ValueStack中查找对象的属性值
......
ValueStack stack = ctx.getValueStack();//获取valueStack对象
attribute = stack.findValue(s);//从valueStack中的对象中查找指定的属性值
......
}
}
return attribute;
}
}
要完成这个功能,有很大程度上,Struts 2要依赖于ValueStack对象。这个对象贯穿整个Action的生命周期(每个Action类的对象实例会拥有一个ValueStack对象)。当 Struts 2接收到一个.action的请求后,会先建立Action类的对象实例,但并不会调用Action方法,而是先将Action类的相应属性放到 ValueStack对象的顶层节点(ValueStack对象相当于一个栈)。只是所有的属性值都是默认的值,如String类型的属性值为 null,int类型的属性值为0等。
在处理完上述工作后,Struts 2就会调用拦截器链中的拦截器,当调用完所有的拦截器后,最后会调用Action类的Action方法,在调用Action方法之前,会将 ValueStack对象顶层节点中的属性值赋给Action类中相应的属性。大家要注意,在这里就给我们带来了很大的灵活性。也就是说,在Struts 2调用拦截器的过程中,可以改变ValueStack对象中属性的值,当改变某个属性值后,Action类的相应属性值就会变成在拦截器中最后改变该属性 的这个值。
从上面的描述很容易知道,在Struts 2的的Action类可以获得与属性同名的参数值就是通过不同的拦截器来处理的,如获得请求参数的拦截器是params,获得Action的配置参数的拦 截器是staticParams等。在这些拦截器内部读取相应的值,并更新ValueStack对象顶层节点的相应属性的值。而ValueStack对象 就象一个传送带,将属性值从一个拦截器传到了另一个拦截器(当然,在这其间,属性值可能改变),最后会传到Action对象,并将ValueStack对 象中的属性的值终值赋给Action类的相应属性 。
当我们在显示层使用EL表达式,不仅可以访问到EL表达式中11个隐藏对象里的属性,也能够访问到valueStack中的对象属性值,是因为struts2对HttpServletRequest做了进一步的封装.
[java] view plaincopy
[java] view plaincopy
public class StrutsRequestWrapper extends HttpServletRequestWrapper {
public StrutsRequestWrapper(HttpServletRequest req) {
super(req);
}
public Object getAttribute(String s) {
......
ActionContext ctx = ActionContext.getContext();
Object attribute = super.getAttribute(s);//先从request范围获取属性值
if (ctx != null) {
if (attribute == null) {//如果从request范围没有找到属性值,即从ValueStack中查找对象的属性值
......
ValueStack stack = ctx.getValueStack();//获取valueStack对象
attribute = stack.findValue(s);//从valueStack中的对象中查找指定的属性值
......
}
}
return attribute;
}
}
阅读全文
0 0
- Strut 2如何对请求参数的封装
- Struts2如何封装请求参数
- Struts2如何封装请求参数
- Struts2如何封装请求参数
- struts2的请求参数封装
- Strut 2的标签库
- Strut 2的值栈
- 自己对网络请求进行封装,block作参数
- Java URLConnection请求的参数进行封装
- 把请求的参数封装为xml
- MKNetworkKit对网络请求的完美封装
- Struts2 封装请求参数
- 项目请求参数封装
- iOS 如何封装嵌套的SOAP请求
- 对get请求的URL 参数排序
- SpringMVC 对请求参数的设置
- Spring MVC如何接收浏览器传递来的请求参数--request--形参--实体类封装(类比Struts2模型驱动)
- Retrofit2 封装统一请求参数
- 95. Unique Binary Search Trees II
- [leetcode] 406. Queue Reconstruction by Height
- JS获取一段时间的日期(获取时间轴日期数组)
- chrome插件相关
- 【动态规划】Leetcode编程题解:523. Continuous Subarray Sum Add to List
- Strut 2如何对请求参数的封装
- 利用jquery ui 实现拖拽
- 开发知识点,个人使用
- 进行拼音搜索过滤,没办法更新视图的问题(vue)
- python 字符编码与解码——unicode、str和中文:UnicodeDecodeError: 'ascii' codec can't decode
- [译] 理解 LSTM 网络
- GIT基本用法介绍
- iOS开发OC基本语法、类和对象、三大特性
- 解决python3.X PIL导入出错问题