LeetCode每日一题(Valid Sudoku)

矩阵 倒置 和 点积

  返回  

OpenSessionInView模式

2021/8/20 15:39:07 浏览:

一 在Hibernate中实现DAO时,获取Session的方式要改变

1. openSession 从字面上可以看得出来,是打开一个新的session对象,而且每次使用都是打开一个新的session,

假如连续使用多次,则获得的session不是同一个对象,并且使用完需要调用close方法关闭session。

2. getCurrentSession,从字面上可以看得出来,是获取当前上下文一个session对象,当第一次使用此方法时,

会自动产生一个session对象,并且连续使用多次时,得到的session都是同一个对象,

这就是与openSession的区别之一,

简单而言,getCurrentSession 就是:如果有已经使用的,用旧的,如果没有,建新的。

不用手动关闭session,在事务提交后,会自动关闭。

要求增删改查都要有事务环境

二 实现OpenSessionInView模式的步骤

  • 实现过滤器(Spring有提供的)
// jsp  servlet  filter都是javaweb的原生组件,都是由web容器创建的组件
public class OpenSessionInViewFilter implements Filter {


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

	}
	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		Transaction tx = null;
		try {
			//使用getCurrentSessoin()获取Session
			Session session = HibernateSessionUtils.getSessionFactory().getCurrentSession();
			tx = session.beginTransaction();
			chain.doFilter(request, response); // 访问下一个过滤器,如果没有,就访问目标资源
			tx.commit(); //提交事务后关闭session
		} catch (HibernateException e) {
			e.printStackTrace();
		} 

	}

	@Override
	public void destroy() {
	
	}

}

 

  • 配置过滤器
<!-- 配置OpenSessionInViewFilter -->
  <filter>
  	<filter-name>opensession</filter-name>
  	<filter-class>com.gec.hiber.utils.OpenSessionInViewFilter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>opensession</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>
  • 配置hibernate.cfg.xml,指定session的上下文
<property name="current_session_context_class">thread</property>
  • 优化DAO,DAO获取session的方式要和OpenSessionInViewFilter一致
@Override
	public List<Emp> findAllEmp() {
		Session session = HibernateSessionUtils.getSessionFactory().getCurrentSession();
		Criteria criteria = session.createCriteria(Emp.class);
		List<Emp> list = criteria.list();

		return list;
	}

 

三 综合案例

1. 技术 : hibernate+servlet/jsp

2. 数据库:

 

3. 使用反向工程生成双向一对多关系。

4.使用OpenSessionInView模式

5. 实现DAO: FilminfoDao和FilmtypeDao

6. 控制器 Servlet

- FilmSearchServlet

- FilmAddServlet

注意:表单数据提交后,非空判断,数据类型的转换!

7.视图层 Jsp

控制器参考:

1. FilmSearchServlet

public class FilmSearchServlet extends HttpServlet {

	
	public void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType("text/html;charset=UTF-8");
		request.setCharacterEncoding("UTF-8");
		
		FilminfoDao filmInfoDaoImpl = new FilminfoDaoImpl();
		
		String filmname = request.getParameter("filmname");
	
		String actor = request.getParameter("actor");		
		String director = request.getParameter("director");
		
		Double lowPrice = null;
		if (request.getParameter("lowPrice") != null && !"".equals(request.getParameter("lowPrice"))) {
			lowPrice = Double.parseDouble(request.getParameter("lowPrice"));
		}	
		Double highPrice = null;
		if (request.getParameter("highPrice") != null && !"".equals(request.getParameter("highPrice"))) {
			highPrice = Double.parseDouble(request.getParameter("highPrice"));
		}
		
		Filmtype filmType = new Filmtype();
		filmType.setTypeid(Integer.parseInt(request.getParameter("typeid")));
	
		Filminfo filmInfo = new Filminfo(filmname, actor, director, lowPrice, highPrice );
		filmInfo.setFilmtype(filmType);
		
		List<Filminfo> list = filmInfoDaoImpl.searchFilminfos(filmInfo);
		System.out.println(list);
		
		request.setAttribute("result", list);
		request.getRequestDispatcher("/page/result.jsp").forward(request, response);
	}
	
}

2. FilmAddServlet

public class FilmAddServlet extends HttpServlet {

	public void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		
	    request.setCharacterEncoding("UTF-8");
	    
		String filmname = request.getParameter("filmname");
		System.out.println(filmname); //日志调试输出
		int typeid = Integer.parseInt(request.getParameter("typeid"));
		String actor = request.getParameter("actor");
		String director = request.getParameter("director");
		Double ticketprice = Double.parseDouble(request.getParameter("ticketprice"));
		
		FilmtypeDao typeDao = new FilmtypeDaoImpl();
		Filmtype type = new Filmtype();  
		type.setTypeid(typeid);
		
		FilminfoDao FilmInfoDaoImpl = new FilminfoDaoImpl();
		
		Filminfo film = new Filminfo(filmname, actor, director, ticketprice);	
		//设置对象间的关联关系
		film.setFilmtype(type);
		
		FilmInfoDaoImpl.addFilm(film);
		response.sendRedirect(request.getContextPath()+"/cinema.jsp");
	}

}

联系我们

如果您对我们的服务有兴趣,请及时和我们联系!

服务热线:18288888888
座机:18288888888
传真:
邮箱:888888@qq.com
地址:郑州市文化路红专路93号