20080310日志(迷你hibernate WEB应用程序)
过程:
新建EventManagerServlet.java
package com.lucifer.hibernate.events;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.lucifer.hibernate.util.HibernateUtil;
public class EventManagerServlet extends HttpServlet
{
private final SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd");
protected void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException
{
try
{
HibernateUtil.getSessionFactory().getCurrentSession().beginTransaction();
//处理请求和渲染页面
PrintWriter out = response.getWriter();
out.println("<html><head><title>Event Manager</title></head><body>");
if("save".equals(request.getParameter("action")))
{
String eventTitle = request.getParameter("eventTitle");
String eventDate = request.getParameter("eventDate");
if(eventTitle.equals("")||eventDate.equals(""))
{
out.println("<b><i>Please enter event title and date</i></b>");
}
else
{
this.saveEvent(eventTitle, dateFormatter.parse(eventDate));
out.println();
}
}
this.printEventForm(out);
this.listEvents(out);
out.print("</body></html>");
out.flush();
out.close();
HibernateUtil.getSessionFactory().getCurrentSession().getTransaction().commit();
}catch(Exception ex)
{
HibernateUtil.getSessionFactory().getCurrentSession().getTransaction().rollback();
throw new ServletException(ex);
}
}
private void printEventForm(PrintWriter out)
{
out.println("<h2>Add new event</h2>");
out.println("<form>");
out.println("Title:<input name=''eventTitle'' length=''50''/><br/>");
out.println("Date (2008-03-10):<input name=''eventDate'' length=''10''/><br/>");
out.println("<input type=''submit'' name=''action'' value=''save''/>");
out.println("</form>");
}
private void listEvents(PrintWriter out)
{
List result = HibernateUtil.getSessionFactory().getCurrentSession().createCriteria(Event.class).list();
if(result.size()>0)
{
out.println("<h2>Events in datebase:</h2>");
out.println("<table border=''1''>");
out.println("<tr>");
out.println("<th>Event title</th>");
out.println("<th>Event date</th>");
out.println("</tr>");
for(Iterator it=result.iterator();it.hasNext();)
{
Event event=(Event)it.next();
out.println("<tr>");
out.println("<td>"+event.getTitle()+"</td>");
out.println("<td>"+dateFormatter.format(event.getDate())+"</td>");
out.println("</tr>");
}
out.println("</table>");
}
}
protected void saveEvent(String title,Date theDate)
{
Event event = new Event();
event.setTitle(title);
event.setDate(theDate);
HibernateUtil.getSessionFactory().getCurrentSession().save(event);
}
}
这里有一个很有意思的写法Session.createCriteria(Event.class)是用于从现有的工作单元中获取某个表的映射对象,之前没见过类似的写法,可能是俺没什么见识:P
教程中说可以通过filter的方式来界定每个事务的边界,不过具体怎么做还是不怎么明白,看来还要对filter进行深入研究。
在这里有个疑问HibernateUtil.getSessionFactory().getCurrentSession().beginTransaction();和 HibernateUtil.getSessionFactory().getCurrentSession().getTransaction().commit();虽然都取的是当前工作单元,但是此工作单元是否彼工作单元呢?而且在具体处理事务过程中,又会再取一遍工作单元,那么这3者是否相同呢?通过在代码中输出session.id得出是同一个Session,这样就衍生出1个问题,如何保证获取的Session是同一个?是不是说每次一个HTTP访问期间只要该Session未失效,那么,此期间去取当前的工作单元全部为该Session呢。。这个问题需要验证
新增web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:scheamaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet>
<servlet-name>Event Manager</servlet-name>
<servlet-class>com.lucifer.hibernate.events.EventManagerServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Event Manager</servlet-name>
<url-pattern>/eventmanager</url-pattern>
</servlet-mapping>
</web-app>注意:xmlns:xml namespace Namespaces翻译为名字空间。Namespaces同样需要在XML文档的开头部分声明,声明的语法如下: <document xmlns:yourname=‘URL‘> 其中yourname是由你定义的namespaces的名称,URL就是名字空间的网址。XML 命名空间提供了一个通过与由 URI 引用确定的命名空间相联系的简单方法来保证在可扩展标注语言(XML)文档中的元素和属性名字的合法性。
这个web.xml里面并没有直接引用某个DTD作为文件的规则,具体的DTD应该就在xml:ns标注的内容里了。
action-mapping映射如下
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>net.wasu.platform.base.BaseServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>config/admin</param-name>
<param-value>/WEB-INF/conf/struts-config-admin.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>servlet-name为action的servlet,所有映射路径都为XXXX.do
在build.xml新增一个target来打WAR包
<target name="war" depends="compile">
<war destfile="ant-hibernate-test.war" webxml="web.xml">
<lib dir="${librarydir}">
<exclude name="jsdk*.jar"/>
</lib>
<classes dir="${targetdir}"/>
</war>
</target>注意:exclude属性中标识的jar包只会在编译的时候起作用,而不会被打到war包里
打好war包后直接放到tomcat的webapps目录下,启动tomcat服务就OK了
访问http://localhost:8080/ant-hibernate-test/eventManager就可以进行操作了,LOG4会将相关信息直接输出到控制台。
PS:在TOMCAT解压WAR包后,会自动建立WEB-INF目录里面结构跟常用的J2EE项目一样,这个应该是标准了。
疑问:
在一个访问期间如果保证是同一个Session?(可能表达的不是很清楚,自己明白就好。。)
感想:
对log4j的工作机制很感兴趣,有空研究下
http://download.csdn.net/source/375928里面有这次学习全部源码和教程文件,欢迎大家下载
推荐文章 |

