传智播客--教育办公系统的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) 方法

你可能感兴趣的:(传智播客--教育办公系统的OpenSessionInView,通用翻页的实现)