网站首页 新闻首页 网页设计图形动画软件编程网站开发办公软件操作系统数据库网络技术认证考试范文资料黑客攻防 书籍教程 进入论坛

20080310日志(迷你hibernate WEB应用程序)

http://www.diybl.com/ 2008-3-11  网络 点击:  [ 评论 ]
文章搜索:    【点击打包该文章】

过程:
新建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里面有这次学习全部源码和教程文件,欢迎大家下载


文章整理:DIY部落 http://www.diybl.com (本站)   【点击打包该文章】
如果图片或页面不能正常显示请点击这里 站内搜索:   

文章评论

请您留言