基于struts+spring+ibatis的轻量级J2EE开发
![]() |
基于struts+spring+ibatis的轻量级J2EE开发 |
![]() |
![]() |
![]() |
![]() |
||||
![]() |
![]() |
吴高峰 (shuwgf@21cn.com)
JpetStore 4.0是ibatis的最新示例程序,基于Struts MVC框架(注:非传统Struts开发模式),以ibatis作为持久化层。该示例程序设计优雅,层次清晰,可以学习以及作为一个高效率的编程模型参考。本文是在其基础上,采用Spring对其中间层(业务层)进行改造。使开发量进一步减少,同时又拥有了Spring的一些好处… 1. 前言
以下是本文用到的关键技术介绍,本文假设您已经对Struts,SpringFramewok,ibatis有一定的了解,如果不是,请首先查阅附录中的参考资料。
2. JpetStore简述 2.1. 背景 2.2. JpetStore开发运行环境的建立
2、Eclipse插件
3、示例源程序
2.3. 架构 图1 JpetStore架构图 图1 是JPetStore架构图,更详细的内容请参见JPetStore的白皮书。参照这个架构图,让我们稍微剖析一下源代码,得出JpetStore 4.0的具体实现图(见图2),思路一下子就豁然开朗了。前言中提到的非传统的struts开发模式,关键就在struts Action类和form bean类上。 struts Action类只有一个:BeanAction。没错,确实是一个!与传统的struts编程方式很不同。再仔细研究BeanAction类,发现它其实是一个通用类,利用反射原理,根据URL来决定调用formbean的哪个方法。BeanAction大大简化了struts的编程模式,降低了对struts的依赖(与struts以及WEB容器有关的几个类都放在com.ibatis.struts包下,其它的类都可以直接复用)。利用这种模式,我们会很容易的把它移植到新的框架如JSF,spring。 这样重心就转移到form bean上了,它已经不是普通意义上的form bean了。查看源代码,可以看到它不仅仅有数据和校验/重置方法,而且已经具有了行为,从这个意义上来说,它更像一个BO(Business Object)。这就是前文讲到的,BeanAction类利用反射原理,根据URL来决定调用form bean的哪个方法(行为)。form bean的这些方法的签名很简单,例如:
方法的返回值直接就是字符串,对应的是forward的名称,而不再是ActionForward对象,创建ActionForward对象的任务已经由BeanAction类代劳了。 另外,程序还提供了ActionContext工具类,该工具类封装了request 、response、form parameters、request attributes、session attributes和 application attributes中的数据存取操作,简单而线程安全,form bean类使用该工具类可以进一步从表现层框架解耦。 在这里需要特别指出的是,BeanAction类是对struts扩展的一个有益尝试,虽然提供了非常好的应用开发模式,但是它还非常新,一直在发展中。 图2 JpetStore 4.0具体实现 2.4. 代码剖析
剩下的部分就比较简单了,请看具体的源代码,非常清晰。 2.5. 需要改造的地方 1. 业务层和数据层用Spring BeanFactory机制管理。 2. 业务层的事务由spring 的aop通过声明来完成。 3. 表现层(form bean)获取业务类的方法改由自定义工厂类来实现(加载spring环境)。 3. JPetStore的改造 3.1. 改造后的架构 其中红色部分是要增加的部分,蓝色部分是要修改的部分。下面就让我们逐一剖析。 3.2. Spring Context的加载
Spring在设计时就充分考虑到了与Struts的协同工作,通过内置的Struts Plug-in在两者之间提供了良好的结合点。但是,因为在这里我们一点也不改动JPetStore的控制层(这是JpetStore4.0的精华之一),所以本文不准备采用此方式来加载ApplicationContext。我们利用的是spring framework 的BeanFactory机制,采用自定义的工具类(bean工厂类)来加载spring的配置文件,从中可以看出Spring有多灵活,它提供了各种不同的方式来使用其不同的部分/层次,您只需要用你想用的,不需要的部分可以不用。 具体的来说,就是在com.ibatis.spring包下创建CustomBeanFactory类,spring的配置文件applicationContext.xml也放在这个目录下。以下就是该类的全部代码,很简单:
实际上就是封装了Spring 的XMLBeanFactory而已,并且Spring的配置文件只需要加载一次,以后就可以直接用CustomBeanFactory.getBean("someBean")来获得需要的对象了(例如someBean),而不需要知道具体的类。CustomBeanFactory类用于{耦合1}的解耦。 CustomBeanFactory类在本文中只用于表现层的form bean对象获得service类的对象,因为我们没有把form bean对象配置在applicationContext.xml中。但是,为什么不把表现层的form bean类也配置起来呢,这样就用不着这CustomBeanFactory个类了,Spring会帮助我们创建需要的一切?问题的答案就在于form bean类是struts的ActionForm类!如果大家熟悉struts,就会知道ActionForm类是struts自动创建的:在一次请求中,struts判断,如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中。因此formbean类的对象就不能由spring来创建,但是service类以及数据层的DAO类可以,所以只有他们在spring中配置。 所以,很自然的,我们就创建了CustomBeanFactory类,在表现层来衔接struts和spring。就这么简单,实现了另一种方式的{耦合一}的解耦。 3.3. 表现层 上 原来的源代码如下
改造后的源代码如下
其他的几个presentation类以同样方式改造。这样,表现层就完成了。关于表现层的其它部分如JSP等一概不动。也许您会说,没有看出什么特别之处的好处啊?你还是额外实现了一个工厂类。别着急,帷幕刚刚开启,spring是在表现层引入,但您发没发现:
3.4. 持久层 在上文中,我们把iface包下的DAO接口归为业务层,在这里不需要做修改。ibatis的sql配置文件也不需要改。要改的是DAO实现类,并在spring的配置文件中配置起来。 1、修改基类 所有的DAO实现类都继承于BaseSqlMapDao类。修改BaseSqlMapDao类如下:
使BaseSqlMapDao类改为继承于Spring提供的SqlMapClientDaoSupport类,并定义了一个保护属性smcTemplate,其类型为SqlMapClientTemplate。关于SqlMapClientTemplate类的详细说明请参照附录中的"Spring中文参考手册" 2、修改DAO实现类 所有的DAO实现类还是继承于BaseSqlMapDao类,实现相应的DAO接口,但其相应的DAO操作委托SqlMapClientTemplate来执行,以AccountSqlMapDao类为例,部分代码如下:
就这么简单,所有函数的签名都是一样的,只需要查找替换就可以了! 3、除去工厂类以及相应的配置文件 除去DaoConfig.java这个DAO工厂类和相应的配置文件dao.xml,因为DAO的获取现在要用spring来管理。 4、DAO在Spring中的配置(applicationContext.xml)
具体的语法请参照附录中的"Spring中文参考手册"。在这里只简单解释一下: 1. 我们首先创建一个数据源dataSource,在这里配置的是hsqldb数据库。如果是ORACLE数据库,driverClassName的值是"oracle.jdbc.driver.OracleDriver",URL的值类似于"jdbc:oracle:thin:@wugfMobile:1521:cdcf"。数据源现在由spring来管理,那么现在我们就可以去掉properties目录下database.properties这个配置文件了;还有不要忘记修改sql-map-config.xml,去掉<properties resource="properties/database.properties"/>对它的引用。 2. sqlMapClient节点。这个是针对ibatis SqlMap的SqlMapClientFactoryBean配置。实际上配置了一个sqlMapClient的创建工厂类。configLocation属性配置了ibatis映射文件的名称。dataSource属性指向了使用的数据源,这样所有使用sqlMapClient的DAO都默认使用了该数据源,除非在DAO的配置中另外显式指定。 3. TransactionManager节点。定义了事务,使用的是DataSourceTransactionManager。 4. 下面就可以定义DAO节点了,如AccountDao,它的实现类是com.ibatis.jpetstore.persistence.sqlmapdao.AccountSqlMapDao,使用的SQL配置从sqlMapClient中读取,数据库连接没有特别列出,那么就是默认使用sqlMapClient配置的数据源datasource。 这样,我们就把持久层改造完了,其他的DAO配置类似于AccountDao。怎么样?简单吧。这次有接口了:) AccountDao接口->AccountSqlMapDao实现。 3.5. 业务层 在这个例子中只有3个业务类,我们以OrderService类为例来改造,这个类是最复杂的,其中涉及了事务。 1、在ApplicationContext配置文件中增加bean的配置:
定义了一个OrderService,还是很容易懂的。为了简单起见,使用了嵌套bean,其实现类是com.ibatis.jpetstore.service.OrderService,分别引用了ItemDao,OrderDao,SequenceDao。该bean的insert*实现了事务管理(AOP方式)。TransactionProxyFactoryBean自动创建一个事务advisor, 该advisor包括一个基于事务属性的pointcut,因此只有事务性的方法被拦截。 2、业务类的修改 以OrderService为例:
红色部分为修改部分。Spring采用的是Type2的设置依赖注入,所以我们只需要定义属性和相应的设值函数就可以了,ItemDao,OrderDao,SequenceDao的值由spring在运行期间注入。构造函数就可以为空了,另外也不需要自己编写代码处理事务了(事务在配置中声明),daoManager.startTransaction();等与事务相关的语句也可以去掉了。和原来的代码比较一下,是不是处理精简了很多!可以更关注业务的实现。 4. 结束语 参考资料
|
基于struts+spring+ibatis的轻量级J2EE开发相关推荐
- 《深入Spring 2:轻量级J2EE开发框架原理与实践》
简介: http://www.easyjf.com/spring/spring2-aop.htm 本书首先是一本通过通俗案例讲解Spring的教程:同时也是一本深入挖掘Spring及相关框架结构.设计 ...
- Struts spring ibatis的集成(连载一)---转
关键词: ibatis ibatis集成spring dwr集成spring 内容: 当前软件开发中ssh框架集成司空常见,相信大家都会做.ibatis是一 ...
- 使用Jquery,Ajax+Struts+Spring+Ibatis写的一个无限级树,供大家参考一下
先看看jsp页面,tree.jsp,Code如下: <%@ page contentType="text/html;charset=UTF-8" %><% Str ...
- 基于java spring框架开发部标1078视频监控平台精华文章索引
部标1078视频监控平台,是一个庞杂的工程,涵盖了多层协议,部标jt808,jt809,jt1078,苏标Adas协议等,多个平台功能标准,部标796标准,部标1077标准和苏标主动安全标准,视频方面 ...
- Spring系列之J2EE开发的春天
Spring框架,现在来说,我们并不陌生了.但对于其理论知识还是比较薄弱的,被问到一个名词,并不能很好地去解释,只是三言两语,结果还是没有说到位.从本篇博客开始,将对Spring框架做一系列总结,点滴 ...
- 基于Spring+SpringMVC+Mybatis分布式敏捷开发系统架构zhen项目
原项目链接:https://github.com/shuzheng/zheng 目前看过做完整的项目,大家一起学习一下,详情请点击原项目链接的地址 前言 zheng项目创建于2016年10月4日,正在 ...
- 基于Spring+SpringMVC+Mybatis分布式敏捷开发系统架构---权限管理系统
原文链接: https://github.com/shuzheng/zheng 安利一个GitHub上的项目,见原文链接. 基于Spring+SpringMVC+Mybatis分布式敏捷开发系统架构, ...
- 基于WebMatrix的轻量级Web开发系列课程
基于WebMatrix的轻量级Web开发系列课程(10): WebMatrix与ASP.NET MVC WebMatrix除了提供了默认的编程模型以外,也对ASP.NET MVC做出了很好的支持,但是 ...
- 基于Struts开发电影订票网站
基于Struts开发电影订票网站(大作业/毕业设计) 开发环境: Windows操作系统 开发工具:MyEclipse(Eclipse)+Jdk+Tomcat+MYSQL数据库 运行效果图: 基于S ...
最新文章
- Windows启动exe应用程序,无法正常启动(0xc000007b)的解决办法
- Java购物车swing_JAVA课程设计--购物车
- Linux网络-数据包的接收流程(基于RTL8139网卡驱动程序)
- Jmeter系列之常用组件(二)
- netsuite中Mutiple Select的赋值问题的解决
- Visual Studio Code(VS Code)入门
- Oracle shutdown immediate无法关闭数据库解决方法
- 指向Member Function的指针
- 学习-【前端】-angularjs基本框架以及向服务器发送请求的方法
- Xamarin开发教程如何使用Xamarin开发Android应用
- 答题卡 移动端在线考试html模板,标准化考试答题卡模板.doc
- 电信跨域跨系统业务实践
- QT安装 and VS2019中安装QT插件
- linux下使用360wifi3,360 随身 WiFi3 在 Ubuntu 14.04 下的使用
- 按位与、按位异或、按位取反
- esp8266基于arduino一键配网掉电保存WIFI账号密码
- db 分贝 增益 什么意思 多少倍
- 科学计算基础软件包NumPy入门讲座(5):常用函数
- ORA-01400: cannot insert NULL into | 通过SQL链接服务器 往Oracle库的表中 插入默认值问题
- html移动端实现手写签名,signature手写签名实现,微信公众号浏览器html手写签名实现
热门文章
- c4droid入门教程 2021.2.6更新
- win2003 php5.2.17,win2003下搭建FastCGI+php5.2.17
- 51GIS学院|分享大数据项目架构思考(一)
- 老夫我写代码的起手式是怎么样的?
- 微信小程序-预览图片识别二维码
- 带你了解无限流量卡的骗局!
- nth-of-type和nth-child的区别与相关使用
- bzoj3811 玛里苟斯
- 深圳计算机中级职称入户,深圳积分入户中级职称积分,这些证书助你轻松入户!...
- 高新技术计算机应用能力考试,全国计算机信息高新技术考试(OSTA)-人社部职业资格证书...