在 JavaEE 企业级开发中,以 SSH2 框架为核心的应用非常广,大象根据项目实践经验,通过一个实例,
详细的为大家讲解如何实现全注解式的开发。
开发环境
JDK1.6.0_18
Eclipse3.2.1
MyEclipse5.1.0
Tomcat6.0.10
MySQL5.0.27
Navicat Lite for MySQL 8.1.20
每个人的开发环境可能会有差异,但有一点我需要说明的是, JDK 的版本不得低于 1.5 ,因为用到了
很多 1.5 版才支持的新特性。 Tomcat 和 MySQL 请不要低于我所用的版本,因为我没在其它的版本上进
行测试 。 Navicat 则是 MySQL 数据库的图形化操作工具 。 我在这里假定各位目前已经设置好了开发环境
,
下面就开始详细的说明。
由于要阐述的内容比较多 , 大象决定将它们划分成个几章节来讲 , 这一章就主要来说说 jar 包的选择
。
第一部分:选择必须的 jar
jar
jar
jar 包
新建一个 web 项目 , 然后将必要的 jar 包 COPY 到 lib 里面 。 根据本文实例 demo , 大象给出下图中
的最少 jar 包配置。
我对这些 jar 包进行一下说明,方便大家理解。
解压 Struts2.1.6 的 lib 文件夹,从中选出上面 7 个 jar 包添加到我们的工程库中。
commons-logging 、 freemarker 、 ognl 、 struts2-core 、 xwork 这 5 个还是 struts2 的核心包
。
但在 Struts2.1.6 这个版本中,还需要加上 commons-fileupload 包。如果没有,则启动就会报错
,
不过不需要像网上传言的那样还得加上 commons-io 的 jar 包 , 这些大象都亲自做过测试 。 在本实例中
,
我将对 struts2 也采取注解的方式 , 所以用到了 struts2-convention-plugin-2.1.6.jar 这个插
件。因为要与 spring 整合,所以 struts2-spring-plugin-2.1.6.jar 也必不可少。
大象在这里偷个懒 , 直接将 spring 的完整 jar 包加了进来 , 如果各位想精简类库的话 , 就选取它的
分类 jar 包吧 。 比如本例使用 struts2 作为 MVC 框架 , 所以 spring 的 webmvc 就不可能用到了 。 有想
改的朋友请自己动手改下。另外有点我想说下,如果采取完整 spring 的 jar 包,还需 要
Spring2.5.6\lib\concurrent 文件夹中的 backport-util-concurrent.jar ,如果不加这个
,
spring 会报错 。 但是采取 spring 分类 jar 包的形式 , 这个可以不用加 , 至于具体使用什么需要依赖这
个包 , 大象还没去测试过 , 这个有待验证 。 还有 lib\slf4j 下的日志包 , 目前很多都开始采用基于 slf4 j
接口的日志器 , 它的好处就是日志器是根据 slf4j 的接口来进行实现 , 可以在不改变代码的情况下更换日
志器。最后 Spring 的源代码中使用的是 commons-logging 记录日志,因此这个包不能少,不过因 为
struts2 也用到了,所以这里就省了。
Hibernate 从 3.3 版开始,对 jar 包结构做了一次大的调整,我们只需要加入 lib\required 文
件夹下面的 6 个 jar 包 。 请注意这 6 个 jar 包都是使用 Hibernate 所 必须的 。 另外再加上 hibernat e
核心包。这里我将 slf4j-api-1.5.2.jar 换成了 1.5.0 ,这是因为 slf4j 是一个通用日志接口,不
提供任何实现,我在 demo 里面使用的是 log4j ,而 hibernate 包里面没有 log4j 的 slf4j 实现。而
且如果版本不一致,会有异常,因此我就采用 Spring2.5.6\lib\slf4j 里面提供的配套版本。另外我
将 commons-collections-3.1.jar 换成了 Struts2.1.6 里面的 3.2 版。
例子中使用 Hibernate JPA 来完成实体对象映射,所以上面这些包都必不可少。使用注解的方式
,
可以不用写繁琐的配置文件,降低了出错机率。而且现在很多人都喜欢这种方式。大家可以 去
sourceforge 下载。
下载地址 : http://sourceforge.net/projects/hibernate/files/
本例使用 DBCP 连接池来管理数据源。
MySQL 数据库的连接驱动。
这个包的作用是创建动态代理对象 。 比如在使用 AOP 方式管理 spring 事务时 , 如果我们的目标对象
没有实现接口,而又要使用 AOP 来处理事务,这时就需要用到这个 jar 包。可以 在
Spring2.5.6\lib\cglib 里面找到。
JSTL 标签库,很经典的东东,如果需要可以将它们加入 lib 中。
大象在这里建议大家做开发的时候,不要过多的依赖 MyEclipse 提供的那些功能,多用手动的方式
来做。那样方便是方便了,但不利于学习。比如加入上面这些开发所用的类库,这样可以更清楚的了解每
个 jar 包的作用,增加知识的积累,方便以后调试。
在上一章中详细分析了 JAR 包的选择 , 那么这次我将对例子中的一些必须的配置文件进行下说明 。 虽然这
些配置在网上也很容易找到,但是很多都没有讲个因为所以出来,这样根本就得不到提高。在此,大象为
各位详细分析一下这些内容。
实例中涉及的配置文件有这么几个
applicationContext.xml
jdbc.properties
log4j.properties
struts.xml
web.xml
我准备在本章中只讲 applicationContext.xml 、 jdbc.properties 和 web.xml 。 log4j 的配
置大同小异而且也不在本文范围 。 至于 struts.xml 我准备留到后面与 Action 代码一起来讲 , 因为用的
是 struts2-convention-plugin 插件来实现 struts2 的注解,所以这两个结合起来讲要好一些。
第二部分:分析配置文件
1
1
1
1 、 jdbc.properties
jdbc.properties
jdbc.properties
jdbc.properties
本例采用 MySQL 数据库 , 所以我设置了一个属性文件 , 用来存放一些连接信息和 Hibernate 相关的
设置。
因为我们使用的是 Hibernate 来与数据库进行交互,把这些东西写在单独的文件里,是方便修改,
如果你想换成 SQL Server 或是 Oracle ,只需要更改 driver 、 url 以及 dialect ,而且还可以自由
控制 sql 语句的显示的开关,非常方便。至于写在这里怎么用呢?请接着看下面 的
applicationContext.xml 说明。
2
2
2
2 、 applicationContext.xml
applicationContext.xml
applicationContext.xml
applicationContext.xml
这个文件就是 spring 的主配置文件了 , 当然 , 本例也只有这么一个 spring 的配置文件 , 内容不多
,
但做的工作还是很多的,下面我给大家详细分析一下。
我把这两部分放在一起是因为这两者是相互联系的,而且也比较好说明。可以这样来理解
,
PropertyPlaceholderConfigurer 这个类就是读取 jdbc. properties 文件,并将它们设
置到这个类的属性中。然后再将下面数据源配置中定义的这些 ${jdbc.driver} 、 ${jdbc.url} 字
符串换成属性文件中相同名称的值 。 ${} 这种写法 , 是类里面方法解析用的 , 网上都说这是叫占
位符 , 我看了源代码的 , 其实是把它们当成字符串截取前后的特殊字符 , 再根据里面定义的名称
找属性文件中对应的值。所以这个类只能读取 properties 格式的文件,你如果还有其它需要
加入的属性文件,可以在 list 之间加入,写在 value 标签里面。
根据 base-package 指定的路径 , 扫描其下所有包含注解的 Bean , 并自动注入 。 比如 @Repository
,
@Service 这些都是注解,前者表示持久层,后者表示业务层。这可是非常非常好的一个功能,是 从
Spring2.5 开始加入的一个非常棒的特性 。 有了它 , 我们将不用再去写那繁琐的 <bean id="" class=""
/> 。 本文的主旨就是全注解 , 就是为了告诉大家不用写配置文件 ( 当然不是绝对不写 ) 来怎样进行开发工
作。关于这部分的具体情况,在后面代码章节中会详细讲解。
这就是在 Spring 中定义 Hibernate 相关的配置 , Spring 已经集成了这部分功能 。 通过 class 里
面定义的类名称我们很容易就能理解,这是使用注解的方式映射实体以及创建 Hiberante
SessionFactory 。 ${hibernate.dialect} 、 ${hibernate.show_sql} 和上面的数据源配置获取
方式一样,当 applicationContext.xml 定义好之后,就不用再对它进行修改,而是将修改对象变成
了 jdbc.properties 文件。
另外在 Spring2.5.6 版中,加入了一个很有用的小功能,就是 packagesToScan 属性,它是根 据
value 中定义的路径来扫描其下所有的注解实体类。大象对这个路径做了多种测试,另外又看了源代码
,
发现它只能匹配某一类型的路径 , 而不是所有路径 。 比如上面的 value 值表示 , 扫描 entity 包下面的所
有包中的注解类,如果你将类直接放在 entity 包下,那么服务器启动和程序运行时都不会报错,但是当
你的代码需要用到这个类的时候,就会出现异常,提示你找不到实体。
这是事务定义,而且是使用注解方式定义事务 ( @Transactional ) ,
proxy-target-class = "true" 表示采用动态代理类来管理事务 , 如果是 false 表示采用接口代理来管
理事务(默认值为 false ) 。什么意思呢?就是说对于需要加入事务处理的类,如果是实现接口,那么将
采用 Spring 的默认事务管理 ( Spring 默认方式为接口 ) , 如果不采用接口 , 而直接使用类 , 那么就需 要
cglib 类库的支持 , 它通过动态的创建目标类 ( 就是你需要加入事务的类 ) 的子类 , 然后对这子类中的方
法 ( 当然是从目标类中继承来的 ) 进行事务管理 。 这其实就是 AOP 切面 , 而且从中可以看出来 , 需要加入
事务的方法不能为 private 、 static 、 final 的方法 。 这样说也不是很严格 , 说它不能加入事务 , 是说
它不能主动的启动一个事务,如果某个 private 方法是被某个 public 方法调用的,而 public 方法是
可以被动态代理加入事务的,所以这个 private 方法也一样被加入了事务,只是它处在 public 方法的
事务之中 。 但是 static 和 final 这两类方法因为不能被子类覆盖 , 所以无法加入事务 。 如果这两类型的
方法不被其它的事务方法所调用,那么它们就会以无事务的方式运行,因此很容易造成隐患,这一点请大
家特别注意。
- 1
- 2
- 3
- 4
- 5
- 6
前往页