<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-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目錄樹(shù)的一個(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樹(shù)中
    ????????????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文件,將所有的中文信息寫(xiě)入,再通過(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);
    ????}

    ????/**
    ?????*?打開(kāi)當(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)單了,書(shū)寫(xiě)者完全可以不用理會(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)寫(xiě)好一個(gè)查詢所有的用戶的方法,它的第一句:

    String?querystr?=?"from?SysUser";
    ????????????????
    這里的查詢語(yǔ)句使用了Hibernate的HQL語(yǔ)法,別的我們先不用管,這里SysUser是區(qū)分大小寫(xiě)的,我們之前定義了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) 閱讀(483) 評(píng)論(0)  編輯  收藏 所屬分類: J2EE
    主站蜘蛛池模板: 亚洲日韩v无码中文字幕| 精品乱子伦一区二区三区高清免费播放 | 一级特黄色毛片免费看| 亚洲一级毛片在线播放| 亚洲国产另类久久久精品小说| 妞干网免费视频观看| 精品无码AV无码免费专区| 最新亚洲成av人免费看| 污网站免费在线观看| 亚洲欧好州第一的日产suv| 亚洲第一区视频在线观看| 亚洲AV无码精品色午夜在线观看| 免费在线观看a级毛片| 成年女人午夜毛片免费视频| 91制片厂制作传媒免费版樱花| 久久免费观看视频| yellow视频免费在线观看| 国产成人亚洲午夜电影| 亚洲综合小说另类图片动图| 亚洲综合婷婷久久| 亚洲AV色香蕉一区二区| 亚洲精品成人无限看| 亚洲线精品一区二区三区| 亚洲午夜精品第一区二区8050| www亚洲精品少妇裸乳一区二区| 日本免费v片一二三区| 免费的一级黄色片| 午夜老司机免费视频| 免费看美女让人桶尿口| 成人免费无码大片A毛片抽搐色欲| 一区二区无码免费视频网站| 久久午夜夜伦鲁鲁片无码免费| 毛片在线全部免费观看| 国产精品99久久免费观看| a级毛片毛片免费观看久潮| 爽爽爽爽爽爽爽成人免费观看| 天堂在线免费观看| 特级精品毛片免费观看| 久久久久久国产精品免费无码| 中国人xxxxx69免费视频| 曰批视频免费30分钟成人|