hibernate08–OpenSessionInView详解编程语言

创建一个web项目,然后生成HibernateSessionFactory文件!

package cn.bdqn.util; 
 
import org.hibernate.HibernateException; 
import org.hibernate.Session; 
import org.hibernate.cfg.Configuration; 
 
/** 
 * Configures and provides access to Hibernate sessions, tied to the 
 * current thread of execution.  Follows the Thread Local Session 
 * pattern, see [email protected] http://hibernate.org/42.html }. 
 */ 
public class HibernateSessionFactory { 
 
    /**  
     * Location of hibernate.cfg.xml file. 
     * Location should be on the classpath as Hibernate uses   
     * #resourceAsStream style lookup for its configuration file.  
     * The default classpath location of the hibernate config file is  
     * in the default package. Use #setConfigFile() to update  
     * the location of the configuration file for the current session.    
     */ 
    private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>(); 
    private static org.hibernate.SessionFactory sessionFactory; 
     
    private static Configuration configuration = new Configuration(); 
    private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml"; 
    private static String configFile = CONFIG_FILE_LOCATION; 
 
    static { 
        try { 
            configuration.configure(configFile); 
            sessionFactory = configuration.buildSessionFactory(); 
        } catch (Exception e) { 
            System.err.println("%%%% Error Creating SessionFactory %%%%"); 
            e.printStackTrace(); 
        } 
    } 
    private HibernateSessionFactory() { 
    } 
     
    /** 
     * Returns the ThreadLocal Session instance.  Lazy initialize 
     * the <code>SessionFactory</code> if needed. 
     * 
     *  @return Session 
     *  @throws HibernateException 
     */ 
    public static Session getSession() throws HibernateException { 
        Session session = (Session) threadLocal.get(); 
 
        if (session == null || !session.isOpen()) { 
            if (sessionFactory == null) { 
                rebuildSessionFactory(); 
            } 
            session = (sessionFactory != null) ? sessionFactory.openSession() 
                    : null; 
            threadLocal.set(session); 
        } 
 
        return session; 
    } 
 
    /** 
     *  Rebuild hibernate session factory 
     * 
     */ 
    public static void rebuildSessionFactory() { 
        try { 
            configuration.configure(configFile); 
            sessionFactory = configuration.buildSessionFactory(); 
        } catch (Exception e) { 
            System.err.println("%%%% Error Creating SessionFactory %%%%"); 
            e.printStackTrace(); 
        } 
    } 
 
    /** 
     *  Close the single hibernate session instance. 
     * 
     *  @throws HibernateException 
     */ 
    public static void closeSession() throws HibernateException { 
        Session session = (Session) threadLocal.get(); 
        threadLocal.set(null); 
 
        if (session != null) { 
            session.close(); 
        } 
    } 
 
    /** 
     *  return session factory 
     * 
     */ 
    public static org.hibernate.SessionFactory getSessionFactory() { 
        return sessionFactory; 
    } 
 
    /** 
     *  return session factory 
     * 
     *    session factory will be rebuilded in the next call 
     */ 
    public static void setConfigFile(String configFile) { 
        HibernateSessionFactory.configFile = configFile; 
        sessionFactory = null; 
    } 
    /** 
     *  return hibernate configuration 
     * 
     */ 
    public static Configuration getConfiguration() { 
        return configuration; 
    } 
 
}

 

在之前的基础上创建dao

public interface DistrictDao { 
    //根据制定的id查询区县信息     根据区县可以查询到街道 
    District   getDistrictById(Integer id); 
}

 

创建daoImpl

public class DistrictDaoImpl   implements  DistrictDao{ 
 
    @Override 
    public District getDistrictById(Integer id) { 
        Session session = HibernateSessionFactory.getSession(); 
         District district = (District) session.load(District.class, id); 
         System.out.println("daoImpl中的session=====>"+session.hashCode()); 
        return district; 
    } 
     
 
}

 

创建对应的servlet

public class DistrcitServlet extends HttpServlet { 
 
    public void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException { 
        doPost(request, response); 
 
    } 
 
    public void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException { 
        //实例化service层对象 
        DistrictDao dao=new DistrictDaoImpl(); 
        //查询id是1001的区县下所有的街道 
        District district = dao.getDistrictById(1001); 
        List<Street> streets = district.getStreets(); 
        //把街道放入指定的作用域 
        request.setAttribute("streets", streets); 
        request.getRequestDispatcher("index.jsp").forward(request, response); 
    } 
 
}

 

创建对应的Filter 并在web.xml文件中配置filter和filter-mapping

public class OpenSessionInViewFilter implements Filter { 
 
    @Override 
    public void destroy() { 
 
    } 
 
    //真正执行代码的地方    获取session  开启事务  
    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, 
            FilterChain chain) throws IOException, ServletException { 
        Session session = HibernateSessionFactory.getSession(); 
         System.out.println("filter中的session=====>"+session.hashCode()); 
         chain.doFilter(request, response); 
         HibernateSessionFactory.closeSession();  //关闭session 
    } 
 
    @Override 
    public void init(FilterConfig arg0) throws ServletException { 
 
    } 
 
}

 

web.xml文件中新增

  <filter> 
    <filter-name>openSession</filter-name> 
    <filter-class>cn.bdqn.filter.OpenSessionInViewFilter</filter-class> 
  </filter> 
   
   
    <filter-mapping> 
     <filter-name>openSession</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping>

 

之后创建页面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 
<% 
String path = request.getContextPath(); 
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 
%> 
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
  <head> 
    <base href="<%=basePath%>"> 
     
    <title>My JSP 'index.jsp' starting page</title> 
    <meta http-equiv="pragma" content="no-cache"> 
    <meta http-equiv="cache-control" content="no-cache"> 
    <meta http-equiv="expires" content="0">     
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 
    <meta http-equiv="description" content="This is my page"> 
    <!-- 
    <link rel="stylesheet" type="text/css" href="styles.css"> 
    --> 
  </head> 
   
  <body> 
    <c:forEach items="${streets}" var="s"> 
       ${s.id } 
       ${s.name } <br/> 
    </c:forEach> 
  </body> 
</html>

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/12112.html

(0)
上一篇 2021年7月19日 14:24
下一篇 2021年7月19日 14:24

相关推荐

发表回复

登录后才能评论