action中model对象的赋值问题

本文详细介绍了Struts2框架的工作原理,特别是在线程安全性和Action实例管理方面。此外,还深入探讨了Struts2与Spring框架整合时的配置差异,以及如何处理模型对象的值栈和赋值问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 关于action

Struts2会为每个处理线程分配一个Action对象,将提交的参数注入到Action属性中,并调用Action的相关方法如execute()等完成业务逻辑,因此struts2的Action会有多个对象。处理完毕,线程结束,Action也会被抛弃,Struts2的Action是线程安全的。

当Struts单独使用时action使用Struts2自己负责;当使用Spring+Struts联合使用时,action实例使用Spring负责创建。两种情况下的配置文件也略有不同。

1.Struts单独使用时,配置中action的class属性属于全路径名。

2.当和Spring联合使用时,class属性属于相应bean的id.

2. action中模型(model)对象的赋值

model对象在action的初始化(拦截器执行之前已经初始化完毕)过程中被创建(通过action的构造函数)。当通过ModeDriven拦截器时,通过调用getModel()方法将model压入值栈。当调用action中的业务逻辑方法(如:designSurvey()方法)时,需要给模型对象赋值。但此时值栈中的模型对象仍是旧对象,所以涉及到model对象的赋值问题。

	public Survey designSurvey() {	
                this.model = surveyService(sid);
		return "designSurveyPage";
	}

2.1 使用paramsPrepareParamsStack和prepare拦截器

通过配置paramsPrepareParamsStack(prepare拦截器在ModeDriven拦截器之前)。使用prepare拦截器直接新模型对象赋给action中的模型。

	public void prepareDesignSurvey(){
		this.model = surveyService.getSurveyWithChildren(sid);
	}

	@Override
	public Survey getSurvey(Integer sid) {	
		return surveyDao.getEntity(sid);
	}
	
	/**
	 * 设计调查
	 */
	@Override
	public Survey getSurveyWithChildren(Integer sid) {
		// 使用this.getSurvey()方法而不直接使用getEntity()方法体现的高内聚低耦合的思想,因为
		//此处设计service和dao两个组件之间的调用,如果是组件内部可以之间完成的功能就不要调用另一组件的方法
		Survey s = this.getSurvey(sid);
		for(Page p : s.getPages()){
			p.getQuestions().size();
		}
		return s;
	}
	

此方法性能不好,因为当有多个model时就需要多个prepareXxx()方法,造成方法爆炸。

2.2  通过刷新机制

通过配置ModelDriven拦截器中refreshModelBeforeResult属性为true来实现当发现model为新model时自动刷新(可参考ModelDrivenInterface源代码),一般采用此种方法。

		<interceptors >
		<!-- 注册登录拦截器 -->
		<interceptor name="LoginInterceptor" class="com.xie.surveypark.struts2.interceptor.LoginInterceptor"></interceptor>
		<!-- 定义拦截器栈 -->
		<interceptor-stack name="mySurveyparkStack">
		    <interceptor-ref name="LoginInterceptor"></interceptor-ref>
		    <interceptor-ref name="defaultStack">
		         <param name="modelDriven.refreshModelBeforeResult">true</param>
		    </interceptor-ref>
		</interceptor-stack>
		</interceptors>




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值