S2SH框架整合1教程文件_第1页
S2SH框架整合1教程文件_第2页
S2SH框架整合1教程文件_第3页
S2SH框架整合1教程文件_第4页
S2SH框架整合1教程文件_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Good is good, but better carries it.精益求精,善益求善。S2SH框架整合1S2SH框架整合实验目标整合Struts2+Spring3+Hibernate4的开发框架。开发一个简单的应用程序并运行测试它。准备工作准备S2SH框架发行包实验所使用的S2SH框架版本为:StrutsSpring3.1.2Hibernate4.1.7目前程序以及采用了Struts+Hibernate4.1.7框架,因此只需要将Spring3集成在系统中,并进行相应的配置即可。添加Spring支持使用Spring框架的功能,首先需要将Spring的库文件添加到项目中,并创建所需的配置文

2、件。通常,可以直接将Spring的相关库文件复制到项目的“WEB-INF/lib”目录中,也可以使用MyEclipse的向导,仅仅将所需要的JAR文件复制到项目中,而不是全部复制过来,具体步骤如下:访问:HYPERLINK/download/download,下载Spring3.1.2.RELEASE。图下载Spring将压缩包解压到某一个目录,下面以$Spring_Home表示该目录。在MyEclipse中导入工程FileShare,该系统建立在前一次实验基础之上,采用Struts2和Hibernate开发。在MyEclipse中创建一个Spring3.1.2的用户库,并将“$Spring_

3、Home/dist”目录下的所有内容包含进去。为项目添加Spring能力。右键点击工程名,选择菜单“MyEclipse-AddSpringCapabilities”,在打开的对话框中,选择显示“UserLibraries”,选择刚才创建的Spring用户库,并选择将这些库文件拷贝到WEB-INF/lib目录下。图创建Spring用户库图添加Spring能力点击“Next”,在对话框中选择Spring配置文件及其位置,建议按照缺省放在src目录下,文件名为“applicationContext.xml”保持不变。点击“Next”,默认将选择在配置文件中创建一个名为sessionFactory的b

4、ean,它通过一个属性来引用Hibernate配置文件。这里是否选择都没有关系,后面将继续修改。图创建Spring配置文件图添加名为sessionFactory的beanSpring还依赖于一些其他的第三方的包,需要自行下载。也可以在MyEclipse中添加Spring能力时,选择使用MyEclipse自带的所有Spring库,即可将相关依赖JAR文件全部复制到工程目录下。需要的文件如下:Aopalliance1.0:aopalliance.jarAspectj1.7.0:aspectjweaver.jarCglib2.2:cglib-nodep-2.2.jar其他,如Asm3.3、Log4j

5、已经包含在Struts依赖包了。导入Struts2库项目中已经包含了Struts2运行所必需的基本库文件,现在还需将Struts2自带的Spring插件“struts2-spring-plugin-.jar”复制到WEB-INF/lib目录下。导入Hibernate库将$Hibernate_Home目录中下列JAR文件复制到WEB-INF/lib目录下:/lib/required/*.jar/lib/envers/hibernate-envers-4.1.7.Final.jar/lib/jpa/hibernate-entitymanager-4.1.7.Final.jar/lib/option

6、al/c3p0/c3p0-0.9.1.jar/lib/optional/c3p0/hibernate-c3p0-4.1.7.Final.jar整合S2SH框架配置web.xml首先需要修改web.xml,让Web应用启动时自动装载Spring容器。Web应用启动时,服务器(Tomcat)将读取和配置信息,并创建所配置的类实例作为监听器。在下面配置的Spring监听器ContextLoaderListener中,将读取配置文件并启动容器功能。这里另外配置了一个过滤器openSessionInViewFilter,它的作用是用来把一个HibernateSession和一次完整的请求过程对应的线程相

7、绑定,目的是为了实现“OpenSessioninView”的模式,也就是说,在每次的request的整个过程中使用同一个HibernateSession。这主要是为了实现Hibernate的延迟加载功能。Hibernate允许对关联对象、属性进行延迟加载,但是必须保证延迟加载的操作限于同一个HibernateSession范围之内进行。例如,如果Service层返回一个启用了延迟加载功能的领域对象给Web层,当Web层访问到那些需要延迟加载的数据时,由于加载领域对象的HibernateSession已经关闭,这些会导致延迟加载数据的访问异常。而Spring为我们提供的OpenSessionIn

8、ViewFilter过滤器为我们很好的解决了这个问题。web.xml文件内容如下:FileShareindex.htmlogin.jsp设置在src目录下,*是通配符,匹配该名称的xml文件作为配置文件。contextConfigLocationclasspath*:applicationContext*.xml,classpath*:*Context.xmlorg.springframework.web.context.ContextLoaderListeneropenSessionInViewFilterorg.springframework.orm.hibernate4.support.

9、OpenSessionInViewFiltersessionFactoryBeanNamesessionFactoryopenSessionInViewFilter/*struts-cleanuporg.apache.struts2.dispatcher.ActionContextCleanUpstruts2org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilterstruts-cleanup/*struts2/*404/common/noSuchPage.jsp整合Spring和Hibernate整合的实质是将H

10、ibernate需要用到数据源DataSource(如C3P0连接池数据源ComboPooledDataSource)、Hibernate的SessionFactory实例及事务管理器移交给Spring容器来管理。Spring配置文件是用于指导Spring工厂进行Bean的生产、装配(依赖关系注入)及Bean实例分发的“图纸”,它是一个或多个XML文档,默认为applicationContext.xml,如果不做设置,Spring容器会尝试加载这个默认的配置文件。Spring配置文件的位置在web.xml已设置,建议放在src目录下,修改比较方便。实际应用中常把applicationConte

11、xt.xml分解为几个文件,比如applicationContext-common.xml等,通常配置内容包括DataScource,SessionFactory,TransactionManger等。当系统比较庞大复杂时,由于组件很多,分解成多个配置文件会更清晰方便一些。如果在添加Spring库时,是采用在MyEclipse中为项目添加“Spring能力”的方式,那么MyEclipse已经创建了一个配置文件;如果是直接将Spring库文件复制到项目中的方式,那么需要新建一个Spring配置文件。修改后的applicationContext.xml文件内容如下:使用class属性指定类的默认构

12、造方法来创建一个单实例Bean,名称由id属性指定。在配置文件中主要定义了下面几个方面的内容:定义使用C3P0连接池的数据源,子元素指定了建立C3P0连接池所需的JDBC连接参数。:定义Hibernate的SessionFactory实例,该标记的属性“p:dataSource-ref=dataSource”相当于为设置了子元素,引用上面定义的数据源dataSource并依赖注入。:定义Hibernate的事务管理器。:定义一个事务通知txAdvice,并配置事务的传播特性,这里配置为所有以get开头的业务逻辑方法均不需要事务控制且只读;而其它方法均进行事务控制,如果当前没有事务,则新建一个事

13、务。:为了实现事务管理而采用AOP技术,这里用来配置AOP。它的子元素:先定义了一个事务切入点,拦截.nit.fs.service.impl包中所有以“Impl”结尾的类的所有方法,第一个*代表所有的返回值类型,第二个*代表匹配类名的通配符,第三个*表示所有的方法,最后一个“.”表示所有的参数。另一个子元素:定义了一个通知(advisor),只能持有一个pointcut和advice,表示在特定的切入点,AOP框架执行的动作。:定义数据库操作组件,其子元素表示持有属性“sessionFactory”并由Spring依赖注入。:定义数据库操作组件,其子元素表示持有属性“userDao”并由Spr

14、ing依赖注入。:定义数据库操作组件,其子元素表示持有属性“userService”并由Spring依赖注入。由于Struts在处理请求时,对于每个不同的请求均会生成一个相应的Action实例负责处理,因此,这里设置了scope属性为prototype(原型)模式,以确保每次生成的是全新的Action实例。注意:在集成Struts2和Spring后,在struts.xml中定义action时,将class名定义为这里的id名,即可将Action实例交由Spring装配和管理。整合Struts2+Spring整合Struts2和Spring的主要目的是为了让Struts2中的Action实例可以

15、访问Spring容器中丰富的业务逻辑组件资源,同时将Action的实例化与依赖注入的工作交给Spring容器统一管理。在Struts2中集成Spring,需要设置struts.xml如下:这里需要注意的是,在Struts2的配置文件struts.xml中配置Action时,class属性不再使用类的全名,而是使用Spring配置文件中定义的相应Bean实例名称。修改DAO实现类由于在数据库访问中都需要使用HibernateSessionFatory来获得Session对象,因此,在Spring配置文件中设置了SessionFactory这一个Bean,并注入到各个DAOBean。配置文件中对于

16、DAOBean的片段如下:在本项目中,只需要修改DAO的实现类,DAO接口无需改变。在DAO实现类中增加一个属性sessionFactory,并设置相应的getter/setter方法;在各个方法中,获取session修改为由SessionFatory来获得,为了方便,添加一个getSession()方法用于获得session对象。最后再将事务处理相关代码删除,因为经过配置,Spring已经帮助我们管理事务了。需要说明的是,对于Bean中配置的属性,其实只需要添加setXXX()方法即可,getXXX()方法可不必要,因为Spring只需使用setXXX()方法即可完成依赖注入。修改后的Use

17、rDAOImpl类的内容如下:.nit.fs.dao.impl;.nit.fs.model.*;mons.logging.Log;mons.logging.LogFactory;importorg.hibernate.*;.nit.fs.dao.UserDAO;publicclassUserDAOImplimplementsUserDAOprivatestaticLoglogger=LogFactory.getLog(UserDAOImpl.class);privateSessionFactorysessionFactory;publicvoidsetSessionFactory(Sessio

18、nFactorysessionFactory)this.sessionFactory=sessionFactory;publicSessiongetSession()returnsessionFactory.getCurrentSession();/*根据ID得到用户对象信息*paramuserId用户ID*return指定的用户信息*/publicUsergetUserById(intuserId)Sessionsession=getSession();Useru=(User)session.get(User.class,userId);returnu;/*根据LoginName得到用户对象

19、信息*paramloginName用户登录帐号*/publicUsergetUserByLoginName(StringloginName)Sessionsession=getSession();Stringhql=fromUserwhereloginName=?;Queryquery=session.createQuery(hql);query.setString(0,loginName);return(User)query.uniqueResult();/*新增用户*paramuser用户对象*/publicvoidsaveUser(Useruser)getSession().save(u

20、ser);/*更新用户信息*paramuser用户对象*/publicvoidupdateUser(Useruser)getSession().update(user);/*删除用户*paramuserId用户ID*/publicvoiddeleteUser(intuserId)Sessionsession=getSession();Useruser=(User)session.load(User.class,userId);session.delete(user);修改后的CFileDAOImpl类的内容如下:.nit.fs.dao.impl;importjava.util.*;mons.l

21、ogging.Log;mons.logging.LogFactory;importorg.hibernate.*;.nit.fs.model.*;.nit.fs.dao.CFileDAO;publicclassCFileDAOImplimplementsCFileDAOprivatestaticLoglogger=LogFactory.getLog(CFileDAOImpl.class);privateSessionFactorysessionFactory;publicvoidsetSessionFactory(SessionFactorysessionFactory)this.sessio

22、nFactory=sessionFactory;publicSessiongetSession()returnsessionFactory.getCurrentSession();/*根据ID查询文件*paramid文件ID*/publicCFilegetFileById(intid)CFilef=(CFile)getSession().get(CFile.class,id);returnf;/*查询文件*paramtitle文件标题*/publicListgetFilesByTitle(Stringtitle)Sessionsession=getSession();Stringhql=fro

23、mCFile;if(title!=null)hql+=wheretitlelike%+title.trim()+%;Queryquery=session.createQuery(hql);returnquery.list();/*新增文件信息*paramcfile文件信息*/publicvoidsave(CFilecfile)getSession().save(cfile);/*更新文件信息*paramcfile文件信息*/publicvoidupdate(CFilecfile)getSession().update(cfile);/*删除文件记录*paramfileId文件ID*/publi

24、cvoiddelete(intfileId)Sessionsession=getSession();CFilef=(CFile)session.load(CFile.class,fileId);session.delete(f);通过修改,可以看到DAO实现类瘦身了,大量的关于事务处理的公共代码都去掉了。由于HibernateSessionFactory交由Spring容器管理,现在,可以删去项目中util子包中的HibernateUitl类了。注意,从Spring配置文件中关于DAOBean的配置可以看到,在每一个bean中都配置了sessionFactory这个属性,如果一个系统包含大量的

25、DAO组件,这样的配置和编程显然是很繁琐的。一个办法就是,建立一个包含sessionFactory属性,以及常用数据库操作方法的基类,然后让所有的DAO实现类都从这个类继承,这样就可以通过代码重用来提高开发效率了。修改Service实现类与修改DAO组件相同,业务逻辑层只需要修改Service实现类。在Service实现类中作为属性的DAO对象无需实例化,它由Spring负责注入,负责实际的数据库访问。通常业务逻辑单元的划分是根据用户请求进行的,从事务管理的角度来说,这种业务逻辑单元应该具有原子性,因此,一个用户请求的背后往往会有一个对应的业务逻辑单元,这个业务逻辑单元同时也是一个事务管理单元

26、。因此,我们在Spring配置文件中已经设置对所有Service实现类中的方法进行事务管理。修改内容主要是将dao属性取消初始化,并增加getter/setter方法。修改后的UserServiceImpl类的内容如下:.nit.fs.service.impl;.nit.fs.model.*;mons.logging.Log;mons.logging.LogFactory;.nit.fs.service.UserService;.nit.fs.dao.UserDAO;publicclassUserServiceImplimplementsUserServiceprivatestaticLogl

27、ogger=LogFactory.getLog(UserServiceImpl.class);privateUserDAOuserDao;publicvoidsetUserDao(UserDAOuserDao)this.userDao=userDao;/*根据ID得到用户对象信息*paramuserId用户ID*return指定的用户信息*/publicUsergetUserById(intuserId)returnuserDao.getUserById(userId);/*根据LoginName得到用户对象信息*paramloginName用户登录帐号*/publicUsergetUserB

28、yLoginName(StringloginName)returnuserDao.getUserByLoginName(loginName);/*新增用户*paramuser用户对象*/publicvoidsaveUser(Useruser)if(user=null)return;Useru=getUserByLoginName(user.getLoginName();if(u!=null)logger.error(用户账户名已经存在,请使用其他账户名!);return;userDao.saveUser(user);/*更新用户信息*paramuser用户对象*/publicvoidupdat

29、eUser(Useruser)userDao.updateUser(user);/*删除用户*paramuserId用户ID*/publicvoiddeleteUser(intuserId)userDao.deleteUser(userId);修改后的FileServiceImpl类的内容如下:.nit.fs.service.impl;importjava.util.*;mons.logging.Log;mons.logging.LogFactory;.nit.fs.model.*;.nit.fs.service.*;.nit.fs.dao.*;publicclassFileServiceIm

30、plimplementsFileServiceprivatestaticLoglogger=LogFactory.getLog(FileServiceImpl.class);privateCFileDAOfileDao;publicvoidsetFileDao(CFileDAOfileDao)this.fileDao=fileDao;/*根据ID查询文件*paramid文件ID*/publicCFilegetFileById(intid)returnfileDao.getFileById(id);/*查询文件*paramtitle文件标题*/publicListgetFilesByTitle(

31、Stringtitle)returnfileDao.getFilesByTitle(title);/*新增文件信息*paramcfile文件信息*/publicvoidsave(CFilecfile)fileDao.save(cfile);/*更新文件信息*paramcfile文件信息*/publicvoidupdate(CFilecfile)fileDao.update(cfile);/*删除文件记录*paramcfile文件信息*/publicvoiddelete(intfileId)fileDao.delete(fileId);修改Action类由于在Struts2中集成Spring后,Action业务控制器组件由Spring容器来完成依赖对象的注入工作,因此,在Action中定义的属性业务逻辑组件不需要进行实例化,由Spring完成这个工作。修改内容主要是将service属性取消初始化,并增加setter方法。UserAction类和FileDownloadAction修改较小,不再赘述,见实验附件中的源码。根据Spring配置文件,FileAction中需要再增加一个属性userService,为两个Service类型的属性添加setter方法。另外,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论