频道栏目
首页 > 程序开发 > 软件开发 > Java > 正文
Java乔晓松-一次请求在同一个事务实现
2013-04-23 11:59:20           
收藏   我要投稿

HiberSessionFilter过滤器代码:


[java]
package www.csdn.dbshop.filter; 
 
import java.io.IOException; 
 
import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.http.HttpServletRequest; 
 
import org.hibernate.Transaction; 
 
import www.csdn.dbshop.util.HiberSessionFactory; 
 
public class HiberSessionFilter implements Filter { 
 
    public void destroy() { 
 
    } 
 
    public void doFilter(ServletRequest request, ServletResponse response, 
            FilterChain chain) throws IOException, ServletException { 
 
        HttpServletRequest req = (HttpServletRequest) request; 
        // 获取当前请求的URI路径,例如/shoping/csdn/MemberAction_query.action  
        String requesturi = req.getRequestURI(); 
        // 截取字符串,获取‘_’之后的字符串  
        String str = requesturi.substring(requesturi.indexOf("_") + 1); 
        // 截取 _名字 如过以 add ,update ,delete 开始 就添加事务处理,把有过事务的处理 都删除  
        // 根据获取‘_’之后的字符串,截取‘.’之前的字符串,即:就是URI中_到.之间的字符串,即:Action中的方法名  
        String uri = str.substring(0, str.indexOf(".")); 
        // 判断截取的字符,如果是CUD则进行开启事务的操作,反之,不用开启事务  
        if ("addObject".equals(uri) || "updateObject".equals(uri) 
                || "deleteObject".equals(uri) || "reg".equals(uri) 
                || "register".equals(uri) || "buy".equals(uri)) { 
 
            Transaction ts = null; 
            try { 
                ts = HiberSessionFactory.getSession().beginTransaction(); 
                chain.doFilter(request, response); 
                ts.commit(); 
            } catch (Exception e) { 
                if (ts != null) { 
                    ts.rollback(); 
                } 
                throw new RuntimeException(e); 
            } finally { 
                // 关闭session  
                HiberSessionFactory.closeSession(); 
            } 
        } else { 
            try { 
                chain.doFilter(request, response); 
            } catch (Exception e) { 
                throw new RuntimeException(e); 
            } finally { 
                // 关闭session  
                HiberSessionFactory.closeSession(); 
            } 
        } 
    } 
 
    public void init(FilterConfig filterConfig) throws ServletException { 
        // TODO Auto-generated method stub  
 
    } 
 

package www.csdn.dbshop.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

import org.hibernate.Transaction;

import www.csdn.dbshop.util.HiberSessionFactory;

public class HiberSessionFilter implements Filter {

 public void destroy() {

 }

 public void doFilter(ServletRequest request, ServletResponse response,
   FilterChain chain) throws IOException, ServletException {

  HttpServletRequest req = (HttpServletRequest) request;
  // 获取当前请求的URI路径,例如/shoping/csdn/MemberAction_query.action
  String requesturi = req.getRequestURI();
  // 截取字符串,获取‘_’之后的字符串
  String str = requesturi.substring(requesturi.indexOf("_") + 1);
  // 截取 _名字 如过以 add ,update ,delete 开始 就添加事务处理,把有过事务的处理 都删除
  // 根据获取‘_’之后的字符串,截取‘.’之前的字符串,即:就是URI中_到.之间的字符串,即:Action中的方法名
  String uri = str.substring(0, str.indexOf("."));
  // 判断截取的字符,如果是CUD则进行开启事务的操作,反之,不用开启事务
  if ("addObject".equals(uri) || "updateObject".equals(uri)
    || "deleteObject".equals(uri) || "reg".equals(uri)
    || "register".equals(uri) || "buy".equals(uri)) {

   Transaction ts = null;
   try {
    ts = HiberSessionFactory.getSession().beginTransaction();
    chain.doFilter(request, response);
    ts.commit();
   } catch (Exception e) {
    if (ts != null) {
     ts.rollback();
    }
    throw new RuntimeException(e);
   } finally {
    // 关闭session
    HiberSessionFactory.closeSession();
   }
  } else {
   try {
    chain.doFilter(request, response);
   } catch (Exception e) {
    throw new RuntimeException(e);
   } finally {
    // 关闭session
    HiberSessionFactory.closeSession();
   }
  }
 }

 public void init(FilterConfig filterConfig) throws ServletException {
  // TODO Auto-generated method stub

 }

}

 

 

 

web.xml代码:
[html]
<!-- sessionclose过滤器 --> 
  <filter> 
   <filter-name>HiberSessionFilter</filter-name> 
   <filter-class>www.csdn.dbshop.filter.HiberSessionFilter</filter-class> 
 </filter> 
  
 <filter-mapping> 
   <filter-name>HiberSessionFilter</filter-name> 
   <url-pattern>*.action</url-pattern> 
 </filter-mapping> 

<!-- sessionclose过滤器 -->
  <filter>
   <filter-name>HiberSessionFilter</filter-name>
   <filter-class>www.csdn.dbshop.filter.HiberSessionFilter</filter-class>
 </filter>
 
 <filter-mapping>
   <filter-name>HiberSessionFilter</filter-name>
   <url-pattern>*.action</url-pattern>
 </filter-mapping>
注意:在Struts2中,过滤器最好放在Struts2过滤器之前。

 

点击复制链接 与好友分享!回本站首页
相关TAG标签 事务 乔晓松
上一篇:多线程实现大批量数据导入
下一篇:Java接口和Java抽象类
相关文章
图文推荐
文章
推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站