前两天的项目跟的还不错.大多数的知识点都理解和吸收了.但是有些个别的地方,在自己写代码的时候还是想不到.我感觉还是应为自己的练习少导致的.光能听 懂老师讲的是远远不够的.自己能分析出问题,经过思考并能解决问题这才是最最关键的.在以后的学习中要多注意一下这方面的练习.
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) 方法