Struts+Spring+Hibernate开发实例.docx
- 文档编号:23102936
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:34
- 大小:228.36KB
Struts+Spring+Hibernate开发实例.docx
《Struts+Spring+Hibernate开发实例.docx》由会员分享,可在线阅读,更多相关《Struts+Spring+Hibernate开发实例.docx(34页珍藏版)》请在冰豆网上搜索。
Struts+Spring+Hibernate开发实例
华虎设计站资料欢迎大家光临[张虎]
地址:
南昌航空大学科技学院7#406室
QQ:
632926059
Struts+Spring+Hibernate开发实例
一介绍
本文并不想介绍Struts,Spring,Hibernate的原理系统架构等,本文地目的是通过一个较复杂地实例介绍如何整合Struts,Spring,Hibernate,网上现有的例子虽然也能达到目的,但功能都比较单一,复杂的例子时会有意想不到的麻烦。
本文对读者假设已经具备了以上框架的基础知识。
以及那些已经了解Struts,Spring,Hibernate的基本概念,但是还没有亲身在较复杂的项目中体验Struts+Spring+Hibernate的开发人员。
1Struts
虽然不打算过多介绍Struts的原理,但是大概介绍一下还是有必要的。
Struts本身就是MVC在这里负责将用户数据传人业务层,以及将业务层处理的结果返回给用户,此系统属于较简单WEB应用,采用了OpenSessionInView模式处理LazyLoad问题,这样我们可以在用户视图中使用get,set方法来方便地获取关联对象。
为了处理庞大的Action和ActionForm问题,在此我门准备使用DynaActionForm(DynaValidatorForm)和DispatchAction以及动态验证框架来解决。
及使用Tile来解决框架问题。
使用自定义标签处理分页和身份验证问题。
2Spring
SpringFramework最得以出名的是与Hibernate的无缝链接,虽然Spring对Hibernate提供了90%以上的封装,使我们不必去关心Session的建立,关闭,以及事务使我们能够专心的关注业务逻辑。
但是一些特殊情况如有时需要Query以及Criteria对象,分页等,Spring不能给我们提供支持,总不能每次都在你的DAO上写个HibernateCallBackup()吧?
Spring的作用不是把Hibernate再封装一层,而是让你接触不到Hibernate的API,而是帮助你管理好Session和Transaction。
在这里解决方法是:
首先写一个IBase的接口,和一个BaseDao的实现。
在实现中仿照HibernateTemplate,将其功能一一实现,同时考虑到Spring未能支持的地方,我们不得已只好自己来管理Session,因此加入publicSessionopenSession(),publicQuerygetQuery(Stringsql),publicCriteriagetCriteria(Classclazz),以及分页的方法。
然后为每一个Entity都建立继承于以上类的IEntity,与EntityDao。
这里可以根据需求对Entity加入特殊的方法实现,如在StudentsDao.java中加入类似用户身份验证等。
以上就是数据访问层。
接下来在Service层中通过对dao的引用完成业务逻辑方法。
在下面的例子中我们分别为学生模块,教师模块,管理员模块构建Service层,StudentsServiceImpl,TeachersServiceImpl,AdminServiceImpl。
3Hibernate
有了Spring的封装,我们要对Hibernate做的就是正确实现对象关系的映射。
由于此处处于系统的最底层,准确无误的实现对象之间的关联关系映射将起着至关重要的作用。
总之,理解了Struts,Spring,Hibernate地原理以及之间的关系之后,剩下的工作就如同在以Spring为核心的Struts为表现的框架中堆积木。
下图可以更好的帮助我们理解Struts,Spring,Hibernate之间的关系。
二案例简述:
设计思路主要源于大学选修课,该系统可以方便处理学生在课程选报,学分查询,成绩查询,以及成绩发布等。
系统以班级为核心,一门课程可以对应多个班级,一名教师也可以带不同的班级,学生可以选报不同课程所对应的班级,班级自身有目前人数,和最大人数,以及上课时间,上课地点的属性。
学生在选报班级之后,班级的人数会自动加一,直到等于最大人数时,其他学生将会有人数已满的错误提示。
同理如果学生选择了同一课程的不同班级,也将收到错误提示。
学生有密码,系别,学分,地址,电话等属性。
教师在系统中主要负责成绩发布,教师可以对其所带的班级的学生的成绩修改,系统会以成绩是否大于等于60来判断学生是否通过考试,如果通过会将该课程的学分累加到学生学分,同样如果教师二次修改了成绩,而且小于60,系统会在学生学分上扣掉该课程的分数。
课程在系统中具体体现为班级,自身带有学分属性。
系有编号,名称的属性,同时可以作为联系教师,课程,学生的桥梁。
功能模块
● 身份验证模块:
根据用户名,密码,用户类别转发用户到不同的模块。
● 学生模块:
查看课程,查看班级,选报课程,查看己选课程,成绩查询。
● 教师模块:
录入成绩
● 管理员模块:
对学生,教师,课程,班级,系增,删,查,改。
三具体实践
代码下载
1对象关系映射:
首先,将库表映射为数据模型(SQL在源码中查看),转换后的数据模型如下图:
由此我们可以看出一下关联关系:
1Students和Contact(联系方式)一对一关系。
2Students和History(选课历史)一对多关系
3Students和Classes多对多关系。
4Classes和Classes_info一对多关系。
5Classes和Teachers多对一关系。
6Classes和Courses多对一关系。
7Course和Department(系)多对一关系。
8Teachers和Department多对一关系。
9Students和Department多对一关系。
在Hibernate中将以上关系一一映射,如Students和History一对多关系
Students.cfg.xm.:
1 2 table="history" 3 cascade="all" 4 inverse="true" 5 lazy="true" > 6 7 8 /> 9 set> 10 同样在History.cfg.xml中加入: 1 2 class="limq.hibernate.vo.Students" 3 column="student_id" > 4 many-to-one> 5 用过MyEclipse开发Hibernate的就知道,MyEclipse会帮助我们生成持久对象和抽象对象,我们要在Students.java中加入对History的引用 privateSethistory=newHashSet(); publicSetgetHistory(){ returnhistory; } publicvoidsetHistory(Sethistory){ this.history=history; } 同时,在AbstractHistory.java中删除student_id以及对应的get,set方法,History.java中加入 privateStudentsstudent; publicStudentsgetStudent(){ returnstudent; } publicvoidsetStudent(Studentsstudent){ this.student=student; } 具体内容请查看源代码。 2DAO数据访问层 首先,编写IBaseDao与BaseDao,其中IBaseDao代码如下: 1 package limq.hibernate.dao; 2 3 import java.util.Collection; 4 import java.util.List; 5 import net.sf.hibernate.Criteria; 6 import net.sf.hibernate.Query; 7 import net.sf.hibernate.Session; 8 import limq.exception.DaoException; 9 10 public interface IBaseDao { 11 12 public Session openSession(); 13 14 public int getTotalCount( String hql) throws Exception; 15 16 public Query getQuery(String sql) throws Exception; 17 18 public Criteria getCriteria(Class clazz) throws Exception; 19 20 public int getTotalPage(int totalCount,int pageSize); 21 22 public void create(Object entity); 23 24 public void update(Object entity); 25 26 public void delete(Object entity) throws DaoException; 27 28 public void deleteAll(Class clazz) throws DaoException; 29 30 public void deleteAll(Collection entities) throws DaoException; 31 32 public Object loadByKey(Class clazz, String keyName, Object keyValue); 33 34 public List find(String queryString) throws DaoException; 35 36 public List find(String queryString, Object param) throws DaoException; 37 38 public List find(String queryString, Object[] params) throws DaoException; 39 40 } 41 BaseDao继承org.springframework.orm.hibernate.support.HibernateDaoSupport 实现以上的定义的方法 如: 1 public void create(Object entity) { 2 try { 3 getHibernateTemplate().save(entity); 4 5 } catch (Exception e) { 6 log.error("保存 " + entity.getClass().getName() + " 实例到数据库失败", e); 7 8 } 9 } 10 /** 11 * 获得session 12 */ 13 public Session openSession() { 14 return SessionFactoryUtils.getSession(getSessionFactory(), false); 15 } 16 17 /** 18 * 获得Query对象 19 */ 20 public Query getQuery(String sql) throws Exception{ 21 Session session = this.openSession(); 22 Query query = session.createQuery(sql); 23 return query; 24 } 25 /** 26 * 获得Criteria对象 27 */ 28 public Criteria getCriteria(Class clazz) throws Exception{ 29 30 Session session=this.openSession(); 31 Criteria criteria = session.createCriteria(clazz); 32 return criteria; 33 } 34 可以看到,这里即充分利用了Spring对Hibernate的支持,还弥补了Spring的不足。 最后分别为每个持久对象建立Interface,以及DAO,使其分别继承IBaseDao与BaseDao。 如IDepartment,DepartmentDao 1 public interface IDepartment extends IBaseDao {} 2 3 public class DepartmentDao extends BaseDao implements IBaseDao {} 4 3Service层 在这里需要认真思考每个业务逻辑所能用到的持久层对象和DAO,还要完成配置Spring框架,首先我一起看看applications-service.xml 1 xml version="1.0" encoding="UTF-8"? > 2 DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" 3 "http: //www.springframework.org/dtd/spring-beans.dtd"> 4 5 6 7 8 property> 9 10 mysql: //localhost: 3306/Studentvalue> 11 property> 12 13 14 property> 15 16 17 property> 18 bean> 19 20 22 property> 23 24 25 26 27 28 29 30 31 32 33 34 list> 35 property> 36 37 38 39 40 props> 41 property> 42 bean> 43 44 46 property> 47 bean> 48 49 50 52 property> 53 bean> 54 55 57 property> 58 bean> 59 60 62 property> 63 bean> 64 65 67 property> 68 bean> 69 70 72 property> 73 bean> 74 75
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Struts Spring Hibernate 开发 实例