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


    高内聚,低耦合.


    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    mvn常用命令
    maven pom.xml解释 (转)
    hibernate的主键生成策略
    软件绿色版和安装版的区别
    spring事务
    JdbcTemplate操作数据库
    控制反转和spring在项目中可以带来的好处
    三种实例化bean的方式
    UVA 1262 Password 暴力枚举
    CSDN2015博客之星评选之拉票环节
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4674638.html
Copyright © 2020-2023  润新知