Struts2、Spring和Hibernate应用实例1

 
 
Struts作为MVC 2Web框架,自推出以来不断受到开发者的追捧,得到广泛的应用。作为最成功的Web框架,Struts自然拥有众多的优点:MVC 2模型的使用、功能齐全的标志库(Tag Library)、开放源代码。而Spring的出现,在某些方面极大的方面了Struts的开发。同时,Hibernate作为对象持久化的框架,能显示的提高软件开发的效率与生产力。这三种流行框架的整合应用,可以发挥它们各自的优势,使软件开发更加的快速与便捷。
struts2发布已经很久了,但关于如何使用它的教程及实例并不多。特别是与SpringHibernate等流行框架的集成,并不多见。现在就将笔者使用Myeclipse工具应用struts2 + spring2 + hibernate3 实现CRUD操作的步骤一一纪录下来,为初学者少走弯路略尽绵薄之力!在本文中,笔者将Struts2.0.6Spring2.0.6Hibernate3.1进行整合,希望通过这样的整合示例,让读者了解这些框架各自的特点,以便于在自己的项目中,根据实际情况,尽快的过渡到Struts2的时代。本文的内容基于Struts2.0.6
一、 准备工作
spring21.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的下载地址为:
Hibernate3.1的下载地址为:
spring2.0.6的下载地址为:
使用的数据库为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
Struts2Struts1.x的差别,最明显的就是Struts2是一个pull-MVC架构。Struts1.x 必须继承org.apache.struts.action.Action或者其子类,表单数据封装在FormBean中。Struts 2无须继承任何类型或实现任何接口,表单数据包含在Action中,通过GetterSetter获取。
虽然,在理论上Struts2Action无须实现任何接口或者是继承任何的类,但是,在实际编程过程中,为了更加方便的实现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; } }
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>
 
四、 建立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);//删除记录 }
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、付费专栏及课程。

余额充值