Struts2-Spring和Hibernate整合

jopen 10年前發布 | 51K 次閱讀 Struts2 JEE框架

Struts作為MVC 2的Web框架,自推出以來不斷受到開發者的追捧,得到廣泛的應用。作為最成功的Web框架,Struts自然擁有眾多的優點:MVC 2模型的使用、功能齊全的標志庫(Tag Library)、開放源代碼。而Spring的出現,在某些方面極大的方面了Struts的開發。同時,Hibernate作為對象持久化的框架,能顯示的提高軟件開發的效率與生產力。這三種流行框架的整合應用,可以發揮它們各自的優勢,使軟件開發更加的快速與便捷。
現在就將筆者使用Myeclipse工具應用struts2 + spring2 + hibernate3 實現CRUD操作的步驟一一紀錄下來,為初學者少走彎路略盡綿薄之力!在本文中,筆者將Struts2.0.6、Spring2.0.6和 Hibernate3.1進行整合,希望通過這樣的整合示例,讓讀者了解這些框架各自的特點,盡快上手!
一、準備工作
spring2與1.x區別不大,可以平滑的過度,筆者也是把spring1.28換成了spring2.0.6,算是升級到spring 2.0了。struts2基本就是webwork2.2,與以前的struts1.x可以說沒任何關系了。因為是第一次用struts2,也是第一次用 webwork,所以有很多不完善,不規范的地方,還望大家來拍磚。
開發環境:MyEclipse5.0+Eclipse3.2+JDK5.0+
Tomcat5.5+struts2+Spring2.0.6+Hibernate3.1。本示例通過對一個圖書進行管理的系統,提供基本的增加、刪除、修改、查詢等功能。
lib包需要以下右圖所示的這些包。其中Struts2.0.6的下載地址為:
http://people.apache.org/builds/struts/2.0.6
Hibernate3.1的下載地址為:
http://www.hibernate.org
spring2.0.6的下載地址為:
http://www.springframework.org
使用的數據庫為mysql 5.0,使用的JDBC驅動JAR包為:mysql-connection-java-5.0.4-bin
創建數據表的sql語句為:
create database game 
CREATE TABLE books (
book_id int(11) NOT NULL default '0',
book_name varchar(200) character set gb2312 default NULL,
book_author varchar(100) character set gb2312 default NULL,
book_publish varchar(100) character set gb2312 default NULL,
book_date date default NULL,
book_isbn varchar(20) default NULL,
book_page int(11) default NULL,
book_price decimal(10,2) default NULL,
book_content varchar(100) character set gb2312 default NULL,
PRIMARY KEY  (book_id)) ENGINE=InnoDB DEFAULT CHARSET=gbk ROW_FORMAT=COMPRESSED;
二、建立公共類 
1、AbstractAction類
Struts2和Struts1.x的差別,最明顯的就是Struts2是一個pull-MVC架構。Struts1.x 必須繼承org.apache.struts.action.Action或者其子類,表單數據封裝在FormBean中。Struts 2無須繼承任何類型或實現任何接口,表單數據包含在Action中,通過Getter和Setter獲取。
雖然,在理論上Struts2的Action無須實現任何接口或者是繼承任何的類,但是,在實際編程過程中,為了更加方便的實現Action,大多數情況下都會繼承com.opensymphony.xwork2.ActionSupport類,并且重載(Override)此類里的String execute()方法。因此先建立抽象類,以供其它Action類使用。
package com.sterning.commons;
import com.opensymphony.xwork2.ActionSupport;
     public class AbstractAction extends ActionSupport {
}
com.sterning.commons.AbstractAction.java
參考JavaDoc,可知ActionSupport類實現了接口:
com.opensymphony.xwork2.Action
com.opensymphony.xwork2.LoaleProvider
com.opensymphony.xwork2.TextProvider
com.opensymphony.xwork2.Validateable
com.opensymphony.xwork2.ValidationAware
com.uwyn.rife.continuations.ContinuableObject
java.io.Searializable
java.lang.Cloneable

2、Pager分頁類
為了增加程序的分頁功能,特意建立共用的分頁類。
package com.sterning.commons;
import java.math.;
public class Pager {
private int totalRows; //總行數
    private int pageSize = 5; //每頁顯示的行數
    private int currentPage; //當前頁號
    private int totalPages; //總頁數
    private int startRow; //當前頁在數據庫中的起始行
public Pager() {
}
public Pager(int _totalRows) {
totalRows = _totalRows;
totalPages=totalRows/pageSize;
int mod=totalRows%pageSize;
if(mod>0){
totalPages++;
}
currentPage = 1;
startRow = 0;
}
public int getStartRow() {
return startRow;
}
public int getTotalPages() {
return totalPages;
}
public int getCurrentPage() {
return currentPage;
}
public int getPageSize() {
return pageSize;
}
public void setTotalRows(int totalRows) {
this.totalRows = totalRows;
}
public void setStartRow(int startRow) {
this.startRow = startRow;
}
public void setTotalPages(int totalPages) {
this.totalPages = totalPages;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getTotalRows() {
return totalRows;
}
public void first() {
currentPage = 1;
startRow = 0;
}
public void previous() {
if (currentPage == 1) {
return;
}
currentPage--;
startRow = (currentPage - 1)
pageSize;
}
public void next() {
if (currentPage < totalPages) {
currentPage++;
}
startRow = (currentPage - 1) pageSize;
}
public void last() {
currentPage = totalPages;
startRow = (currentPage - 1)
pageSize;
}
public void refresh(int _currentPage) {
currentPage = _currentPage;
if (currentPage > totalPages) {
last();
}
}
}
com.sterning.commons.Pager.java
同時,采用PagerService類來發布成為分頁類服務PagerService,代碼如下:
package com.sterning.commons;
public class PagerService {
public Pager getPager(String currentPage,String pagerMethod,int totalRows) {
//    定義pager對象,用于傳到頁面
        Pager pager = new Pager(totalRows);
//    如果當前頁號為空,表示為首次查詢該頁
//    如果不為空,則刷新pager對象,輸入當前頁號等信息
        if (currentPage != null) {
pager.refresh(Integer.parseInt(currentPage));
}
//    獲取當前執行的方法,首頁,前一頁,后一頁,尾頁。
        if (pagerMethod != null) {
if (pagerMethod.equals("first")) {
pager.first();
} else if (pagerMethod.equals("previous")) {
pager.previous();
} else if (pagerMethod.equals("next")) {
pager.next();
} else if (pagerMethod.equals("last")) {
pager.last();
}
}
return pager;
}
}

三、 建立數據持久化層
 
1、編寫實體類Books及books.hbm.xml映射文件。
package com.sterning.books.model;
import java.util.Date;
public class Books {
//    Fields 
    private String bookId;//編號
    private String bookName;//書名
    private String bookAuthor;//作者
    private String bookPublish;//出版社
    private Date bookDate;//出版日期
    private String bookIsbn;//ISBN
    private String bookPage;//頁數
    private String bookPrice;//價格
    private String bookContent;//內容提要
//    Constructors
    public Books(){}
//    Property accessors
    public String getBookId() {
        return bookId;
}
public void setBookId(String bookId) {
this.bookId = bookId;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getBookAuthor() {
return bookAuthor;
}
public void setBookAuthor(String bookAuthor) {
this.bookAuthor = bookAuthor;
}
public String getBookContent() {
return bookContent;
}
public void setBookContent(String bookContent) {
this.bookContent = bookContent;
}
public Date getBookDate() {
return bookDate;
}
public void setBookDate(Date bookDate) {
this.bookDate = bookDate;
}
public String getBookIsbn() {
return bookIsbn;
}
public void setBookIsbn(String bookIsbn) {
this.bookIsbn = bookIsbn;
}
public String getBookPage() {
return bookPage;
}
public void setBookPage(String bookPage) {
this.bookPage = bookPage;
}
public String getBookPrice() {
return bookPrice;
}
public void setBookPrice(String bookPrice) {
this.bookPrice = bookPrice;
}
public String getBookPublish() {
return bookPublish;
}
public void setBookPublish(String bookPublish) {
this.bookPublish = bookPublish;
}
}

       接下來要把實體類Books的屬性映射到books表,編寫下面的books.hbm.xml文件:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
";
<hibernate-mapping>
     <class name="com.sterning.books.model.Books" table="books" >
         <id name="bookId" type="string">
            <column name="book_id" length="5" />
            <generator class="assigned" />
        </id>
        <property name="bookName" type="string">
            <column name="book_name" length="100" />
        </property>
         <property name="bookAuthor" type="string">
            <column name="book_author" length="100" />
        </property>
        <property name="bookPublish" type="string">
            <column name="book_publish" length="100" />
        </property>
         <property name="bookDate" type="java.sql.Timestamp">
            <column name="book_date" length="7" />
        </property>
          <property name="bookIsbn" type="string">
            <column name="book_isbn" length="20" />
        </property>
        <property name="bookPage" type="string">
            <column name="book_page" length="11" />
        </property>
        <property name="bookPrice" type="string">
            <column name="book_price" length="4" />
        </property>
<property name="bookContent" type="string">
            <column name="book_content" length="100" />
        </property>
     </class>
</hibernate-mapping>
2、hibernate.cfg.xml配置文件如下:(注意它的位置在scr/hibernate.cfg.xml)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"
;
<hibernate-configuration>
<session-factory>
    <property name="show_sql">true</property>
    <mapping resource="com/sterning/books/model/books.hbm.xml"></mapping>
</session-factory>
</hibernate-configuration>

四、 建立DAO層
DAO訪問層負責封裝底層的數據訪問細節,不僅可以使概念清晰,而且可以提高開發效率。
1、建立DAO的接口類:BooksDao
package com.sterning.books.dao.iface;
import java.util.List;
import com.sterning.books.model.Books;
public interface BooksDao {
List getAll();//獲得所有記錄
    List getBooks(int pageSize, int startRow);//獲得所有記錄
    int getRows();//獲得總行數
    int getRows(String fieldname,String value);//獲得總行數
    List queryBooks(String fieldname,String value);//根據條件查詢
    List getBooks(String fieldname,String value,int pageSize, int startRow);//根據條件查詢
    Books getBook(String bookId);//根據ID獲得記錄
    String getMaxID();//獲得最大ID值
    void addBook(Books book);//添加記錄
    void updateBook(Books book);//修改記錄
    void deleteBook(Books book);//刪除記錄    
}
com.sterning.books.dao.iface.BooksDao.java 
2、實現此接口的類文件,BooksMapDao
package com.sterning.books.dao.hibernate;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.sterning.books.dao.iface.BooksDao;
import com.sterning.books.model.Books;
import com.sterning.commons.PublicUtil;

public class BooksMapDao extends HibernateDaoSupport implements BooksDao {
public BooksMapDao(){}
/**

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!