應(yīng)IT168寫的專稿.http://tech.it168.com/j/2007-09-24/200709240935075.shtml
Struts2+Spring2+Hibernate3 web應(yīng)用示例(一)
Struts作為MVC 2的Web框架,自推出以來不斷受到開發(fā)者的追捧,得到廣泛的應(yīng)用。作為最成功的Web框架,Struts自然擁有眾多的優(yōu)點(diǎn):MVC 2模型的使用、功能齊全的標(biāo)志庫(Tag Library)、開放源代碼。而Spring的出現(xiàn),在某些方面極大的方面了Struts的開發(fā)。同時,Hibernate作為對象持久化的框架,能顯示的提高軟件開發(fā)的效率與生產(chǎn)力。這三種流行框架的整合應(yīng)用,可以發(fā)揮它們各自的優(yōu)勢,使軟件開發(fā)更加的快速與便捷。
struts2發(fā)布已經(jīng)很久了,但關(guān)于如何使用它的教程及實(shí)例并不多。特別是與Spring及Hibernate等流行框架的集成,并不多見。現(xiàn)在就將筆者使用Myeclipse工具應(yīng)用struts2 + spring2 + hibernate3 實(shí)現(xiàn)CRUD操作的步驟一一紀(jì)錄下來,為初學(xué)者少走彎路略盡綿薄之力!在本文中,筆者將Struts2.0.6、Spring2.0.6和Hibernate3.1進(jìn)行整合,希望通過這樣的整合示例,讓讀者了解這些框架各自的特點(diǎn),以便于在自己的項(xiàng)目中,根據(jù)實(shí)際情況,盡快的過渡到Struts2的時代。本文的內(nèi)容基于Struts2.0.6。
一、 準(zhǔn)備工作
spring2與1.x區(qū)別不大,可以平滑的過度,筆者也是把spring1.28換成了spring2.0.6,算是升級到spring 2.0了。struts2基本就是webwork2.2,與以前的struts1.x可以說沒任何關(guān)系了。因?yàn)槭堑谝淮斡?/span>struts2,也是第一次用webwork,所以有很多不完善,不規(guī)范的地方,還望大家來拍磚。
開發(fā)環(huán)境:MyEclipse5.0+Eclipse3.2+JDK5.0+
Tomcat5.5+struts2+Spring2.0.6+Hibernate3.1。本示例通過對一個圖書進(jìn)行管理的系統(tǒng),提供基本的增加、刪除、修改、查詢等功能。
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
使用的數(shù)據(jù)庫為mysql 5.0,使用的JDBC驅(qū)動JAR包為:mysql-connection-java-5.0.4-bin
創(chuàng)建數(shù)據(jù)表的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架構(gòu)。Struts1.x 必須繼承org.apache.struts.action.Action或者其子類,表單數(shù)據(jù)封裝在FormBean中。Struts 2無須繼承任何類型或?qū)崿F(xiàn)任何接口,表單數(shù)據(jù)包含在Action中,通過Getter和Setter獲取。
雖然,在理論上Struts2的Action無須實(shí)現(xiàn)任何接口或者是繼承任何的類,但是,在實(shí)際編程過程中,為了更加方便的實(shí)現(xiàn)Action,大多數(shù)情況下都會繼承com.opensymphony.xwork2.ActionSupport類,并且重載(Override)
package com.sterning.commons;

import com.opensymphony.xwork2.ActionSupport;


public class AbstractAction extends ActionSupport
{
}

com.sterning.commons.AbstractAction.java
參考JavaDoc,可知ActionSupport類實(shí)現(xiàn)了接口:
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; //總行數(shù)
private int pageSize = 5; //每頁顯示的行數(shù)
private int currentPage; //當(dāng)前頁號
private int totalPages; //總頁數(shù)
private int startRow; //當(dāng)前頁在數(shù)據(jù)庫中的起始行

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類來發(fā)布成為分頁類服務(wù)PagerService,代碼如下:
同時,采用PagerService類來發(fā)布成為分頁類服務(wù)PagerService,代碼如下:
package com.sterning.commons;


public class PagerService
{

public Pager getPager(String currentPage,String pagerMethod,int totalRows)
{
// 定義pager對象,用于傳到頁面
Pager pager = new Pager(totalRows);
// 如果當(dāng)前頁號為空,表示為首次查詢該頁
// 如果不為空,則刷新pager對象,輸入當(dāng)前頁號等信息

if (currentPage != null)
{
pager.refresh(Integer.parseInt(currentPage));
}
// 獲取當(dāng)前執(zhí)行的方法,首頁,前一頁,后一頁,尾頁。

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;
}
}

com.sterning.commons.PagerService.java
未完待續(xù),下節(jié)開始編寫數(shù)據(jù)持久化層.........