傅型号值问题:

struts2 模型分配问题和延迟加载问题_struts

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


struts2 模型分配问题和延迟加载问题_初始化_02

struts2 模型分配问题和延迟加载问题_值栈_03

在拦截器到达之前这个图片已经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; 

}



高内聚,低耦合.