別的請(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