首页 > 代码库 > struts2 模型赋值问题和懒加载问题

struts2 模型赋值问题和懒加载问题

模型赋值问题:


首先需要说明的是:Action在请求到达ActionProxy时已经创建出来了,并且相应的创建了一个值栈。




在拦截器到达之前这个图片已经OK了,Action已经创建,并且压入了值栈vs,而且model对象也已经初始化。


模型驱动(ModelDriven)从Action取出模型对象并把它压入栈顶


在执行完所有的拦截器后开始调用Action方法,并对模型进行赋值,(这个从service取出的新模型对象并未压入值栈)但是此时值栈中的模型对象还是旧模型,所以jsp中引用的还是旧模型的对象(旧模型中是一个初始化后并未赋值的对象)。


struts2的action中为model赋值的问题:
---------------------------------------
1.手动压栈.
1.耦合度高.
2.不推荐直接操作vs
3.栈中的模型对象过多
valueStack.push(newModel);
2.通过手动将新模型的属性全部赋值给旧模型.
性能比较差
oldModel.setXxxx(newModel.getXxxx());
...
3.使用paramsPrepareParamsStack + preparable拦截器配合使用
prepare拦截器先执行,先为model赋值,后调用modelDriven,在栈顶压入的model是新模型,
但是需要主要在prepare拦截器还要进行传递参数,defaultstack在prepare不能完成传参,
因此可以改换成paramsPrepareParamsStack来达到此目的.
4.使用刷新机制,进行赋值,直接在action中为model赋值,使用刷新机制即可.
<interceptors>
<!-- 注册登陆拦截器 -->
<interceptor name="loginInterceptor" class="com.atguigu.surveypark.struts2.interceptor.LoginInterceptor" />
<!-- 定义拦截器栈 -->s
<interceptor-stack name="surveyparkStack">
<interceptor-ref name="loginInterceptor" />
<interceptor-ref name="defaultStack">
<param name="modelDriven.refreshModelBeforeResult">true</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>



懒加载异常: 

因为是在Service层面上加的事务管理,所有在Service执行完后Session关闭,连接断开,所以在取得对象的集合属性(如一对多关联关系时,多的那方的集合属性可能设置成延迟加载(默认:延迟加载),即等到用到时再进行初始化),这样的话进入JSP进行取值的时候会拿不到这些值。

1.不用懒加载
2.一劳永逸解决懒加载问题.使用spring的openSessionInViewFilter.
<!-- openSessionInViewFilter,改过滤器在view渲染时始终开启session,一劳永逸解决hibernate的懒加载问题,
     该过滤器必须配置在struts2过滤器之前,不推荐使用(性能问题)
<filter>
<filter-name>openSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>openSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
-->

3.强行在service层面是初始化代理对象.
public Survey getSurveyWithChildren(Integer sid){
//Survey s = surveyDao.getEntity(sid);
//降低耦合度
Survey s = this.getSurvey(sid);
//强行初始化pages和questions集合
for(Page p : s.getPages()){
p.getQuestions().size();
}
return s; 
}


高内聚,低耦合.