浅谈Strut2如何对请求参数的封装

 更新时间:2017年12月26日 09:57:42   作者:hypmxy  
这篇文章主要介绍了浅谈Strut2如何对请求参数的封装,具有一定借鉴价值,需要的朋友可以参考下

众所周知,Strut2的Action类通过属性可以获得所有相关的值,如请求参数、Action配置参数、向其他Action传递属性值(通过chain结果)等等。要获得这些参数值,我们要做的唯一一件事就是在Action类中声明与参数同名的属性,在Struts2调用Action类的Action方法(默认是execute方法)之前,就会为相应的Action属性赋值。

要完成这个功能,有很大程度上,Struts2要依赖于ValueStack对象。这个对象贯穿整个Action的生命周期(每个Action类的对象实例会拥有一个ValueStack对象)。当Struts2接收到一个.action的请求后,会先建立Action类的对象实例,但并不会调用Action方法,而是先将Action类的相应属性放到ValueStack对象的顶层节点(ValueStack对象相当于一个栈)。只是所有的属性值都是默认的值,如String类型的属性值为null,int类型的属性值为0等。

在处理完上述工作后,Struts2就会调用拦截器链中的拦截器,当调用完所有的拦截器后,最后会调用Action类的Action方法,在调用Action方法之前,会将ValueStack对象顶层节点中的属性值赋给Action类中相应的属性。大家要注意,在这里就给我们带来了很大的灵活性。也就是说,在Struts2调用拦截器的过程中,可以改变ValueStack对象中属性的值,当改变某个属性值后,Action类的相应属性值就会变成在拦截器中最后改变该属性的这个值。

从上面的描述很容易知道,在Struts2的的Action类可以获得与属性同名的参数值就是通过不同的拦截器来处理的,如获得请求参数的拦截器是params,获得Action的配置参数的拦截器是staticParams等。在这些拦截器内部读取相应的值,并更新ValueStack对象顶层节点的相应属性的值。而ValueStack对象就象一个传送带,将属性值从一个拦截器传到了另一个拦截器(当然,在这其间,属性值可能改变),最后会传到Action对象,并将ValueStack对象中的属性的值终值赋给Action类的相应属性。

当我们在显示层使用EL表达式,不仅可以访问到EL表达式中11个隐藏对象里的属性,也能够访问到valueStack中的对象属性值,是因为struts2对HttpServletRequest做了进一步的封装.

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;
	}
}

总结

以上就是本文关于浅谈Strut2如何对请求参数的封装的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

相关文章

  • java序列化和serialVersionUID的使用方法实例

    java序列化和serialVersionUID的使用方法实例

    这篇文章主要介绍了java序列化和serialVersionUID的使用方法实例的相关资料,这里说明很详细的使用方法让你彻底学会,需要的朋友可以参考下
    2017-08-08
  • idea自带Jacoco/idea自动测试语句覆盖率方法(使用详解)

    idea自带Jacoco/idea自动测试语句覆盖率方法(使用详解)

    这篇文章主要介绍了idea自带Jacoco/idea自动测试语句覆盖率方法,本文给大家分享使用方法,通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • Java实现MySQL数据实时同步至Elasticsearch的方法详解

    Java实现MySQL数据实时同步至Elasticsearch的方法详解

    MySQL擅长事务处理,而Elasticsearch(ES)则专注于搜索与分析,将MySQL数据实时同步到ES,可以充分发挥两者的优势,下面我们就来看看如何使用Java实现这一功能吧
    2025-03-03
  • Java异常处理Guava Throwables类使用实例解析

    Java异常处理Guava Throwables类使用实例解析

    这篇文章主要为大家介绍了Java异常处理神器Guava Throwables类使用深入详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Collection stream使用示例详解

    Collection stream使用示例详解

    这篇文章主要介绍了Collection stream使用示例,stream流几乎可以完成对集合的任意操作,映射、去重、分组、排序、过滤等
    2022-12-12
  • mybatis plus实现分页逻辑删除

    mybatis plus实现分页逻辑删除

    这篇文章主要为大家介绍了mybatis plus实现分页逻辑删除的方式详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • java并发请求下数据插入重复问题的解决方法

    java并发请求下数据插入重复问题的解决方法

    现在遇到一个项目,移动设备存储数据,然后一起上传,那就出现了许多重复数据,这篇文章主要给大家介绍了关于java并发请求下数据插入重复问题的解决方法,需要的朋友可以参考下
    2021-11-11
  • java本服务如何调用本服务接口

    java本服务如何调用本服务接口

    这篇文章主要介绍了java本服务如何调用本服务接口问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • java语言求解兔子问题代码分析

    java语言求解兔子问题代码分析

    这篇文章主要介绍了Java语言求解兔子问题代码分析,具有一定借鉴价值,需要的朋友可以了解下。
    2017-12-12
  • StreamAPI多次消费一个stream代码实例

    StreamAPI多次消费一个stream代码实例

    这篇文章主要介绍了StreamAPI多次消费一个stream代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04

最新评论