过滤器的执行顺序:
Filter: Set Encoding begin! vvvvv
Filter: Setting encoding: UTF-8
Filter: Transaction begin! Vvvvv
//业务逻辑//
//业务逻辑//
Filter: Transaction End! ^^^^^
Filter: Set Encoding End! ^^^^
由于以上的过滤器特点,我们可以在进入业务逻辑前开启事务,在结束逻辑后提交事务,如果提交失败,还可以做回滚处理。
这样在所有业务逻辑中就可以不用关心事务及session的开启和关闭。
所有业务逻辑中直接HibernateSessionFactory.getSession()获取session并使用,使用完可以不同理事务的提交和session的关闭。
本过滤器提供 事务的开启 和 结束时的提交 并 关闭session。
如果无法建立数据库连接,显示“无法建立数据库连接”信息。
如果事务提交失败,则在页面上显示异常信息 并 进行事务回滚操作,并显示回滚的成功与否。
无论是否有异常最后都将关闭session。
web.xml配置
<filter>
<filter-name>TransactionFilter</filter-name> <filter-class>cn.desheng.scard.filters.TransactionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>TransactionFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
TransactionFilter文件
public class TransactionFilter implements Filter {
public TransactionFilter() {
}
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
Session session = null;
String error = null;
try {
session = HibernateSessionFactory.getSession();
session.beginTransaction();
}
catch (Exception ex) {
ex.printStackTrace();
response.getWriter().write(
"无法连接到数据库,可能原因"
+ " 1,数据库未打开"
+ " 2,未安装数据库对应的驱动程序"
+ " 3,未安装Hibernate库"
+ " 4,Hibernate配置文件配置不当" +
"-- 异常信息为:"+ex.getMessage());
return;
}
try {
chain.doFilter(request, response);
session.getTransaction().commit();
}
catch (Exception ex) {
ex.printStackTrace();
response.getWriter().write(
提交事务时发生异常,异常信息为");
response.getWriter().write("- " + ex.getMessage());
response.getWriter().write("正尝试进行事务回滚");
try {
session.getTransaction().rollback();
response.getWriter().write("事务回滚成功");
}
catch (Exception ex2) {
ex2.printStackTrace();
response.getWriter().write("事务回滚失败");
}
}
finally {
HibernateSessionFactory.closeSession();
}
}
}