隨筆-72  評(píng)論-63  文章-0  trackbacks-0
          別的請(qǐng)參考:http://www.java3z.com/cwbwebhome/article/article2a/2101.jsp?id=365
          http://blogger.org.cn/blog/more.asp?name=jjs_love&id=12738
          http://willsu.cnblogs.com/archive/2006/03/26/172459.html

          一、準(zhǔn)備工作
          ????主要是搭建Hibernate+Struts的環(huán)境,我是mysql+Tomcat?5.0+Hibernate2.1+Struts1.2.4,包括建目錄和復(fù)制jar文件到相關(guān)目錄,還有在mysql中創(chuàng)建數(shù)據(jù)庫(kù)HibernateTest和表sysuser,請(qǐng)下載我的目錄結(jié)構(gòu)參考。
          下面文件createTable.txt用來(lái)創(chuàng)建表sysuser

          create?table?sysuser(
          ?userid?varchar(32)?not?null,
          ?username??varchar(20)?not?null?unique,
          ?userpasword?varchar(20)?not?null,
          ?lastlogin?DATETIME,
          ?primary?key(userid)
          )

          二、Hibernate的配置文件hibernate.cfg.xml,主要是數(shù)據(jù)庫(kù)的設(shè)定,這里用mysql。

          <?xml?version=?.0'?encoding='big5'?>
          <!DOCTYPE?hibernate-configuration
          ????PUBLIC?"-//Hibernate/Hibernate?Configuration?DTD//EN"
          ????"http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">

          <hibernate-configuration>
          ????<session-factory>
          ????????<!--?顯示實(shí)際操作數(shù)據(jù)庫(kù)時(shí)的SQL?-->
          ????????<property?name="show_sql">true</property>
          ????????<!--?SQL方言,這邊設(shè)定的是MySQL?-->
          ????????<property?name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>
          ????????<!--?JDBC驅(qū)動(dòng)程序?-->
          ????????<property?name="connection.driver_class">com.mysql.jdbc.Driver</property>
          ????????<!--?JDBC?URL?-->
          ????????<property?name="connection.url">jdbc:mysql://localhost/HibernateTest</property>
          ????????<!--?數(shù)據(jù)庫(kù)使用者?-->
          ????????<property?name="connection.username">root</property>
          ????????<!--?數(shù)據(jù)庫(kù)密碼?-->
          ????????<property?name="connection.password"></property>

          ????????<!--?對(duì)象與數(shù)據(jù)庫(kù)表格映像文件?-->
          ????????<mapping?resource="com/huangdong/dbwebdemo/dao/SysUser.hbm.xml"/>

          ????</session-factory>
          </hibernate-configuration>


          二、Struts的配置文件struts-config.xml,有表單定義,動(dòng)作映射和資源文件,插件定義。
          <?xml?version="1.0"?encoding="iso-8859-1"?>
          <!DOCTYPE?struts-config?PUBLIC
          ??????????"-//Apache?Software?Foundation//DTD?Struts?Configuration?1.2//EN"
          ??????????"http://struts.apache.org/dtds/struts-config_1_2.dtd">

          <struts-config>

          ????<form-beans>
          ????????<form-bean?name="sysuserForm"?type="com.huangdong.dbwebdemo.form.SysuserForm"/>
          ????</form-beans>

          ??<action-mappings>?????
          ?????????<action??name="sysuserForm"?
          ?????????path="/sysuser"?
          ?????????type="com.huangdong.dbwebdemo.action.AddAction"?
          ?????????scope="request"
          ?????????????????validate="true"
          ?????????input="/sysuser/editsysuser.jsp">
          ?????????????<forward?name="add"?path="/sysuser/add.jsp"?/>
          ?????????</action>

          ?????????<action?path="/list"?
          ?????????????????type="com.huangdong.dbwebdemo.action.ListAction"?
          ?????????scope="request"
          ?????????????????input="/sysuser/index.jsp">
          ?????????????????<forward?name="list"?path="/sysuser/list.jsp"?/>
          ?????????</action>?
          ?????
          ?????????<action??path="/edit"?
          ??????????????????type="com.huangdong.dbwebdemo.action.EditAction"?
          ??????????scope="request"
          ??????????????????input="/sysuser/editsysuser1.jsp">
          ??????????????????<forward?name="edit"?path="/sysuser/editsysuser1.jsp"?/>?????????????????
          ??????????????????<forward?name="err1"?path="/sysuser/err1.jsp"?/>


          ????????</action>?
          ?????????<action??path="/del"?
          ??????????????????type="com.huangdong.dbwebdemo.action.DelAction"?
          ??????????scope="request"
          ?????????????????????input="/sysuser/del.jsp">
          ??????????????????<forward?name="del"?path="/sysuser/delok.jsp"?/>
          ??????????????????<forward?name="err"?path="/sysuser/err.jsp"?/>

          ????????</action>
          ????????<action???name="sysuserForm"?
          ??????????????????path="/update"?
          ??????????????????type="com.huangdong.dbwebdemo.action.UpdateAction"?
          ??????????scope="request"
          ?????????????????????input="/sysuser/editsysuser1.jsp">
          ??????????????????<forward?name="updateok"?path="/sysuser/updateok.jsp"?/>
          ???????????????
          ????????</action>
          ?
          ????</action-mappings>
          ????
          ????<message-resources?parameter="resources.application"/>?

          ????<plug-in?className="com.huangdong.dbwebdemo.InitHibernatePlugin"?/>
          ?????<plug-in?className="org.apache.struts.validator.ValidatorPlugIn">
          ????<set-property?property="pathnames"?value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
          ?????</plug-in>
          </struts-config>

          ????這里加了兩個(gè)插件,其一利用Plugin的方式將Hibernate與Struts結(jié)合起來(lái),其二進(jìn)行服務(wù)器端驗(yàn)證。插件將在Web應(yīng)用啟動(dòng)時(shí)初始化。
          ????在InitHibernatePlugin.java的init()方法中將SessionFactory的實(shí)例bind到JNDI目錄樹的一個(gè)節(jié)點(diǎn)上,以便在所有要使用SessionFactory的地方通過(guò)JNDI?lookup出sessionFactory的實(shí)例得到具體的session進(jìn)行數(shù)據(jù)庫(kù)操作。
          InitHibernatePlugin.java(部分)
          ?????????/*
          ?????*?插件初始化方法
          ?????*/
          ????public?void?init(ActionServlet?servlet,?ModuleConfig?config)
          ????????throws?ServletException?{
          ????????try?{
          ????????????//?獲取SessionFactory的實(shí)例
          ????????????this.sessionFactory?=
          ????????????????new?Configuration().configure().buildSessionFactory();
          ????????}?catch?(HibernateException?ex)?{
          ????????????throw?new?RuntimeException(
          ????????????????"Exception?building?SessionFactory:?"?+?ex.getMessage(),
          ????????????????ex);
          ????????}
          ????????try?{
          ????????????//?取得容器上下文
          ????????????ctx?=?new?InitialContext();
          ????????????//?將sessionFactory?bind到JND樹中
          ????????????ctx.bind("HibernateSessionFactory",?this.sessionFactory);
          ????????}?catch?(NamingException?ex)?{
          ????????????throw?new?RuntimeException(
          ????????????????"Exception?binding?SessionFactory?to?JNDI:?"?+?ex.getMessage(),
          ????????????????ex);
          ????????}
          ????}

          二、國(guó)際化資源文件
          ???我們?yōu)檎军c(diǎn)準(zhǔn)備一個(gè)國(guó)際化的資源文件,這個(gè)資源文件將是站點(diǎn)用戶所使用的語(yǔ)言來(lái)決定的,如果Struts不能找到相對(duì)應(yīng)的語(yǔ)言資源文件,就會(huì)使用默認(rèn)的資源文件。?這里我們先會(huì)建立一個(gè)txt文件,將所有的中文信息寫入,再通過(guò)一個(gè)批處理或是shell腳本將該txt轉(zhuǎn)化成為Struts所使用的資源文件。

          這里我們給出genres.bat的內(nèi)容:

          native2ascii?-encoding?GBK?d:\java\res_zh.txt?>d:\java\application_zh_CN.properties
          ????????????????
          ????????????????
          請(qǐng)使用你的文件的路徑來(lái)代替這里的路徑。下面是res_zh.txt:
          #?Resources?for?parameter?'ApplicationResources'
          #?Project?P/WebDlog
          title.register=用戶注冊(cè)
          prompt.login=用戶名
          prompt.password=口令

          #?Errors
          errors.footer=
          errors.header=<h3><font?color="red">驗(yàn)證錯(cuò)誤</font></h3>你必須更正下列錯(cuò)誤:
          errors.ioException=I/O?exception?rendering?error?messages:?{0}
          error.database.missing=<li>User?database?is?missing,?cannot?validate?logon?credentials</li>
          errors.required={0}?是必填項(xiàng).
          errors.minlength={0}?不能少于?{1}?個(gè)字符.
          errors.maxlength={0}?不能大于?{2}?個(gè)字符.
          errors.invalid={0}?是無(wú)效的.

          errors.byte={0}?must?be?an?byte.
          errors.short={0}?must?be?an?short.
          errors.integer={0}?must?be?an?integer.
          errors.long={0}?must?be?an?long.
          errors.float={0}?must?be?an?float.
          errors.double={0}?must?be?an?double.

          errors.date={0}?is?not?a?date.

          errors.range={0}?is?not?in?the?range?{1}?through?{2}.

          errors.creditcard={0}?is?not?a?valid?credit?card?number.

          errors.email={0}?is?an?invalid?e-mail?address.



          三、設(shè)置站點(diǎn)所使用的語(yǔ)言
          ?????我們使用一個(gè)Servlet的Filter來(lái)設(shè)置站點(diǎn)所使用的語(yǔ)言。(略,請(qǐng)參看原文)

          四、session獲取工具類
          ????另外為了配置Plugin的使用,我們使用工具類DBUtil類來(lái)獲取Session,以下為它的代碼:

          package?com.huangdong.dbwebdemo;

          import?javax.naming.Context;
          import?javax.naming.InitialContext;
          import?javax.naming.NamingException;

          import?net.sf.hibernate.HibernateException;
          import?net.sf.hibernate.Session;
          import?net.sf.hibernate.SessionFactory;

          /**
          ?*?@author?HD
          ?*/
          public?class?DBUtil?{

          ????private?static?SessionFactory?sessionFactory?=?null;
          ????public?static?final?ThreadLocal?session?=?new?ThreadLocal();

          ????public?static?Session?currentSession()?throws?HibernateException?{
          ????????if?(sessionFactory?==?null)?{
          ????????????//?如果sessionFactory實(shí)例為null則從JNDI中獲取
          ????????????if?(getSystemSessionFactory()?==?false)?{
          ????????????????throw?new?HibernateException("Exception?geting?SessionFactory?from?JNDI?");
          ????????????}
          ????????}
          ????????Session?s?=?(Session)?session.get();
          ????????if?(s?==?null)?{
          ????????????s?=?sessionFactory.openSession();
          ????????????session.set(s);
          ????????}
          ????????return?s;
          ????}

          ????public?static?void?closeSession()?throws?HibernateException?{
          ????????Session?s?=?(Session)?session.get();
          ????????session.set(null);
          ????????if?(s?!=?null)
          ????????????s.close();
          ????}
          ????
          ????private?static?boolean?getSystemSessionFactory()?{
          ????????try?{
          ????????????//從JNDI中取得SessionFactory的實(shí)例,如果出錯(cuò)返回false
          ????????????Context?inttex?=?new?InitialContext();
          ????????????sessionFactory?=
          ????????????????(SessionFactory)?inttex.lookup("HibernateSessionFactory");
          ????????}?catch?(NamingException?e)?{
          ????????????return?false;
          ????????}
          ????????return?true;
          ????}
          }
          ????????????
          五、持久層的數(shù)據(jù)表示及設(shè)置數(shù)據(jù)表實(shí)體化映射
          ???我們的增、刪、改、查使用sysuser表,以下是其對(duì)應(yīng)的SysUser類的源代碼:

          package?com.huangdong.dbwebdemo.dao;

          import?java.io.Serializable;
          import?java.text.SimpleDateFormat;

          import?org.apache.commons.lang.builder.EqualsBuilder;
          import?org.apache.commons.lang.builder.HashCodeBuilder;
          import?org.apache.commons.lang.builder.ToStringBuilder;

          /**?@author?Hibernate?CodeGenerator?*/
          public?class?SysUser?implements?Serializable?{

          ????/**?identifier?field?*/
          ????private?String?userid;

          ????/**?persistent?field?*/
          ????private?String?username;

          ????/**?persistent?field?*/
          ????private?String?userpasword;

          ????/**?nullable?persistent?field?*/
          ????private?java.util.Calendar?lastlogin;

          ????/**?full?constructor?*/
          ????public?SysUser(
          ????????java.lang.String?username,
          ????????java.lang.String?userpasword,
          ????????java.util.Calendar?lastlogin)?{
          ????????this.username?=?username;
          ????????this.userpasword?=?userpasword;
          ????????this.lastlogin?=?lastlogin;
          ????}

          ????/**?default?constructor?*/
          ????public?SysUser()?{
          ????}

          ????/**?minimal?constructor?*/
          ????public?SysUser(java.lang.String?username,?java.lang.String?userpasword)?{
          ????????this.username?=?username;
          ????????this.userpasword?=?userpasword;
          ????}

          ????public?java.lang.String?getUserid()?{
          ????????return?this.userid;
          ????}

          ????public?void?setUserid(java.lang.String?userid)?{
          ????????this.userid?=?userid;
          ????}

          ????public?java.lang.String?getUsername()?{
          ????????return?this.username;
          ????}

          ????public?void?setUsername(java.lang.String?username)?{
          ????????this.username?=?username;
          ????}

          ????public?java.lang.String?getUserpasword()?{
          ????????return?this.userpasword;
          ????}

          ????public?void?setUserpasword(java.lang.String?userpasword)?{
          ????????this.userpasword?=?userpasword;
          ????}

          ????public?java.util.Calendar?getLastlogin()?{
          ????????return?this.lastlogin;
          ????}

          ????public?String?getLastloginstr()?{
          ????????SimpleDateFormat?df?=?new?SimpleDateFormat("yyyy-MM-dd?HH:mm:ss");
          ????????return?df.format(this.lastlogin);
          ????}

          ????public?void?setLastlogin(java.util.Calendar?lastlogin)?{
          ????????this.lastlogin?=?lastlogin;
          ????}

          ????public?String?toString()?{
          ????????return?new?ToStringBuilder(this)
          ????????????.append("userid",?getUserid())
          ????????????.toString();
          ????}

          ????public?boolean?equals(Object?other)?{
          ????????if?(!(other?instanceof?SysUser))
          ????????????return?false;
          ????????SysUser?castOther?=?(SysUser)?other;
          ????????return?new?EqualsBuilder()
          ????????????.append(this.getUserid(),?castOther.getUserid())
          ????????????.isEquals();
          ????}

          ????public?int?hashCode()?{
          ????????return?new?HashCodeBuilder().append(getUserid()).toHashCode();
          ????}

          }
          ????????????????
          還有映射的xml文件:

          <?xml?version="1.0"?encoding="UTF-8"?>
          <!DOCTYPE?hibernate-mapping?PUBLIC?"-//Hibernate/Hibernate?Mapping?DTD?2.0//EN"?"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
          <hibernate-mapping>
          ????<class?name="com.huangdong.demo.dao.SysUser"?table="SYSUSER">
          ????????<id?column="userid"?length="32"?name="userid"?type="string">
          ????????????<generator?class="uuid.hex"/>
          ????????</id>
          ????????<property?column="username"?length="20"?name="username"?not-null="true"?type="string"?unique="true"/>
          ????????<property?column="userpasword"?length="20"?name="userpasword"?not-null="true"?type="string"/>
          ????????<property?column="lastlogin"?length="7"?name="lastlogin"?type="calendar"/>
          ????</class>
          </hibernate-mapping>
          ????????????????
          六、建立Struts的Action和Action?FormBean
          ?
          有AddAction.java,UpdateAction.java,SysuserForm.java等,請(qǐng)下載源碼查看。

          七、將VO與PO關(guān)聯(lián)
          VO與PO的關(guān)系
          ???VO即業(yè)務(wù)層的數(shù)據(jù)表示,而PO即持久層的數(shù)據(jù)表示,在這個(gè)例子里就是SysUser.java類。VO會(huì)在View和業(yè)務(wù)處理時(shí)大量使用,也就是說(shuō),所有沒(méi)有入庫(kù)前的數(shù)據(jù)都會(huì)存儲(chǔ)于一個(gè)個(gè)的VO中。而PO則是數(shù)據(jù)庫(kù)在Java中的持久數(shù)據(jù)結(jié)構(gòu)。

          有許多人喜歡將Struts的VO與Hibernate的PO合并起來(lái),我不同意,原因很多,最重要的有以下幾點(diǎn):

          1、VO有自己的數(shù)據(jù)屬性,同時(shí)因框架的不同可能會(huì)有自己的結(jié)構(gòu)和方法,在Struts中我喜歡用FormBean來(lái)做VO,它就是擴(kuò)展ActionForm的一個(gè)類?

          2、VO中還會(huì)有大量的業(yè)務(wù)操作方法,如校驗(yàn)、自動(dòng)生成等方法?
          3、PO中會(huì)包含數(shù)據(jù)集之間的關(guān)系,如數(shù)據(jù)庫(kù)中的關(guān)系也會(huì)體現(xiàn)在PO中的一對(duì)一、多對(duì)多、一對(duì)多等,而在VO中不一定關(guān)注這樣的細(xì)節(jié)?

          總之,我更喜歡使用一個(gè)或多個(gè)關(guān)聯(lián)的類將業(yè)務(wù)邏輯中的VO與PO對(duì)映起來(lái),實(shí)現(xiàn)VO到PO的轉(zhuǎn)換,以及PO中VO的取出。

          九、VO與PO操作的抽像類
          ?????所有VO到PO的操作基本上都會(huì)是持久層數(shù)據(jù)的存入或更改(刪除)。這樣的操作一定會(huì)涉及到數(shù)據(jù)庫(kù)的事務(wù)操作。另一方面,PO到VO的數(shù)據(jù)取出涉及到的則是數(shù)據(jù)集合的緩沖、分頁(yè)、過(guò)涉等技巧。所以我們?yōu)檫@兩種情況聲明兩個(gè)抽像類:

          AbsBaseMap類主要完成VO到PO的數(shù)據(jù)操作:

          package?com.huangdong.dbwebdemo.db;

          import?net.sf.hibernate.HibernateException;
          import?net.sf.hibernate.Session;
          import?net.sf.hibernate.Transaction;

          import?com.huangdong.dbwebdemo.DBUtil;

          /**
          ?*?系統(tǒng)VO與PO的操作映射器抽像類,完成數(shù)據(jù)庫(kù)事務(wù)和連接的初始化以及數(shù)據(jù)庫(kù)事務(wù)的提交及數(shù)據(jù)庫(kù)連接的關(guān)閉
          ?*?@author?HD
          ?*/
          public?abstract?class?AbsBaseMap?{
          ????//?數(shù)據(jù)庫(kù)連接session
          ????private?Session?session;
          ????//?數(shù)據(jù)庫(kù)事務(wù)處理器
          ????private?Transaction?transaction;

          ????/**
          ?????*?初始化數(shù)據(jù)庫(kù)連接事務(wù)
          ?????*?@return?初始化完成的數(shù)據(jù)庫(kù)連接
          ?????*?@throws?HibernateException
          ?????*/
          ????public?Session?beginTransaction()?throws?HibernateException?{
          ????????session?=?DBUtil.currentSession();
          ????????transaction?=?session.beginTransaction();
          ????????return?session;
          ????}

          ????/**
          ?????*?完成一個(gè)數(shù)據(jù)庫(kù)事務(wù)
          ?????*?@param?commit?是否提交事務(wù),true時(shí)提交,false時(shí)向數(shù)據(jù)庫(kù)發(fā)起回滾(rollback)
          ?????*?@throws?HibernateException
          ?????*/
          ????public?void?endTransaction(boolean?commit)?throws?HibernateException?{
          ????????if?(commit)?{
          ????????????transaction.commit();
          ????????}?else?{
          ????????????transaction.rollback();
          ????????}
          ????????DBUtil.closeSession();
          ????}
          }
          ????????????????
          AbsQueryMap類則主要提供了有關(guān)持久層數(shù)據(jù)的查詢的抽像方法:

          package?com.huangdong.dbwebdemo.db;

          /**
          ?*?系統(tǒng)VO與PO的查詢映射抽像類,加入查詢的分頁(yè)相關(guān)設(shè)置
          ?*?@author?HD
          ?*/
          public?class?AbsQueryMap?{
          ????/**
          ?????*?數(shù)據(jù)庫(kù)連接session?
          ?????**/
          ????Session?session;

          ????//?分頁(yè)為20
          ????int?pagesize?=?20;
          ????//?當(dāng)前頁(yè)數(shù)
          ????int?pageno?=?1;

          ????/**
          ?????*?@return?分頁(yè)行數(shù)大小(默認(rèn)為20)
          ?????*/
          ????public?int?getPagesize()?{
          ????????return?pagesize;
          ????}

          ????/**
          ?????*?@param?i?設(shè)置分頁(yè)行數(shù)大小
          ?????*/
          ????public?void?setPagesize(int?i)?{
          ????????pagesize?=?i;
          ????}
          ????/**
          ?????*?@return?返回當(dāng)前頁(yè)號(hào),初始值為1
          ?????*/
          ????public?int?getPageno()?{
          ????????return?pageno;
          ????}

          ????/**
          ?????*?@param?i?設(shè)置當(dāng)前頁(yè)號(hào)
          ?????*/
          ????public?void?setPageno(int?i)?{
          ????????pageno?=?i;
          ????}

          ????/**
          ?????*?設(shè)置查詢分頁(yè)
          ?????*/
          ????public?void?setQueryPage(Query?query)?{
          ????????//?設(shè)置分頁(yè)起始記錄號(hào)
          ????????query.setFirstResult((this.pageno?-?1)?*?this.pagesize);
          ????????//?設(shè)置頁(yè)內(nèi)數(shù)據(jù)量
          ????????query.setMaxResults(this.pagesize);
          ????}

          ????/**
          ?????*?打開當(dāng)前的數(shù)據(jù)庫(kù)連接
          ?????*?@return
          ?????*?@throws?HibernateException
          ?????*/
          ????public?void?initSession()?throws?HibernateException?{
          ????????this.session?=?DBUtil.currentSession();
          ????}

          ????/**
          ?????*?關(guān)閉當(dāng)前的數(shù)據(jù)庫(kù)連接
          ?????*?@throws?HibernateException
          ?????*/
          ????public?void?closeSession()?throws?HibernateException?{
          ????????DBUtil.closeSession();
          ????}
          }
          ????????????????
          以后,我們所有的數(shù)據(jù)庫(kù)更新操作都會(huì)繼承AbsBaseMap類,而數(shù)據(jù)庫(kù)查詢操作會(huì)繼承AbsQueryMap類。

          十、數(shù)據(jù)庫(kù)增、刪、改操作映射
          ????一旦有了上節(jié)所提供的AbsBaseMap抽像類和Hibernate所提供的功能,我們只需要了解一點(diǎn)點(diǎn)Java的知識(shí)就可以完成復(fù)雜的數(shù)據(jù)庫(kù)更新功能了。

          ???首先在com.huangdong.dbwebdemo.db包中新建一個(gè)類名為SysUserMap并擴(kuò)展AbsBaseMap類:

          package?com.huangdong.dbwebdemo.db;

          import?com.huangdong.dbwebdemo.form.SysuserForm;

          public?class?SysUserMap?extends?AbsBaseMap?{

          }
          ????????????????
          ????先來(lái)實(shí)現(xiàn)一個(gè)增加的方法,在VO層,我們使用的數(shù)據(jù)類為SysuserForm,所以增加方法的參數(shù)一定是SysuserForm:

          ????public?void?createSysUser(SysuserForm?sysuerForm)
          ????????throws?HibernateException?{
          ????????//?使用sysuerForm的相關(guān)屬性新建sysuser實(shí)例
          ????????SysUser?sysuser?=
          ????????????new?SysUser(
          ????????????????sysuerForm.getUsername(),
          ????????????????sysuerForm.getUserpasword(),
          ????????????????Calendar.getInstance());
          ????????//?啟動(dòng)事務(wù)
          ????????Session?session?=?this.beginTransaction();
          ????????try?{
          ????????????//?新增這個(gè)實(shí)例到數(shù)據(jù)庫(kù)中
          ????????????session.save(sysuser);
          ????????????//?commit
          ????????????this.endTransaction(true);
          ????????}?catch?(HibernateException?e)?{
          ????????????//?rollback
          ????????????this.endTransaction(false);
          ????????????throw?e;
          ????????}
          ????}
          ????????????????
          這個(gè)方法已經(jīng)非常的簡(jiǎn)單了,書寫者完全可以不用理會(huì)數(shù)據(jù)庫(kù)相關(guān)的內(nèi)容了。
          其它代碼請(qǐng)下載。
          ????
          十二、數(shù)據(jù)庫(kù)簡(jiǎn)單查詢
          ????數(shù)據(jù)庫(kù)的查詢相對(duì)復(fù)雜一些了,我們從簡(jiǎn)單做起,先不使用任何條件,查詢數(shù)據(jù)庫(kù)中所有的記錄。在com.huangdong.dbwebdemo.db中新建SysUserQueryMap類,它擴(kuò)展AbsQueryMap抽像類:

          package?com.huangdong.dbwebdemo.db;

          import?java.util.Iterator;

          import?net.sf.hibernate.HibernateException;
          import?net.sf.hibernate.Query;

          /**
          ?*?@author?HD
          ?*/
          public?class?SysUserQueryMap?extends?AbsQueryMap?{
          ????public?SysUserQueryMap()?throws?HibernateException?{
          ????????this.initSession();
          ????}

          ????public?Iterator?findAllSysUser()?throws?HibernateException?{
          ????????//?查詢語(yǔ)句
          ????????String?querystr?=?"from?SysUser";
          ????????//?創(chuàng)建查詢
          ????????Query?query?=?this.session.createQuery(querystr);
          ????????//?設(shè)置分頁(yè)
          ????????this.setQueryPage(query);
          ????????//?返回查詢出的結(jié)果集
          ????????return?query.iterate();
          ????}
          }
          ????????????????
          這里我們已經(jīng)寫好一個(gè)查詢所有的用戶的方法,它的第一句:

          String?querystr?=?"from?SysUser";
          ????????????????
          這里的查詢語(yǔ)句使用了Hibernate的HQL語(yǔ)法,別的我們先不用管,這里SysUser是區(qū)分大小寫的,我們之前定義了SysUser數(shù)據(jù)庫(kù)映射類,這里必須完全一樣,這樣Hibernate就會(huì)從數(shù)據(jù)庫(kù)中取出所有SysUser類的實(shí)例。

          接下來(lái)我們還需要一個(gè)方法能夠按照用戶的id返回其所對(duì)應(yīng)的用戶。?

          ????/**
          ?????*?查詢出一個(gè)UserID的用戶實(shí)例
          ?????*?@param?UserID?用戶的UserID
          ?????*?@return?用戶實(shí)例,如果數(shù)據(jù)庫(kù)無(wú)相應(yīng)記錄返回null
          ?????*?@throws?HibernateException
          ?????*/
          ????public?SysuserForm?getSysuserByID(String?UserID)
          ????????throws?HibernateException?{
          ????????SysuserForm?sysuerform?=?null;

          ????????try?{
          ????????????sysuerform?=
          ????????????????new?SysuserForm(
          ????????????????????(SysUser)?this.session.load(SysUser.class,?UserID));
          ????????}?catch?(HibernateException?e)?{
          ????????????throw?e;
          ????????}
          ????????return?sysuerform;
          ????}????????????????????
          ????????????????
          有了這個(gè)方法,我們才能對(duì)指定用戶進(jìn)行查詢,或者對(duì)他已有的信息進(jìn)行修改。?

          十一、創(chuàng)建第一個(gè)View
          新建JSP頁(yè)面
          我們先為增加記錄建立一個(gè)JSP頁(yè)面editsysuser.jsp,它提供了增加記錄的View。

          ??<%@?page?contentType="text/html;charset=UTF-8"?%>?
          <%@?taglib?uri="/tags/struts-bean"?prefix="bean"?%>?
          <%@?taglib?uri="/tags/struts-html"?prefix="html"?%>?
          <%@?taglib?uri="/tags/struts-logic"?prefix="logic"?%>?
          <html:html>?
          <head>
          ????
          ????<title><bean:message?key="title.register"/></title>
          ????<html:base?/>
          ???????
          ??</head>
          ??
          ??<body>
          <br>OK!!!<br>
          ?<logic:messagesPresent>
          ??????????<bean:message?key="errors.header"/>
          ??????????<ul>
          ??????????<html:messages?id="error">
          ???????????<li><bean:write?name="error"/></li>
          ?????????</html:messages>
          ?????????</ul><hr?/>
          </logic:messagesPresent>


          ????<html:form?action="/sysuser.do?action=add"?method="post"?focus="username"?onsubmit="return?validateSysuserForm(this);">
          ??????<table?border="0">
          ????????<tr>
          ??????????<td>
          ??????????????<bean:message?key="prompt.login"/>
          ??????????</td>
          ??????????<td>
          ????????<html:text?property="username"?size="16"?maxlength="20"/>
          ??????????</td>
          ????????</tr>
          ????????<tr>
          ??????????<td>
          ????????????????<bean:message?key="prompt.password"/>
          ??????????</td>
          ??????????<td>
          ????????????????<html:password?property="userpasword"?/>
          ??????????</td>
          ????????</tr>
          ????????
          ????????<tr>
          ??????????<td>
          ????????????????<html:submit>
          ???????????????????<bean:message?key="title.register"/>
          ????????????????</html:submit>
          ???????????</td>
          ????????</tr>
          ??????</table>

          ????</html:form>
          ???<html:javascript?formName="sysuserForm"/>
          ??</body>
          </html:html>
          ????????????????
          十二、客戶端驗(yàn)證和服務(wù)器端驗(yàn)證
          ????editsysuser.jsp中的表單屬性中有一個(gè)onsubmit="return?validateSysuserForm(this);"與頁(yè)面最后的<html:javascript?formName="sysuserForm"/>一起構(gòu)成表單客戶端驗(yàn)證。所有javaScript驗(yàn)證代碼Struts自動(dòng)生成。
          ????表單服務(wù)器端驗(yàn)證由struts-config.xml中的插件
          ?<plug-in?className="org.apache.struts.validator.ValidatorPlugIn">
          ????<set-property?property="pathnames"?value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
          ?</plug-in>
          ???及資源文件構(gòu)成。

          十三、將業(yè)務(wù)邏輯關(guān)聯(lián)起來(lái)
          posted on 2006-06-05 17:44 船長(zhǎng) 閱讀(487) 評(píng)論(0)  編輯  收藏 所屬分類: J2EE
          主站蜘蛛池模板: 油尖旺区| 嘉荫县| 太湖县| 广水市| 丹寨县| 邵东县| 明水县| 衡南县| 彭阳县| 方山县| 桐柏县| 平塘县| 曲阳县| 新密市| 牙克石市| 繁峙县| 长治县| 河间市| 固安县| 德惠市| 左云县| 青海省| 大理市| 米易县| 东方市| 兰西县| 平凉市| 建宁县| 论坛| 普格县| 五寨县| 涪陵区| 廊坊市| 资兴市| 定兴县| 盐城市| 遂溪县| 织金县| 清水县| 怀柔区| 高阳县|