企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 1.4.1\. 编写基本的servlet 在你的源代码目录的`events`包中创建一个新的类: ``` package events; // Imports public class EventManagerServlet extends HttpServlet { // Servlet code } ``` 我们后面会用到`dateFormatter` 的工具, 它把`Date`对象转换为字符串。只要一个formatter作为servlet的成员就可以了。 这个servlet只处理 HTTP `GET` 请求,因此,我们要实现的是`doGet()`方法: ``` protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { SimpleDateFormat dateFormatter = new SimpleDateFormat("dd.MM.yyyy"); try { // Begin unit of work HibernateUtil.getSessionFactory() .getCurrentSession().beginTransaction(); // Process request and render page... // End unit of work HibernateUtil.getSessionFactory() .getCurrentSession().getTransaction().commit(); } catch (Exception ex) { HibernateUtil.getSessionFactory() .getCurrentSession().getTransaction().rollback(); throw new ServletException(ex); } } ``` 我们称这里应用的模式为每次请求一个session_(session-per-request)_。当有请求到达这个servlet的时候,通过对`SessionFactory`的第一次调用,打开一个新的Hibernate `Session`。然后启动一个数据库事务—所有的数据访问都是在事务中进行,不管是读还是写(我们在应用程序中不使用auto-commit模式)。 _不要_为每次数据库操作都使用一个新的Hibernate `Session`。将Hibernate `Session`的范围设置为整个请求。要用`getCurrentSession()`,这样它自动会绑定到当前Java线程。 下一步,对请求的可能动作进行处理,渲染出反馈的HTML。我们很快就会涉及到那部分。 最后,当处理与渲染都结束的时候,这个工作单元就结束了。假若在处理或渲染的时候有任何错误发生,会抛出一个异常,回滚数据库事务。这样,`session-per-request`模式就完成了。为了避免在每个servlet中都编写事务边界界定的代码,可以考虑写一个servlet 过滤器(filter)来更好地解决。关于这一模式的更多信息,请参阅Hibernate网站和Wiki,这一模式叫做_Open Session in View_—只要你考虑用JSP来渲染你的视图(view),而不是在servlet中,你就会很快用到它。