Struts2+Spring2+Hibernate3 web应用示例(一)
2008-05-18 09:59
309 查看
Struts作为MVC 2的Web框架,自推出以来不断受到开发者的追捧,得到广泛的应用。作为最成功的Web框架,Struts自然拥有众多的优点:MVC
2模型的使用、功能齐全的标志库(Tag Library)、开放源代码。而Spring的出现,在某些方面极大的方面了Struts的开发。同时,Hibernate作为对象持久化的框架,能显示的提高软件开发的效率与生产力。这三种流行框架的整合应用,可以发挥它们各自的优势,使软件开发更加的快速与便捷。
struts2发布已经很久了,但关于如何使用它的教程及实例并不多。特别是与Spring及Hibernate等流行框架的集成,并不多见。现在就将笔者使用Myeclipse工具应用struts2
+ spring2 + hibernate3 实现CRUD操作的步骤一一纪录下来,为初学者少走弯路略尽绵薄之力!在本文中,笔者将Struts2.0.6、Spring2.0.6和Hibernate3.1进行整合,希望通过这样的整合示例,让读者了解这些框架各自的特点,以便于在自己的项目中,根据实际情况,尽快的过渡到Struts2的时代。本文的内容基于Struts2.0.6。
一、
准备工作
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://www.blogjava.net/images/blogjava_net/sterning/Struts2-First-1.jpg)
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
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
CREATE TABLE `books` (
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
`book_id` int(11) NOT NULL default '0',
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
`book_name` varchar(200) character set gb2312 default NULL,
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
`book_author` varchar(100) character set gb2312 default NULL,
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
`book_publish` varchar(100) character set gb2312 default NULL,
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
`book_date` date default NULL,
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
`book_isbn` varchar(20) default NULL,
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
`book_page` int(11) default NULL,
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
`book_price` decimal(10,2) default NULL,
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
`book_content` varchar(100) character set gb2312 default NULL,
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
PRIMARY KEY (`book_id`)
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
) ENGINE=InnoDB DEFAULT CHARSET=gbk ROW_FORMAT=COMPRESSED;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
二、
建立公共类
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)
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
package com.sterning.commons;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import com.opensymphony.xwork2.ActionSupport;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
public class AbstractAction extends ActionSupport
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
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分页类
为了增加程序的分页功能,特意建立共用的分页类。
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
package com.sterning.commons;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import java.math.*;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
public class Pager
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
private int totalRows; //总行数
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
private int pageSize = 5; //每页显示的行数
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
private int currentPage; //当前页号
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
private int totalPages; //总页数
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
private int startRow; //当前页在数据库中的起始行
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public Pager()
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public Pager(int _totalRows)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
totalRows = _totalRows;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
totalPages=totalRows/pageSize;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
int mod=totalRows%pageSize;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
if(mod>0)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
totalPages++;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
currentPage = 1;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
startRow = 0;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public int getStartRow()
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return startRow;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public int getTotalPages()
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return totalPages;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public int getCurrentPage()
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return currentPage;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public int getPageSize()
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return pageSize;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public void setTotalRows(int totalRows)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
this.totalRows = totalRows;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public void setStartRow(int startRow)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
this.startRow = startRow;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public void setTotalPages(int totalPages)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
this.totalPages = totalPages;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public void setCurrentPage(int currentPage)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
this.currentPage = currentPage;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public void setPageSize(int pageSize)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
this.pageSize = pageSize;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public int getTotalRows()
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return totalRows;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public void first()
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
currentPage = 1;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
startRow = 0;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public void previous()
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
if (currentPage == 1)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
currentPage--;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
startRow = (currentPage - 1) * pageSize;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public void next()
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
if (currentPage < totalPages)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
currentPage++;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
startRow = (currentPage - 1) * pageSize;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public void last()
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
currentPage = totalPages;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
startRow = (currentPage - 1) * pageSize;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public void refresh(int _currentPage)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
currentPage = _currentPage;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
if (currentPage > totalPages)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
last();
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
com.sterning.commons.Pager.java
同时,采用PagerService类来发布成为分页类服务PagerService,代码如下:
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
同时,采用PagerService类来发布成为分页类服务PagerService,代码如下:
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
package com.sterning.commons;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
public class PagerService
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public Pager getPager(String currentPage,String pagerMethod,int totalRows)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
// 定义pager对象,用于传到页面
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Pager pager = new Pager(totalRows);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
// 如果当前页号为空,表示为首次查询该页
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
// 如果不为空,则刷新pager对象,输入当前页号等信息
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
if (currentPage != null)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
pager.refresh(Integer.parseInt(currentPage));
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
// 获取当前执行的方法,首页,前一页,后一页,尾页。
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
if (pagerMethod != null)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
if (pagerMethod.equals("first"))
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
pager.first();
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
} else if (pagerMethod.equals("previous"))
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
pager.previous();
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
} else if (pagerMethod.equals("next"))
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
pager.next();
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
} else if (pagerMethod.equals("last"))
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
pager.last();
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return pager;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
com.sterning.commons.PagerService.java
未完待续,下节开始编写数据持久化层.........
2模型的使用、功能齐全的标志库(Tag Library)、开放源代码。而Spring的出现,在某些方面极大的方面了Struts的开发。同时,Hibernate作为对象持久化的框架,能显示的提高软件开发的效率与生产力。这三种流行框架的整合应用,可以发挥它们各自的优势,使软件开发更加的快速与便捷。
struts2发布已经很久了,但关于如何使用它的教程及实例并不多。特别是与Spring及Hibernate等流行框架的集成,并不多见。现在就将笔者使用Myeclipse工具应用struts2
+ spring2 + hibernate3 实现CRUD操作的步骤一一纪录下来,为初学者少走弯路略尽绵薄之力!在本文中,笔者将Struts2.0.6、Spring2.0.6和Hibernate3.1进行整合,希望通过这样的整合示例,让读者了解这些框架各自的特点,以便于在自己的项目中,根据实际情况,尽快的过渡到Struts2的时代。本文的内容基于Struts2.0.6。
一、
准备工作
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://www.blogjava.net/images/blogjava_net/sterning/Struts2-First-1.jpg)
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
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
CREATE TABLE `books` (
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
`book_id` int(11) NOT NULL default '0',
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
`book_name` varchar(200) character set gb2312 default NULL,
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
`book_author` varchar(100) character set gb2312 default NULL,
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
`book_publish` varchar(100) character set gb2312 default NULL,
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
`book_date` date default NULL,
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
`book_isbn` varchar(20) default NULL,
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
`book_page` int(11) default NULL,
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
`book_price` decimal(10,2) default NULL,
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
`book_content` varchar(100) character set gb2312 default NULL,
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
PRIMARY KEY (`book_id`)
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
) ENGINE=InnoDB DEFAULT CHARSET=gbk ROW_FORMAT=COMPRESSED;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
二、
建立公共类
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)
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
package com.sterning.commons;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import com.opensymphony.xwork2.ActionSupport;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
public class AbstractAction extends ActionSupport
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
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分页类
为了增加程序的分页功能,特意建立共用的分页类。
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
package com.sterning.commons;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import java.math.*;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
public class Pager
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
private int totalRows; //总行数
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
private int pageSize = 5; //每页显示的行数
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
private int currentPage; //当前页号
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
private int totalPages; //总页数
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
private int startRow; //当前页在数据库中的起始行
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public Pager()
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public Pager(int _totalRows)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
totalRows = _totalRows;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
totalPages=totalRows/pageSize;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
int mod=totalRows%pageSize;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
if(mod>0)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
totalPages++;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
currentPage = 1;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
startRow = 0;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public int getStartRow()
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return startRow;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public int getTotalPages()
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return totalPages;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public int getCurrentPage()
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return currentPage;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public int getPageSize()
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return pageSize;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public void setTotalRows(int totalRows)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
this.totalRows = totalRows;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public void setStartRow(int startRow)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
this.startRow = startRow;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public void setTotalPages(int totalPages)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
this.totalPages = totalPages;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public void setCurrentPage(int currentPage)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
this.currentPage = currentPage;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public void setPageSize(int pageSize)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
this.pageSize = pageSize;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public int getTotalRows()
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return totalRows;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public void first()
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
currentPage = 1;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
startRow = 0;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public void previous()
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
if (currentPage == 1)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
currentPage--;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
startRow = (currentPage - 1) * pageSize;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public void next()
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
if (currentPage < totalPages)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
currentPage++;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
startRow = (currentPage - 1) * pageSize;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public void last()
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
currentPage = totalPages;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
startRow = (currentPage - 1) * pageSize;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public void refresh(int _currentPage)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
currentPage = _currentPage;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
if (currentPage > totalPages)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
last();
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
com.sterning.commons.Pager.java
同时,采用PagerService类来发布成为分页类服务PagerService,代码如下:
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
同时,采用PagerService类来发布成为分页类服务PagerService,代码如下:
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
package com.sterning.commons;
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
public class PagerService
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public Pager getPager(String currentPage,String pagerMethod,int totalRows)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
// 定义pager对象,用于传到页面
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Pager pager = new Pager(totalRows);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
// 如果当前页号为空,表示为首次查询该页
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
// 如果不为空,则刷新pager对象,输入当前页号等信息
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
if (currentPage != null)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
pager.refresh(Integer.parseInt(currentPage));
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
// 获取当前执行的方法,首页,前一页,后一页,尾页。
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
if (pagerMethod != null)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
if (pagerMethod.equals("first"))
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
pager.first();
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
} else if (pagerMethod.equals("previous"))
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
pager.previous();
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
} else if (pagerMethod.equals("next"))
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
pager.next();
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
} else if (pagerMethod.equals("last"))
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
pager.last();
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return pager;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
com.sterning.commons.PagerService.java
未完待续,下节开始编写数据持久化层.........
相关文章推荐
- Struts2+Spring2+Hibernate3 web应用示例(一)
- Struts2+Spring2+Hibernate3 web应用示例(四)
- Struts2+Spring2+Hibernate3 web应用示例(六)
- Struts2+Spring2+Hibernate3 web应用示例(六)
- Struts2+Spring2+Hibernate3 web应用示例------源代码
- Struts2+Spring2+Hibernate3 web应用示例(一)
- Struts2+Spring2+Hibernate3 web应用示例(二)
- Struts2+Spring2+Hibernate3 web应用示例(四)
- Struts2+Spring2+Hibernate3 web应用示例(七)
- Struts2+Spring2+Hibernate3 web应用示例(一)
- Struts2+Spring2+Hibernate3 web应用示例(六)
- Struts2+Spring2+Hibernate3 web应用示例(一)
- Struts2+Spring2+Hibernate3 web应用示例(二)
- Struts2+Spring2+Hibernate3 web应用示例(四)
- Struts2+Spring2+Hibernate3 web应用示例(七)
- Struts2+Spring2+Hibernate3 web应用示例(二)
- Struts2+Spring2+Hibernate3 web应用示例(三)
- Struts2+Spring2+Hibernate3 web应用示例(二)
- Struts2+Spring2+Hibernate3 web应用示例(五)
- Struts2+Spring2+Hibernate3 web应用示例(七)