4.4.1 Hibernate过滤器 在Web项目中,以普通方式使用Hibernate将无法解决Hibernate延迟加载。当有一个业务请求查询数据时,首先要开启Session对象[12],然后Hibernate对数据进行查询,再关闭Session对象,最后通过JSP页面来显示数据。在这一过程中,如果查询数据时使用了延迟加载,当JSP页面显示数据信息时,Hibernate将抛出异常信息,因为此时Session已经关闭,Hibernate不能再对数据进行操作。 通过过滤器管理Hibernate的Session对象则可以避免此问题。在Web容器启动时,过滤器被初始化,它将执行init()方法,在后续的操作中不会再次被执行;而当容器关闭时,过滤器将执行destroy()方法。这两个方法恰好符合SessionFactory对象的生命周期,在运行期间只执行一次操作,可用于实例化及销毁SessionFactory对象。对于Session对象的关闭操作,可以在业务逻辑处理结束后、response请求转发到View层(JSP页面)之前进行。此代码将其封装在HibernateFilter类[13]中,此类继承了Filter类,它是一个过滤器。 在med_view.jsp页面中,通过<logic:empty>标签及<logic:notempty>标签对资产图片是否存在进行逻辑判断,当资产图片存在时,通过<bean:write>标签[19]输出图片路径,否则输出提示信息,其关键代码如下: <logic:empty name="med" property="photoPath"> <bean:message key="medicine.photo.null" /> </logic:empty> <logic:notEmpty name="med" property="photoPath"> <img src="../upload/<bean:write name='med' property='photoPath'/>" width="320" height="220" /> </logic:notEmpty> 为了方便操作人员了解资产库存数量,在本系统中提供了对库存数量的检索功能,即通过比较运算符查询相应的库存数量。MedicineAction类的QueryMedCount()方法用于处理库存数量的查询请求,此方法通过参数type判断其查询的类型,并构造相应的HQL查询语句。 |