教育办公系统的OpenSessionInView,通用翻页的实现

1. OpenSessionInView  
    1).  为什么需要 OpenSessionInView: 当对 Employee 的 dept 属性使用默认的 "懒加载" 加载策略时, 如果在访问 dept 属性之前
              已经关闭的 Session, 则会出现 org.hibernate.LazyInitializationException: could not initialize proxy - no Session
              异常. 在页面上需要显示 Employee.getDept().getDepartmentName() 时, 就会出现上述异常.
    2).  OpenSessionInView 是什么: 当请求开始的时候打开 Session, 当请求结束的时候关闭 Session. 这样就可以避免上述的异常出现.
     3).  如何实现: Spring 提供了这样的一个过滤器: org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
        在web.xml 文件中加入:
        <!-- 配置 Spring 提供的 OpenSessionInView 过滤器 -->
           <filter>  
            <filter-name>OpenSessionInView</filter-name>  
            <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>  
          </filter>  
           
          <filter-mapping>  
            <filter-name>OpenSessionInView</filter-name>  
            <url-pattern>/*</url-pattern>  
          </filter-mapping>  
    4). 缺点: 当页面加载过慢时, 此模式会导致 Session 的生命周期过长, 即数据库链接占用时间过长, 进而导致数据库资源被占用时间过长, 所以该模式在.大型的门户网站中不能使用
   
2. 关于通用翻页:  
    1).  相关的类: orm 包下的 Page 和 PropertyFilter; orm.hibernate 包下的 HibernateDao 和 HibernateWebUtils
    2).  Page 类: 封装了翻页显示的各种属性
    3).  PropertyFilter 类: 与具体 ORM 实现无关的属性过滤条件封装类
    4).  HibernateDao: 扩展了SimpleHibernateDao, 扩展功能包括分页查询, 按属性过滤条件列表  
    5).  具体的翻页操作:
        ①. 不带任何查询条件: 调用 employeeDao.findPage(page) 方法      
        ②. 带简单的查询条件:
            a. 查询页面的表单如何设计: 使用 jQuery 的一个 thickbox  插件完成查询页面的弹出.
            b. 如何在 Action 中得到对应的 List<PropertyFilter> filters: 调用 HibernateWebUtils.buildPropertyFilters(request)
            c. 调用  EmployeeDao 的 public Page<T> findPage(final Page<T> page, final List<PropertyFilter> filters) 方法.
            d. 如何在翻页时保留查询条件, 以可以在此条件上进行翻页:
                --> 将封装了查询条件的 Bean 放在 Session 中(可能会对性能产生较大影响).
                --> 使用隐藏域存放查询条件, 在点击相应的连接时取出隐藏域中策查询条件.
           
            e. 点击 "增加(显示当前)查询条件" 连接时, 若已经存在查询条件, 则需要在查询条件的输入页面对查询条件进行回显:
                    在 查询条件的输入页面 使用 el 表达式结合 struts 的 html 标签进行表单回显, 但在 employee-list1.jsp 页面 criteria 使用 js 返回查询条件时,
                    需要在页面加载时改变默认的超链接: $("#criteria").attr("href", "${cp }/employee-input-ui.do?height=300&width=300&type=criteria&" + $(":hidden[name^=filter_]").serialize());
                    否则当  employee-list1.jsp 页面加载后, 第一次点击 criteria 连接时将使用默认的超链接导致查询页面表单无法回显.
            f. 使 "删除查询条件" 链接生效    
           
        ③. 带引用型的查询条件
            a. 因为在页面上需要显示的是 deptId 和 positionId, 而在实体类中存放的时 Departmetn 和 Position 对象, 所以不能够直接批评
            b. 解决方案: 重写 EmployeeDao 的 findPage(Page<Employee> page, List<PropertyFilter> filters) 方法, 使其可以过滤处理 deptId 和 positionId 字段
            c. 在重写的方法中重新组织 Criterion 数组, 最后调用findPage(Page<T> page, Criterion...criterions) 方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值