第五章實(shí)訓(xùn)案例:網(wǎng)絡(luò)書城系統(tǒng)_第1頁(yè)
第五章實(shí)訓(xùn)案例:網(wǎng)絡(luò)書城系統(tǒng)_第2頁(yè)
第五章實(shí)訓(xùn)案例:網(wǎng)絡(luò)書城系統(tǒng)_第3頁(yè)
第五章實(shí)訓(xùn)案例:網(wǎng)絡(luò)書城系統(tǒng)_第4頁(yè)
第五章實(shí)訓(xùn)案例:網(wǎng)絡(luò)書城系統(tǒng)_第5頁(yè)
已閱讀5頁(yè),還剩76頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第五章 實(shí)訓(xùn)案例:網(wǎng)絡(luò)書城系統(tǒng) ·235·第三篇 基于JSP+Struts2+Hibernate技術(shù)架構(gòu)的開(kāi)發(fā)本篇的目的n 掌握Struts技術(shù)n 掌握Hibernate技術(shù)n 掌握事務(wù)處理技術(shù)n 掌握購(gòu)物車原理n 理解泛型的使用n 熟練使用JSP+Struts2+Hibernate技術(shù)架構(gòu)第五章 實(shí)訓(xùn)案例:網(wǎng)絡(luò)書城系統(tǒng)本章將基于JSP+Struts+Hibernate技術(shù)設(shè)計(jì)與實(shí)現(xiàn)網(wǎng)絡(luò)書城系統(tǒng)。5.1 系統(tǒng)分析隨著網(wǎng)絡(luò)的廣泛普及,網(wǎng)絡(luò)支付手段的逐步完善,越來(lái)越多的人逐漸習(xí)慣于網(wǎng)上購(gòu)物,習(xí)慣于鼠標(biāo)點(diǎn)擊下訂單,送貨上門的快捷便利的購(gòu)物方式。傳統(tǒng)書店的購(gòu)書觀念正在被網(wǎng)上方便快捷

2、的購(gòu)書方式所沖擊。網(wǎng)絡(luò)書城就是借助于互聯(lián)網(wǎng),搭建讀者和圖書銷售企業(yè)之間的橋梁,實(shí)現(xiàn)圖書的快速查詢和購(gòu)買,既方便讀者,也方便圖書銷售企業(yè)管理、宣傳、推廣和銷售圖書。5.1.1 需求描述網(wǎng)絡(luò)書城的主要功能就是讓用戶能夠足不出戶就可以購(gòu)買到自已想要的書籍,所以網(wǎng)絡(luò)書城系統(tǒng)主要提供如下功能:l 用戶能夠使用本網(wǎng)站完成圖書的瀏覽、查詢和購(gòu)買。l 普通用戶只能瀏覽圖書信息。瀏覽分為三種方式:按類別瀏覽、按條件瀏覽、查詢圖書。l 普通用戶通過(guò)注冊(cè)成為注冊(cè)用戶,注冊(cè)后的用戶可以登錄,密碼忘記后可以找回密碼,登錄后可以修改注冊(cè)資料。l 注冊(cè)用戶登錄后可以進(jìn)行在線圖書購(gòu)買,購(gòu)買的圖書存放在購(gòu)物車中;可以對(duì)購(gòu)物車中

3、的商品數(shù)量進(jìn)行修改、刪除;調(diào)整好購(gòu)物車中內(nèi)容后,可進(jìn)行結(jié)算,以將購(gòu)買的圖書保存到訂單中。l 注冊(cè)用戶登錄后可以瀏覽自己的訂單,查看訂單細(xì)目,對(duì)于沒(méi)有得到商家處理的訂單可以取消。l 管理員可分頁(yè)瀏覽用戶,可查看用戶詳細(xì)信息,可刪除用戶。l 管理員可管理圖書分類、管理圖書,添加圖書時(shí)能夠上傳圖書的圖片。l 管理員可分頁(yè)瀏覽訂單、查看訂單狀態(tài),處理訂單,刪除訂單。5.1.2 用例分析用例圖(Use-case Diagram)顯示外部參與者與系統(tǒng)的交互,能夠更直觀地描述系統(tǒng)的功能。從角色來(lái)看,網(wǎng)絡(luò)書城系統(tǒng)的用戶分為用戶(普通用戶)、會(huì)員(注冊(cè)用戶)、管理員。圖5-1和5-2是網(wǎng)絡(luò)書城系統(tǒng)的兩個(gè)用例圖。

4、圖5-1 客戶端用例圖圖5-2 管理端用例圖5.1.3 功能分類表5-1給出了網(wǎng)絡(luò)書城的功能分類。表5-1 功能劃分表模塊名子功能描述前臺(tái)功能用戶登錄提供用戶名、密碼后可以登錄系統(tǒng)用戶注冊(cè)普通用戶在注冊(cè)頁(yè)填寫詳細(xì)資料后成為正式注冊(cè)用戶個(gè)人修改用戶登錄后可以修改自己的注冊(cè)資料找回密碼忘記密碼的用戶可以通過(guò)email找回密碼密碼設(shè)置管理員可以修改自己的密碼瀏覽圖書以分頁(yè)方式顯示圖書列表,并通過(guò)單擊標(biāo)題可查看書的詳細(xì)信息;可進(jìn)行分類瀏覽圖書,并可按條件查詢圖書購(gòu)物車登錄用戶在瀏覽圖書時(shí),可以把需要的圖書添加到購(gòu)物車中;可瀏覽購(gòu)物車,修改購(gòu)物車中圖書的數(shù)量,刪除購(gòu)物車中的圖書,清空購(gòu)物車,或結(jié)算訂單瀏

5、覽登錄用戶可以瀏覽自己的訂單,查看狀態(tài),并可查看訂單細(xì)目后臺(tái)維護(hù)用戶管理管理員可分頁(yè)瀏覽用戶、查看用戶詳細(xì)信息,可刪除用戶分類管理管理員進(jìn)入瀏覽產(chǎn)品分類,可添加、修改或刪除分類圖書管理管理員可分頁(yè)瀏覽圖書、查看圖書詳細(xì)信息,可添加或修改圖書訂單管理管理員可分頁(yè)瀏覽訂單、查看訂單狀態(tài)、處理訂單,刪除訂單5.1.4 其他需求系統(tǒng)的界面美觀、簡(jiǎn)潔、菜單設(shè)置和布局合理,除圖形外界面色彩不宜過(guò)多。頁(yè)面具有明確的導(dǎo)航指示,且便于理解,方便用戶使用。進(jìn)入本系統(tǒng)進(jìn)行任何操作的時(shí)候,系統(tǒng)應(yīng)該及時(shí)的進(jìn)行反應(yīng),反應(yīng)的時(shí)間在5秒以內(nèi)。系統(tǒng)應(yīng)能監(jiān)測(cè)出各種非正常情況,如與設(shè)備的通信中斷,無(wú)法連接數(shù)據(jù)庫(kù)服務(wù)器等,避免出現(xiàn)長(zhǎng)

6、時(shí)間等待甚至無(wú)響應(yīng)。系統(tǒng)有嚴(yán)格的權(quán)限管理功能,各功能模塊需有相應(yīng)的權(quán)限方能進(jìn)入。系統(tǒng)需能夠防止各類誤操作可能造成的數(shù)據(jù)丟失,破壞。防止用戶非法獲取網(wǎng)頁(yè)以及內(nèi)容。5.2 系統(tǒng)設(shè)計(jì)5.2.1 系統(tǒng)功能結(jié)構(gòu)系統(tǒng)的功能結(jié)構(gòu)如圖5-3所示。圖5-3 網(wǎng)絡(luò)書城的功能結(jié)構(gòu)圖5.2.2 數(shù)據(jù)庫(kù)設(shè)計(jì)根據(jù)企業(yè)信息展示系統(tǒng)的要求,主要涉及的數(shù)據(jù)有用戶、圖書分類、圖書、訂單、訂單細(xì)目。為此建立5個(gè)數(shù)據(jù)表來(lái)存儲(chǔ)對(duì)應(yīng)的數(shù)據(jù)。1. 數(shù)據(jù)庫(kù)的邏輯設(shè)計(jì)用戶表所包含的字段如表5-2所示。表5-2 用戶表名稱描述數(shù)據(jù)類型大小約束默認(rèn)值user_id用戶編號(hào)int/AI PKuser_name用戶名稱varchar50NNuser_

7、pwd密碼varchar50NNuser_realname真實(shí)名varchar50NNuser_phone電話varchar50NNuser_email電子郵件varchar200NNuser_addr地址varchar200NNuser_datetime注冊(cè)時(shí)間timestamp/NN當(dāng)前時(shí)間user_right權(quán)限int/NN1圖書分類表所包含的字段如表5-3所示。表5-3 圖書分類表名稱描述數(shù)據(jù)類型大小約束默認(rèn)值cat_id分類編號(hào)int/AI PKcat_name分類名稱varchar50NN UN圖書表所包含的字段如表5-4所示。表5-4 圖書表名稱描述數(shù)據(jù)類型大小約束默認(rèn)值book

8、_id圖書編號(hào)int/AI PKcat_id分類編號(hào)int/NN FKbook_publisher出版社varchar200NNbook_isbn書號(hào)varchar50NNbook_name圖書名稱varchar200NNbook_picture圖像varchar200NNbook_price價(jià)格float/NNbook_author作者varchar50book_desc簡(jiǎn)介text/book_num數(shù)量int/訂單表所包含的字段如表5-5所示。表5-5 訂單表名稱描述數(shù)據(jù)類型大小約束默認(rèn)值ord_id訂單編號(hào)int/AI PKuser_id用戶編號(hào)int/NN FKord_datetime

9、訂貨時(shí)間timestamp/NNord_state狀態(tài)int/NN當(dāng)前時(shí)間訂單細(xì)目表所包含的字段如表5-6所示。表5-6 訂單細(xì)目表名稱描述數(shù)據(jù)類型大小約束默認(rèn)值det_id細(xì)目編號(hào)int/PKord_id訂單編號(hào)int/NN FKbook_id圖書編號(hào)text/NN FKdet_num數(shù)量int/NN02. 數(shù)據(jù)庫(kù)的物理設(shè)計(jì)系統(tǒng)數(shù)據(jù)庫(kù)命名為bs,bs_category(圖書分類),bs_book(圖書),bs_user(用戶)、bs_order(訂單),bs_details(訂單細(xì)目)。表之間的關(guān)系如圖5-4所示。圖5-4 網(wǎng)絡(luò)書城系統(tǒng)數(shù)據(jù)表及其關(guān)系建立的數(shù)據(jù)庫(kù)的SQL腳本如下所示。crea

10、te database bs;use bs ;create table bs_category(cat_id int auto_increment primary key,cat_name varchar(50) not null unique );create table bs_book(book_id int auto_increment primary key,cat_id int not null references bs_category(cat_id),book_publisher varchar (200) not null ,book_isbn varchar(50) not

11、 null,book_name varchar(50) not null,book_picture varchar(50) not null,book_price float not null,book_author varchar(50) not null,book_desc text not null,book_num int not null);create table bs_user (user_id int auto_increment primary key,user_name varchar(50) not null,user_pwd varchar(50) not null,u

12、ser_realName varchar(50) not null,user_phone varchar(50) not null,user_email varchar(200) not null,user_addr varchar(200) not null,user_datetime timestamp,user_right int default 1);create table bs_order (ord_id int auto_increment primary key,user_id int not null references bs_user(user_id),ord_datet

13、ime timestamp,ord_state int default 0);create table bs_details(det_id int auto_increment primary key,ord_id int not null references bs_order(ord_id),book_id int not null references bs_book(book_id),det_num float not null);5.2.3 架構(gòu)及程序結(jié)構(gòu)為了實(shí)現(xiàn)系統(tǒng)便于維護(hù)和擴(kuò)展的目標(biāo),系統(tǒng)采用分層架構(gòu),整體上分四層:視圖層、控制層、業(yè)務(wù)邏輯層和數(shù)據(jù)訪問(wèn)層。系統(tǒng)實(shí)現(xiàn)采用JSP+St

14、ruts+Hibernate技術(shù)。即視圖層主要通過(guò)JSP實(shí)現(xiàn),控制層通過(guò)Struts實(shí)現(xiàn),數(shù)據(jù)層通過(guò)Hibernate實(shí)現(xiàn)。項(xiàng)目命名為bs。視圖放在【W(wǎng)eb頁(yè)】文件夾下。為了便于管理,劃分如下文件夾:user(用戶),category(分類),book(圖書),bookimages(圖書圖像),cart(購(gòu)物車),order(訂單),common(公共),css(樣式表),images(圖像),script(腳本)。如圖5-5所示。其他層均放在源包下。在源包下建立bookstore.action(控制類包),bookstore.idao(數(shù)據(jù)訪問(wèn)接口包),bookstore.dao(數(shù)據(jù)訪問(wèn)實(shí)

15、現(xiàn)類包),bookstore.iservice(業(yè)務(wù)邏輯接口包),bookstore.service(業(yè)務(wù)邏輯實(shí)現(xiàn)類包),bookstore.model(數(shù)據(jù)模型或?qū)嶓w類包),mon(一些公共類包),bookstore.tag(自定義標(biāo)簽包)。如圖5-6所示。 圖5-5 文件夾劃分 圖5-6 包劃分5.2.4 領(lǐng)域模型設(shè)計(jì)(實(shí)體、接口設(shè)計(jì)) 1實(shí)體模型類設(shè)計(jì) 系統(tǒng)主要包含如下實(shí)體模型類,也稱為數(shù)據(jù)模型類: BsUser(用戶)、BsCategory(分類)、BsBook(圖書)、訂單(BsOrder)、訂單細(xì)目(Details)、購(gòu)物車條目(BsCartItem)。這些類均存放在bs.mode

16、l包下。在NetBeans集成VP-UML環(huán)境下設(shè)計(jì)的類圖如圖5-7所示。圖5-7 實(shí)體模型類類圖(1)BsUser類public class BsUser implements java.io.Serializable private Integer userId; private String userName;private String userRealName; private String userPwd;private String userPhone; private String userEmail; private String userAddr; private Date

17、 userDatetime; private Integer userRight;/屬性方法省略(2)BsCategory類public class BsCategory implements java.io.Serializable private Integer catId; private String catName;/屬性方法省略(3)BsBook類public class BsBook implements java.io.Serializable private Integer bookId; private BsCategory category; private String

18、 bookPublisher; private String bookIsbn; private String bookName; private String bookPicture; private Float bookPrice; private String bookAuthor; private String bookDesc; private Integer bookNum;/屬性方法省略(4)BsOrder類 public class BsOrder implements java.io.Serializable private Integer ordId; private Bs

19、User user; private Date ordDatetime; private Float ordTotal; private Integer ordState; private Set bsDetailses = new HashSet(0);/屬性方法省略(5)BsDetails類public class BsDetails implements java.io.Serializable private Integer orddId; private BsBook bsBook; private BsOrder bsOrder; private Float orddPrice;

20、private Integer orddCount; /屬性方法省略(6)BsCartItem類public class BsCartItem implements Serializable private Integer bookId; private String bookName; private Float bookPrice; private Integer num; /屬性方法省略2業(yè)務(wù)邏輯層接口設(shè)計(jì)業(yè)務(wù)邏輯層接口體現(xiàn)了業(yè)務(wù)功能的需要,它反映了系統(tǒng)所具有的業(yè)務(wù)功能,業(yè)務(wù)邏輯接口放在bs.iservice包下。在NetBeans集成VP-UML環(huán)境下設(shè)計(jì)的接口圖如圖5-8所示。圖5-

21、8 業(yè)務(wù)邏輯層接口圖(1)用戶業(yè)務(wù)邏輯層接口(IBsUserService)public interface IBsUserService void addUser(BsUser user); void editUser(BsUser user); void deleteUser(Integer userId); BsUser findUserById(Integer userId);BsUser findUser(String userName, String userPwd);String findUser(String userName, String userEmail); List&

22、lt;BsUser> findUsers(Integer pageNo, Integer pageSize); Integer findCount(); (2)分類業(yè)務(wù)邏輯層接口(IBsCategoryService)public interface IEpCategoryServicevoid addCategory(EpCategory category);void editCategory(BsCategory category);void deleteCategory(Integer catId);BsCategory findCategoryById(Integer catId

23、);List<EpCategory> findCategories();List<BsCategory> findCategories(Integer pageNo, Integer pageSize);int findCount();(3)圖書業(yè)務(wù)邏輯層接口(IBsBookService)public interface IBsBookService void addBook(BsBook book); void editBook(BsBook book); void deleteBook(Integer bookId); BsBook findBookById(In

24、teger bookId); List<BsBook> findBooks(Integer catId, String bookName, String bookAuthor, Integer pageNo, Integer pageSize); int findCount(Integer catId, String bookName, String bookAuthor);(4)訂單業(yè)務(wù)邏輯層接口(IBsOrderService)public interface IBsOrderService void addOrder(BsOrder order); void editOrde

25、r(BsOrder order); void deleteOrder(Integer ordId); BsOrder findOrderById(Integer ordId); List<BsOrder> findOrders(Integer userId, Integer pageNo, Integer pageSize); int findCount(Integer userId);(5)購(gòu)物車業(yè)務(wù)邏輯接口(IBsCartService)public interface IBsCartService void addItem(Integer bookId); void edit

26、Item(Integer bookId, int num); void deleteItem(Integer bookId); void clear(); List<BsCartItem> findItems(); float findTotal();3建立數(shù)據(jù)訪問(wèn)層接口數(shù)據(jù)訪問(wèn)層實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的訪問(wèn),其接口定義了數(shù)據(jù)訪問(wèn)的方法。先建立一個(gè)基接口IBsBaseDao封裝共有的操作,該接口使用了泛型,泛型的兩個(gè)參數(shù)T和ID分別表示操作的具體類和主鍵類型。其他接口繼承基接口。數(shù)據(jù)訪問(wèn)層接口放在bs.idao下。在NetBeans集成VP-UML環(huán)境下設(shè)計(jì)的接口圖如圖5-9所示。圖5-9

27、數(shù)據(jù)訪問(wèn)層接口圖(1)數(shù)據(jù)訪問(wèn)層基接口(IBsBaseDao)public interface IBsBaseDao<T,ID extends Serializable> void insert(T obj); void update(T obj); void delete(ID id); T selectById(ID id); List<T> selectAll(); List<T> selectAll(Integer pageSize, Integer pageNo); int selectAllCount();(2)用戶數(shù)據(jù)訪問(wèn)層接口(IBsUser

28、Dao)public interface IBsUserDao extends IBsBaseDao<BsUser, Integer> BsUser selectOne(String userName, String userEmail); String selectPwd(String userName, String userEmail);(3)分類數(shù)據(jù)訪問(wèn)層接口(IBsCategoryDao)public interface IBsCategoryDao extends IBsBaseDao<BsCategory, Integer> (4)圖書數(shù)據(jù)訪問(wèn)層接口(IB

29、sBookDao)public interface IBsBookDao extends IBsBaseDao<BsBook,Integer> List<BsBook> selectSome(Integer catId, String bookName, String bookAuthor, Integer pageNo, Integer pageSize); int selectCount(Integer catId, String bookName, String bookAuthor);(5)訂單數(shù)據(jù)訪問(wèn)層接口(IBsOrderDao)public interfa

30、ce IBsOrderDao extends IBsBaseDao<BsOrder, Integer> List<BsOrder> selectSome(Integer userId, Integer pageNo, Integer pageSize); int selectCount(Integer userId);(6)訂單細(xì)目數(shù)據(jù)訪問(wèn)層接口(IBsDetailsDao)public interface IBsDetailsDao extends IBsBaseDao<BsDetails, Integer> void deleteSome(Integer

31、 ordId); 5.2.5 系統(tǒng)配置1添加所需JAR或框架 在【庫(kù)】上單擊鼠標(biāo)右鍵,在彈出的菜單中選擇【添加庫(kù)】或者【添加JAR/文件夾】即可添加庫(kù)或JAR文件。(1)在庫(kù)中添加MySQL驅(qū)動(dòng)程序直接使用Netbeans自帶的MySQL驅(qū)動(dòng)程序即可。(2)在庫(kù)中添加Hibernate。Netbeans自帶Hibernate3,若希望(3)在庫(kù)中添加Struts2從網(wǎng)址下載Struts2,目前可下載到的最新版本是struts。下載后得到壓縮包struts--all.zip文件。解壓后的文件夾中包含一個(gè)“struts-

32、lib”文件夾,該文件夾包含了Struts2的類庫(kù)。在庫(kù)中添加如下jar文件:commons-fileupload-5.3.jar、commons-io-2.0.5.jar、common-lang3-3.5.jar、framearker-2.3.19.jar、ognl-3.0.6.jar、struts2-core-.jar、struts2-sping-plugin-.jar、xwork-core-.jar。(4)在庫(kù)中添加標(biāo)準(zhǔn)標(biāo)簽庫(kù)直接添加Netbeans自帶的JSTL 1.1即可。2配置Struts2(1)建立標(biāo)準(zhǔn)部署描述符(w

33、eb.xml)文件。(2)在web.xml中加入如下Struts2核心控制器(過(guò)濾器)的配置。<filter> <filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class></filter><filter-mapping> <filter-name>struts2</filter-name&g

34、t; <url-pattern>*.action</url-pattern></filter-mapping><filter-mapping> <filter-name>struts2</filter-name> <url-pattern>*.jsp</url-pattern></filter-mapping>(3)在【源包】下建立配置文件perties,其內(nèi)容如下所示。struts.enable.DynamicMethodInvocation=truestruts.

35、locale=zh_CHstruts.i18n.encoding =utf-8struts.devMode=truestruts.ui.theme=simplestruts.multipart.maxSize=3221225472struts.multipart.saveDir=/Tempstruts.custom.i18n.resources=resources 3配置Hibernate配置文件hibernate.cfg.xml放在【源包】下,具體配置步驟如下:(1)切換到【服務(wù)】選項(xiàng)卡,先建立rc數(shù)據(jù)庫(kù)的連接。(2)在【源包】上單擊鼠標(biāo)右鍵,在彈出的菜單中選擇【新建】【其他】,打開(kāi)【新建文

36、件】對(duì)話框。(3)在如圖5-10所示的新建文件對(duì)話框中,先在類別列表中選擇【Hibernate】,然后在文件類型列表中選擇【Hibernate配置向?qū)А?,單擊【下一步】按鈕。圖5-10 新建Hibenate配置文件(4)在如圖5-11所示的對(duì)話框,名稱和位置保留默認(rèn),直接單擊【下一步】按鈕。圖5-11 設(shè)置名稱和位置(5)在如圖5-12所示的對(duì)話框,數(shù)據(jù)庫(kù)連接選擇第(1)步建立的連接,單擊【完成】按鈕。圖5-12 選擇數(shù)據(jù)源(6)在如圖5-13所示的配置文件的【設(shè)計(jì)】界面,展開(kāi)可選屬性,單擊【添加】按鈕,添加hibernate.show_sql屬性。設(shè)置此屬性的目的是為了方便調(diào)試。圖5-13

37、添加Hibernate屬性配置后的文件內(nèi)容如下所示。<?xml version="5.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC "-/Hibernate/Hibernate Configuration DTD 3.0/EN" "<hibernate-configuration> <session-factory> <property name="hibernate.dialect&quo

38、t;>org.hibernate.dialect.MySQLDialect</property> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:/localhost:3306/rc?zeroDateTimeBehavior=convertToNull</property&

39、gt; <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">1234</property> <property name="hibernate.show_sql">true</property> </session-factory></hibernate-configuration

40、>5.2.6 公共類設(shè)計(jì)1分頁(yè)工具類BsPageList在mon包下建立BsPageList類。該類主要用于封裝當(dāng)前頁(yè)數(shù)據(jù)及生成分頁(yè)棒。它根據(jù)記錄總數(shù)、頁(yè)的大小、頁(yè)號(hào)、url類等數(shù)據(jù),生成前后翻頁(yè)和數(shù)字翻頁(yè)兩種翻頁(yè)棒。具體設(shè)計(jì)可參考第三章。2工廠模式相關(guān)類為了減少各層之間的耦合,采用工廠模式來(lái)建立對(duì)象。按照這種模式,使用對(duì)象的類不由自己來(lái)建立對(duì)象,而是由一個(gè)工廠類來(lái)建立對(duì)象。以業(yè)務(wù)邏輯層為例,業(yè)務(wù)邏輯層需要使用數(shù)據(jù)訪問(wèn)層對(duì)象,但在業(yè)務(wù)邏輯類中不直接建立數(shù)據(jù)訪問(wèn)類對(duì)象,而是使用工廠類建立數(shù)據(jù)訪問(wèn)類對(duì)象。工廠類BsFactory放在mon包下,主要的原理是:在配置文件中描述實(shí)例,工廠類使用反

41、射機(jī)制建立對(duì)象。具體的方法是,工廠類根據(jù)邏輯名到配置文件中獲得實(shí)際的類名,然后利用如下語(yǔ)句建立對(duì)象。實(shí)現(xiàn)代碼如下所示。public class BsFactory public static Object getBean(String name) try String className = BsCp.getProperty(name); Object obj = Class.forName(className).newInstance(); return obj; catch (Exception ex) ex.printStackTrace(); return null;

42、 使用該類需要在WEB-INF文件夾下建立配置文件perties,還需要建立用于存儲(chǔ)配置信息的類BsConfig。其代碼如下所示。public class BsConfig public static Properties prop = new Properties();此外,需要使用一個(gè)Servlet類BsStartServlet在應(yīng)用啟動(dòng)時(shí),加載配置數(shù)據(jù)。public class BsStartServlet extends HttpServlet Override public void init() throws ServletException try Strin

43、g path = this.getServletContext().getRealPath("/WEB-INF/perties"); InputStream in = new FileInputStream(path); BsCp.load(in); catch (Exception ex) throw new ServletException(ex.getMessage(); 在web.xml對(duì)這個(gè)Servlet類進(jìn)行配置,具體配置如下所示。<servlet> <servlet-name>StartServle

44、t</servlet-name> <servlet-class>mon.BsStartServlet</servlet-class> <load-on-startup>0</load-on-startup></servlet><servlet-mapping> <servlet-name>StartServlet</servlet-name> <url-pattern>/StartServlet</url-pattern></servlet-mapping&

45、gt;3Hiberntae工具類BsHibernateUtil該封裝建立SessionFactory、Session等操作。在該類中使用了ThreadLocal。ThreadLocal為每一個(gè)使用某變量的線程都提供一個(gè)該變量值的副本,使每一個(gè)線程都可以獨(dú)立地改變自己的副本,而不會(huì)和其他線程的副本沖突。從線程的角度看,就好像每一個(gè)線程都完全擁有一個(gè)該變量,這就解決了Servlet非線程安全的問(wèn)題。public class BsHibernateUtil /線程本地,用于保存session,保證為每個(gè)線程序只建立一個(gè)sesison private static final ThreadLocal&

46、lt;Session> threadLocal = new ThreadLocal<Session>(); /線程本地,用于保存Transaction,保證為每個(gè)線程序只建立一個(gè)Transactionprivate static final ThreadLocal<Transaction> transLocal = new ThreadLocal<Transaction>(); /定義一個(gè)sessionFactory private static org.hibernate.SessionFactory sessionFactory; static t

47、ry sessionFactory = new Configuration().configure().buildSessionFactory(); catch (Exception ee) ee.printStackTrace(); / 獲得session public static Session getSession() throws HibernateException Session session = (Session) threadLocal.get(); if (session = null | !session.isOpen() session = (sessionFacto

48、ry != null) ? sessionFactory.openSession(): null; threadLocal.set(session); return session; / 啟動(dòng)事務(wù) public static void beginTransaction() throws HibernateException Transaction tr = (Transaction) transLocal.get(); if (tr = null) Session session = getSession(); tr = (session != null) ? session.beginTra

49、nsaction() : null; transLocal.set(tr); /提交事務(wù) public static void commitTransaction() Transaction tr = (Transaction) transLocal.get(); if (tr != null && tr.isActive() mit(); transLocal.set(null); /提交事務(wù) public static void rollbackTransaction() Transaction tr = (Transaction) transLocal.get(); if

50、 (tr != null && tr.isActive() tr.rollback(); transLocal.set(null); / 關(guān)閉session public static void closeSession() throws HibernateException Session session = (Session) threadLocal.get(); threadLocal.set(null); if (session != null && session.isOpen() session.close(); public static org.

51、hibernate.SessionFactory getSessionFactory() return sessionFactory; 4. 用于事務(wù)處理的攔截器設(shè)計(jì)一個(gè)Strust2攔截器BsTransactionInterceptor來(lái)維護(hù)事務(wù),以簡(jiǎn)化事務(wù)處理,并解決延遲加載的問(wèn)題。public class BsTransactionInterceptor extends AbstractInterceptor private String msg; public String getMsg() return msg; public void setMsg(String msg) this

52、.msg = msg; Override public String intercept(ActionInvocation invocation) throws Exception ActionContext as = invocation.getInvocationContext(); try BsHibernateUtil.beginTransaction(); return invocation.invoke(); catch (Exception e) BsHibernateUtil.rollbackTransaction(); as.put("msg", msg); return "msg" finally try BsHibernateUmitTransaction(); catch (Exceptio

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論