Struts 2.1.6+Spring 2.5.6+Hibernate 3.3.1 全注解实例详解
一
在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
第一部分:选择必须的jar包
新建一个web项目,然后将必要的jar包COPY到lib里面。
解压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下的日志包,目前很多都开始采用基于slf4j接口的日志器,它的好处就是日志器是根据slf4j的接口来进行实现,可以在不改变代码的情况下更换日志器。最后Spring的源代码中使用的是commons-logging记录日志,因此这个包不能少,不过因为struts2也用到了,所以这里就省了。
Hibernate从3.3版开始,对jar包结构做了一次大的调整,我们只需要加入lib\required文件夹下面的6个jar包。请注意这6个jar包都是使用Hibernate 所必须的。另外再加上hibernate核心包。这里我将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下载。
本例使用DBCP连接池来管理数据源。
这个包的作用是创建动态代理对象。比如在使用AOP方式管理spring事务时,如果我们的目标对象没有实现接口,而又要使用AOP来处理事务,这时就需要用到这个jar包。可以在Spring2.5.6\lib\cglib里面找到。
JSTL标签库,很经典的东东,如果需要可以将它们加入lib中。
大象在这里建议大家做开发的时候,不要过多的依赖MyEclipse提供的那些功能,多用手动的方式来做。那样方便是方便了,但不利于学习。比如加入上面这些开发所用的类库,这样可以更清楚的了解每个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的注解,所以这两个结合起来讲要好一些。
本例采用MySQL数据库,所以我设置了一个属性文件,用来存放一些连接信息和Hibernate相关的设置。
因为我们使用的是Hibernate来与数据库进行交互,把这些东西写在单独的文件里,是方便修改,如果你想换成SQL Server或是Oracle,只需要更改driver、url以及dialect,而且还可以自由控制sql语句的显示的开关,非常方便。至于写在这里怎么用呢?请接着看下面的applicationContext.xml说明。
2、applicationContext.xml
这个文件就是spring的主配置文件了,当然,本例也只有这么一个spring的配置文件,内容不多,但做的工作还是很多的,下面我给大家详细分析一下。
<!-- JDBC参数配置 --><bean lazy-init="true"><property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /><property name="ignoreResourceNotFound" value="true" /><property name="locations"><list><value>classpath:/jdbc.properties</value></list></property></bean><!-- 数据源配置 --><bean id="dataSource" destroy-method="close"><!-- 设置JDBC驱动名称 --><property name="driverClassName" value="${jdbc.driver}" /><!-- 设置JDBC连接URL --><property name="url" value="${jdbc.url}" /><!-- 设置数据库用户名 --><property name="username" value="${jdbc.username}" /><!-- 设置数据库密码 --><property name="password" value="${jdbc.password}" /><!-- 设置连接池初始值 --><property name="initialSize" value="5" /><!-- 设置连接池最大值 --><property name="maxActive" value="100" /><!-- 设置连接池最小空闲值 --><property name="minIdle" value="20" /><!-- 设置连接池最大空闲值 --><property name="maxIdle" value="50" /></bean>
<!-- 定义Hibernate的SessionFactory --><bean id="sessionFactory"ref="dataSource"/><!-- mappingResouces属性用来列出全部映射文件 --><property name="mappingResources"><list><!-- 以下用来列出Hibernate映射文件 --><value>org/leegang/hrsystem/model/Application.hbm.xml</value><value>org/leegang/hrsystem/model/Attend.hbm.xml</value></list></property><!-- 定义Hibernate的SessionFactory的属性 --><property name="hibernateProperties"><props><!-- 指定数据库方言 --><prop key="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop><!-- 是否根据需要每次自动创建数据库 --><prop key="hibernate.hbm2ddl.auto">update</prop><!-- 显示Hibernate持久化操作所生成的SQL --><prop key="hibernate.show_sql">true</prop><!-- 将SQL脚本进行格式化后再输出 --><prop key="hibernate.format_sql">true</prop></props></property></bean>
<bean id="sessionFactory" ref="entityInterceptor" /><property name="dataSource" ref="dataSource" /><property name="hibernateProperties"><value><!-- 设置数据库方言 -->hibernate.dialect=${hibernate.dialect}<!-- 设置自动创建|更新|验证数据库表结构 -->hibernate.hbm2ddl.auto=update<!-- 输出SQL语句到控制台 -->hibernate.show_sql=${hibernate.show_sql}<!-- 格式化输出到控制台的SQL语句 -->hibernate.format_sql=${hibernate.format_sql}<!-- 是否开启二级缓存 -->hibernate.cache.use_second_level_cache=false<!-- 配置二级缓存产品 -->hibernate.cache.provider_class=org.hibernate.cache.OSCacheProvider<!-- 是否开启查询缓存 -->hibernate.cache.use_query_cache=false<!-- 数据库批量查询数 -->hibernate.jdbc.fetch_size=50<!-- 数据库批量更新数 -->hibernate.jdbc.batch_size=30</value></property><property name="annotatedClasses"><list><value>net.entity.Area</value><value>net.entity.LogConfig</value><value>net.entity.Log</value></list></property></bean>