- 浏览: 425490 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
Glogo:
楼主您好,我在试验您的代码的时候发现新开的三个子线程并没有一直 ...
java 高并发 ReentrantLock -- 可重入的锁 -
univasity:
最近发觉也被限速了,投诉一下就好一会~~ 看来明天又要和电信M ...
ADSL上网速度慢 都是帐号限速惹的祸 -
liuyuanhui0301:
java 高并发 ReentrantLock -- 可重入的锁 -
dang_java:
呵.很好的说明文档.
JXTA技术与应用发展 -
helloqidi:
谢谢,学习了
SQL中exists和in的区别
基于struts+spring+ibatis的轻量级J2EE开发 |
级别: 初级 吴高峰 (shuwgf@21cn.com)常德卷烟厂信息技术部 2005 年 2 月 01 日 大多数IT 组织都必须解决三个主要问题:1.帮助组织减少成本 2.增加并且保持客户 3.加快业务效率。完成这些问题一般都需要实现对多个业务系统的数据和业务逻辑的无缝访问,也就是说,要实施系统集成工程,以便联结业务流程、实现数据的访问与共享。<!----><!----><!----> JpetStore 4.0是ibatis的最新示例程序,基于Struts MVC框架(注:非传统Struts开发模式),以ibatis作为持久化层。该示例程序设计优雅,层次清晰,可以学习以及作为一个高效率的编程模型参考。本文是在其基础上,采用Spring对其中间层(业务层)进行改造。使开发量进一步减少,同时又拥有了Spring的一些好处… JpetStore 4.0是ibatis的最新示例程序。ibatis是开源的持久层产品,包含SQL Maps 2.0 和 Data Access Objects 2.0 框架。JpetStore示例程序很好的展示了如何利用ibatis来开发一个典型的J2EE web应用程序。JpetStore有如下特点:
以下是本文用到的关键技术介绍,本文假设您已经对Struts,SpringFramewok,ibatis有一定的了解,如果不是,请首先查阅附录中的参考资料。
最初是Sun公司的J2EE petstore,其最主要目的是用于学习J2EE,但是其缺点也很明显,就是过度设计了。接着Oracle用J2EE petstore来比较各应用服务器的性能。微软推出了基于.Net平台的 Pet shop,用于竞争J2EE petstore。而JpetStore则是经过改良的基于struts的轻便框架J2EE web应用程序,相比来说,JpetStore设计和架构更优良,各层定义清晰,使用了很多最佳实践和模式,避免了很多"反模式",如使用存储过程,在java代码中嵌入SQL语句,把HTML存储在数据库中等等。最新版本是JpetStore 4.0。 1、开发环境
2、Eclipse插件
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具体实现 下面就让我们开始进一步分析JpetStore4.0的源代码,为下面的改造铺路。
剩下的部分就比较简单了,请看具体的源代码,非常清晰。 JpetStore4.0的关键就在struts Action类和form bean类上,这也是其精华之一(虽然该实现方式是试验性,待扩充和验证),在此次改造中我们要保留下来,即控制层一点不变,表现层获取相应业务类的方式变了(要加载spring环境),其它保持不变。要特别关注的改动是业务层和持久层,幸运的是JpetStore4.0设计非常好,需要改动的地方非常少,而且由模式可循,如下: 1. 业务层和数据层用Spring BeanFactory机制管理。 2. 业务层的事务由spring 的aop通过声明来完成。 3. 表现层(form bean)获取业务类的方法改由自定义工厂类来实现(加载spring环境)。
其中红色部分是要增加的部分,蓝色部分是要修改的部分。下面就让我们逐一剖析。 为了在Struts中加载Spring Context,一般会在struts-config.xml的最后添加如下部分:
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。就这么简单,实现了另一种方式的{耦合一}的解耦。 上面分析到,struts和spring是在表现层衔接起来的,那么表现层就要做稍微的更改,即所需要的service类的对象创建上。以表现层的AccountBean类为例: 原来的源代码如下
改造后的源代码如下
其他的几个presentation类以同样方式改造。这样,表现层就完成了。关于表现层的其它部分如JSP等一概不动。也许您会说,没有看出什么特别之处的好处啊?你还是额外实现了一个工厂类。别着急,帷幕刚刚开启,spring是在表现层引入,但您发没发现:
在讨论业务层之前,我们先看一下持久层,如下图所示: 在上文中,我们把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个业务类,我们以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();等与事务相关的语句也可以去掉了。和原来的代码比较一下,是不是处理精简了很多!可以更关注业务的实现。
ibatis是一个功能强大实用的SQL Map工具,可以直接控制SQL,为系统设计提供了更大的自由空间。其提供的最新示例程序JpetStore 4.0,设计优雅,应用了迄今为止很多最佳实践和设计模式,非常适于学习以及在此基础上创建轻量级的J2EE WEB应用程序。JpetStore 4.0是基于struts的,本文在此基础上,最大程度保持了原有设计的精华以及最小的代码改动量,在业务层和持久化层引入了Spring。在您阅读了本文以及改造后的源代码后,会深切的感受到Spring带来的种种好处:自然的面向接口的编程,业务对象的依赖注入,一致的数据存取框架和声明式的事务处理,统一的配置文件…更重要的是Spring既是全面的又是模块化的,Spring有分层的体系结构,这意味着您能选择仅仅使用它任何一个独立的部分,就像本文,而它的架构又是内部一致。
|
发表评论
-
Android 数字签名学习笔记
2012-04-25 11:03 954在 Android系统中,所有安装到系统的应用程序都必有 ... -
序列化:serializable,hessian,protobuf性能对比
2011-10-31 17:08 1243分布式应用系统中,系统之间的通讯的质量决定了系统的可用性 ... -
JAR 文件揭密
2011-10-18 01:28 886JAR 文件是什么? ... -
SSL双向认证java实现
2011-10-17 23:49 1017本文通过模拟场景,介绍SSL双向认证的java实现默认的情况下 ... -
Benchmark Analysis: Guice vs Spring
2011-04-19 14:35 1038The original link can be found ... -
Java Network Launching Protocol
2011-04-18 17:43 902在java开发的早期,重点被放在了客户端开发。语言中对于app ... -
NIO 包及工作原理
2011-03-11 11:14 1732NIO 包及工作原理 针对 ... -
使用Java NIO编写高性能的服务器
2011-03-11 01:19 783从JDK 1.4开始,Java的标 ... -
RMI, RMI-IIOP,JNDI
2009-05-21 17:31 14881. RMI-IIOP(Java Remote ... -
企业中的 RMI-IIOP
2009-05-21 17:13 1006RMI 和 CORBA 常被视 ... -
JMX
2009-05-21 15:44 980JMX规范 1.1 J ... -
使用Eclipse IDE的技巧
2009-02-24 11:00 1788使用Eclipse IDE的技巧 作 ... -
spring quartz 动态定时任务
2009-01-22 13:31 4470什么是动态定时任务:是由客户制定生成的,服务端只知道该去执行什 ... -
Log4j配置实例[经典]
2009-01-12 14:53 1281Log4j配置实例[经典] 0 推荐 ... -
jbpm工作流学习心得
2008-09-19 13:59 1297一,装载流程: 第一种: java 代码 JbpmCo ... -
jbpm请假工作流
2008-09-19 13:56 1845请假流程(备用) 工作中要用到JBPM写工作流,自习的时 ... -
利用JExcel API操作EXCEL文件
2008-09-08 10:52 1466使用Windows操作系统的朋 ... -
jExcel API讲解
2008-09-08 10:51 1488转自:http://jhobby.iteye.com/blog ... -
Tomcat5.0乱码全解决方案
2008-09-02 11:56 1090http://hi.baidu.com/liet2008/bl ... -
Linux_Macintosh 平台下 Eclipse 环境中的 JNI 混合语言调试
2008-08-28 18:27 1486Linux_Macintosh 平台下 Eclipse ...
相关推荐
### 基于Struts+Spring+Ibatis的轻量级J2EE开发 #### 1. 前言 随着互联网技术的迅速发展,企业级应用开发面临着日益复杂的挑战。传统的J2EE架构虽然成熟稳定,但在面对敏捷开发的需求时显得力不从心。为了提高开发...
这个压缩包文件"基于struts+spring+ibatis的轻量级J2EE开发.rar"很可能包含了一套完整的示例项目或者教程,用于演示如何整合这三大框架进行开发。 Struts是Apache软件基金会的一个开源项目,主要用于MVC(Model-...
iBATIS作为一个轻量级的ORM框架,主要解决了SQL语句与Java代码的分离问题,使得开发者可以直接在XML配置文件中编写SQL,增强了数据库操作的灵活性。它与Spring3的结合,可以利用Spring的DataSource和...
struts+spring+ibatis
Struts2+Spring+Hibernate和Struts2+Spring+Ibatis是两种常见的Java Web应用程序集成框架,它们分别基于ORM框架Hibernate和轻量级数据访问框架Ibatis。这两种框架结合Spring,旨在提供一个强大的、可扩展的、易于...
**iBatis**是一个轻量级的持久层框架,它将SQL语句与Java代码分离,使得开发者可以更加灵活地编写复杂的查询。iBatis将数据访问逻辑封装在XML配置文件或注解中,通过SQL映射文件来定义SQL语句,然后通过Java接口或...
这个组合集成了强大的MVC(Model-View-Controller)框架Struts2、依赖注入与面向切面编程的Spring框架、轻量级持久层框架Ibatis以及关系型数据库管理系统MySQL。 1. **Struts2**:Struts2是Apache软件基金会下的一...
**iBatis**框架则是数据库操作的轻量级工具,它与Hibernate类似,但更注重SQL的灵活性。iBatis将SQL语句写在配置文件中,避免了将数据库操作硬编码到Java代码中,从而实现了数据访问层(DAO)与业务逻辑层的分离。它...
iBatis,作为一个轻量级的SQL映射框架,它将SQL语句与Java代码分离,提高了代码的可读性和可维护性。在本项目中,iBatis负责处理与数据库的交互,通过XML或注解定义SQL语句,实现了数据访问层与业务逻辑层的分离。它...
公司让学的 正在学习
Struts提供了MVC(Model-View-Controller)设计模式的实现,Spring作为全面的轻量级框架,包含了依赖注入(DI)和面向切面编程(AOP)等特性,而iBatis则是一个灵活的SQL映射框架,解决了Java与数据库交互的繁琐工作...
IBATIS则是一个轻量级的持久层框架,它允许开发者编写SQL语句,通过XML配置文件或注解将SQL与Java代码分离,实现了数据访问的灵活性。IBATIS提供了SqlMapConfig.xml配置文件,用于配置数据源、事务管理器等信息,并...
而iBatis则是数据库访问层的一个轻量级框架,它将SQL语句与Java代码分离,使得数据库操作更加灵活。 这个"struts2 + spring2.5 + ibatis2.3.4整合包文件"包含了这三个框架的集成,用于搭建一个完整的Java Web应用...
Ibatis则作为一个轻量级的持久层框架,简化了数据库操作。接下来,我们将深入探讨这三个框架的整合以及在实际项目中的应用。 一、Spring3:核心与优势 Spring3是Spring框架的第三个主要版本,它引入了许多新特性,...
Struts提供了MVC(Model-View-Controller)设计模式的实现,Spring作为全面的轻量级框架,管理着应用程序的依赖注入(DI)和面向切面编程(AOP),而iBatis则是一个灵活的SQL映射框架,解决了Java与数据库交互的繁琐...
Ibatis是一个轻量级的持久层框架,它允许开发者将SQL语句直接写在配置文件中,避免了Hibernate等ORM框架的复杂性。Ibatis强调SQL的灵活性,使得开发者可以自由地优化数据库操作。在Spring框架中,Ibatis可以通过...
**MyBatis** 是一个轻量级的持久层框架,它将SQL语句与Java代码分离,提供了更灵活的SQL操作方式。MyBatis通过XML或注解配置SQL映射文件,将接口方法与SQL语句关联起来。在业务层,我们可以定义Mapper接口,然后在...