Struts2、Spring和Hibernate应用实例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;

}

}

 

com.sterning.commons.PagerService.java

 

 

三、 建立数据持久化层

 

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;

}

}

 

com.sterning.books.model.Books.java

       接下来要把实体类Books的属性映射到books表,编写下面的books.hbm.xml文件:

 

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

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

 

com.sterning.books.model.books.hbm.xml

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"

"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

<session-factory>

    <property name="show_sql">true</property>

    <mapping resource="com/sterning/books/model/books.hbm.xml"></mapping>

</session-factory>

</hibernate-configuration>

 

Com.sterning.bean.hibernate.hibernate.cfg.xml

 

四、 建立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;

/**

* @author cwf

*

*/

public class BooksMapDao extends HibernateDaoSupport implements BooksDao {

public BooksMapDao(){}

/**

* 函数说明:添加信息

* 参数说明:对象

* 返回值:

*/

    public void addBook(Books book) {

this.getHibernateTemplate().save(book);

}

/**

* 函数说明:删除信息

* 参数说明: 对象

* 返回值:

*/

    public void deleteBook(Books book) {

this.getHibernateTemplate().delete(book);

}

/**

* 函数说明:获得所有的信息

* 参数说明:

* 返回值:信息的集合

*/

    public List getAll() {

String sql="FROM Books ORDER BY bookName";

return this.getHibernateTemplate().find(sql);

}

/**

* 函数说明:获得总行数

* 参数说明:

* 返回值:总行数

*/

    public int getRows() {

String sql="FROM Books ORDER BY bookName";

List list=this.getHibernateTemplate().find(sql);

return list.size();

}

/**

* 函数说明:获得所有的信息

* 参数说明:

* 返回值:信息的集合

*/

    public List getBooks(int pageSize, int startRow) throws HibernateException {

final int pageSize1=pageSize;

final int startRow1=startRow;

return this.getHibernateTemplate().executeFind(new HibernateCallback(){

public List doInHibernate(Session session) throws HibernateException, SQLException {

// TODO 自动生成方法存根

                Query query=session.createQuery("FROM Books ORDER BY bookName");

query.setFirstResult(startRow1);

query.setMaxResults(pageSize1);

return query.list();

}

});

}

/**

* 函数说明:获得一条的信息

* 参数说明: ID

* 返回值:对象

*/

    public Books getBook(String bookId) {

return (Books)this.getHibernateTemplate().get(Books.class,bookId);

}

/**

* 函数说明:获得最大ID

* 参数说明:

* 返回值:最大ID

*/

    public String getMaxID() {

String date=PublicUtil.getStrNowDate();

String sql="SELECT MAX(bookId)+1 FROM Books  ";

String noStr = null;

List ll = (List) this.getHibernateTemplate().find(sql);

Iterator itr = ll.iterator();

if (itr.hasNext()) {

Object noint = itr.next();

if(noint == null){

noStr = "1";

}else{

noStr = noint.toString();

}

}

if(noStr.length()==1){

noStr="000"+noStr;

}else if(noStr.length()==2){

noStr="00"+noStr;

}else if(noStr.length()==3){

noStr="0"+noStr;

}else{

noStr=noStr;

}

return noStr;

}

/**

* 函数说明:修改信息

* 参数说明: 对象

* 返回值:

*/

    public void updateBook(Books pd) {

this.getHibernateTemplate().update(pd);

}

/**

* 函数说明:查询信息

* 参数说明: 集合

* 返回值:

*/

    public List queryBooks(String fieldname,String value) {

System.out.println("value: "+value);

String sql="FROM Books where "+fieldname+" like '%"+value+"%'"+"ORDER BY bookName";

return this.getHibernateTemplate().find(sql);

}

/**

* 函数说明:获得总行数

* 参数说明:

* 返回值:总行数

*/

    public int getRows(String fieldname,String value) {

String sql="";

if(fieldname==null||fieldname.equals("")||fieldname==null||fieldname.equals(""))

sql="FROM Books ORDER BY bookName";

else

sql="FROM Books where "+fieldname+" like '%"+value+"%'"+"ORDER BY bookName";

List list=this.getHibernateTemplate().find(sql);

return list.size();

}

/**

* 函数说明:查询信息

* 参数说明: 集合

* 返回值:

*/

 

public List getBooks(String fieldname,String value,int pageSize, int startRow) {

final int pageSize1=pageSize;

final int startRow1=startRow;

final String queryName=fieldname;

final String queryValue=value;

String sql="";

if(queryName==null||queryName.equals("")||queryValue==null||queryValue.equals(""))

sql="FROM Books ORDER BY bookName";

else

sql="FROM Books where "+fieldname+" like '%"+value+"%'"+"ORDER BY bookName";

final String sql1=sql;

return this.getHibernateTemplate().executeFind(new HibernateCallback(){

public List doInHibernate(Session session) throws HibernateException, SQLException {

// TODO 自动生成方法存根

                Query query=session.createQuery(sql1);

query.setFirstResult(startRow1);

query.setMaxResults(pageSize1);

return query.list();

}

});

}

}

五、业务逻辑层

 

在业务逻辑层需要认真思考每个业务逻辑所能用到的持久层对象和DAO。DAO层之上是业务逻辑层,DAO类可以有很多个,但业务逻辑类应该只有一个,可以在业务逻辑类中调用各个DAO类进行操作。

1、创建服务接口类IBookService

 

package com.sterning.books.services.iface;

 

import java.util.List;

 

import com.sterning.books.model.Books;

 

public interface IBooksService ...{

    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 pd);//添加记录

    void updateBook(Books pd);//修改记录

    void deleteBook(String bookId);//删除记录   

}

com.sterning.books.services.iface.IBookService.java

 

2、实现此接口类:BookService:

package com.sterning.books.services;

import java.util.List;

import com.sterning.books.dao.iface.BooksDao;

import com.sterning.books.model.Books;

import com.sterning.books.services.iface.IBooksService;

public class BooksService implements IBooksService{

private BooksDao booksDao;

public BooksService(){}

/**

* 函数说明:添加信息

* 参数说明:对象

* 返回值:

*/

    public void addBook(Books book) {

booksDao.addBook(book);

}

/**

* 函数说明:删除信息

* 参数说明: 对象

* 返回值:

*/

    public void deleteBook(String bookId) {

Books book=booksDao.getBook(bookId);

booksDao.deleteBook(book);

}

/**

* 函数说明:获得所有的信息

* 参数说明:

* 返回值:信息的集合

*/

    public List getAll() {

return booksDao.getAll();

}

/**

* 函数说明:获得总行数

* 参数说明:

* 返回值:总行数

*/

    public int getRows() {

return booksDao.getRows();

}

/**

* 函数说明:获得所有的信息

* 参数说明:

* 返回值:信息的集合

*/

    public List getBooks(int pageSize, int startRow) {

return booksDao.getBooks(pageSize, startRow);

}

/**

* 函数说明:获得一条的信息

* 参数说明: ID

* 返回值:对象

*/

    public Books getBook(String bookId) {

return booksDao.getBook(bookId);

}

/**

* 函数说明:获得最大ID

* 参数说明:

* 返回值:最大ID

*/

    public String getMaxID() {

return booksDao.getMaxID();

}

/**

* 函数说明:修改信息

* 参数说明: 对象

* 返回值:

*/

    public void updateBook(Books book) {

booksDao.updateBook(book);

}

/**

* 函数说明:查询信息

* 参数说明: 集合

* 返回值:

*/

    public List queryBooks(String fieldname,String value) {

return booksDao.queryBooks(fieldname, value);

}

/**

* 函数说明:获得总行数

* 参数说明:

* 返回值:总行数

*/

    public int getRows(String fieldname,String value) {

return booksDao.getRows(fieldname, value);

}

/**

* 函数说明:查询信息

* 参数说明: 集合

* 返回值:

*/

    public List getBooks(String fieldname,String value,int pageSize, int startRow) {

return booksDao.getBooks(fieldname, value,pageSize,startRow);

}

public BooksDao getBooksDao() {

return booksDao;

}

public void setBooksDao(BooksDao booksDao) {

this.booksDao = booksDao;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值