集成struts,spring,hibernate时,对于初学者来说最大的麻烦就其繁琐的xml配置文件。现在三者都对基于注解的配置提供了良 好的支持。在struts2中,使用convent plugin,得益于annotation和规约,配置过程得以大大减少。在spring2.5也可以使用@Autowired,进行注入,使用 @Controller,@Service,@Repository注解,自动定义bean,还支持annotation风格的声明式事务支持,以及 aspectJ类似的AOP。hibernate也可以使用JPA标准注解定义实体描述,避免使用mapping文件。
当然,对于annotation和xml风格的配置,谁更好,更多依赖个人兴趣。但使用annotation确实减少了很多配置工作量。本文采用 annotation风格的配置,以TaskList为例子讲解struts2 spring hibernate的集成。项目文件见附件。
一:配置struts2。
首先在web.xml文件中配置filter
- < filter >
- < filter-name > struts2 </ filter-name >
- < filter-class > org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </ filter-class >
- </ filter >
- < filter-mapping >
- < filter-name > struts2 </ filter-name >
- < url-pattern > *.action </ url-pattern >
- </ filter-mapping >
然后在classpath中创建struts.xml配置文件。
- <? xml version = "1.0" encoding = "UTF-8" ?>
- <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
- "http://struts.apache.org/dtds/struts-2.1.dtd">
- < struts >
- < constant name = "struts.devMode" value = "true" />
- < constant name = "struts.convention.default.parent.package" value = "default-package" />
- < constant name = "struts.convention.package.locators" value = "action" />
- < package name = "default-package" extends = "convention-default" >
- < default-action-ref name = "index" />
- < action name = "index" >
- < result > /WEB-INF/content/index.jsp </ result >
- </ action >
- </ package >
- </ struts >
struts.devMode属性,配置启用调试,将有更多的错误信息输出,便于排错。struts.convention.default.parent.package属性,指定使用注解标注的控制器的默认包。可以在这个默认包中配置全局信息。
struts.convention.package.locators属性,为查找控制器包路径的关键字。如 com.mycompany.action,com.mycompany.action.user,都会被struts2扫描。里面有继承至Action 的类,或类名以Action结尾的类,都会做为Action处理。
<default-action-ref name="index" />指定了默认action,如果指定的action不存在则访问该action。
把struts2-spring-plugin-2.1.6.jar添加到classpath中,struts2会自动扫描struts- plugin.xml文件,该文件自动注册了com.opensymphony.xwork2.ObjectFactory,完成和spring的集成。
二:配置spring
在web.xml中加入ContextLoaderListener,用以启动spring容器。用contextConfigLocation指定spring配置文件路径,可以使用*通配符结尾。
- < listener >
- < listener-class > org.springframework.web.context.ContextLoaderListener
- </ listener-class >
- </ listener >
- < context-param >
- < param-name > contextConfigLocation </ param-name >
- < param-value > classpath:/applicationContext.xml </ param-value >
- </ context-param >
配置applicationContext.xml
- <? xml version = "1.0" encoding = "UTF-8" ?>
- < beans >
- < context:component-scan base-package = "persistence,service,action,aop" />
- < aop:aspectj-autoproxy />
- < tx:annotation-driven transaction-manager = "transactionManager" />
- < bean id = "transactionManager" class = "org.springframework.orm.hibernate3.HibernateTransactionManager" >
- < property name = "sessionFactory" ref = "sessionFactory" />
- </ bean >
- < bean id = "sessionFactory" class = "org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" >
- < property name = "configLocation" value = "classpath:hibernate.cfg.xml" />
- </ bean >
- < bean id = "hibernateTemplate" class = "org.springframework.orm.hibernate3.HibernateTemplate" >
- < property name = "sessionFactory" ref = "sessionFactory" />
- </ bean >
- </ beans >
<context:component-scan />指定Bean扫描的包,多个包逗号隔开,任何标注了@Component,@Controller,@Service,@Repository的类,都会被自动识别为bean。
<aop:aspectj-autoproxy />声明aspectj动态代理,启用注解驱动的aspectj配置。
<tx:annotation-driven />启用注解驱动的声明事务支持。
然后定义了sessionFactory和transactionManager,hibernateTemplate用来注入到Dao中,取代继承的方式使用spring对hibernate的集成支持。
三:hibernate配置
hibernate配置独立配置,方便修改。
- <? xml version = "1.0" encoding = "UTF-8" ?>
- <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
- < hibernate-configuration >
- < session-factory >
- < property name = "hibernate.dialect" > org.hibernate.dialect.MySQLDialect </ property >
- < property name = "hibernate.connection.driver_class" > com.mysql.jdbc.Driver </ property >
- < property name = "hibernate.connection.url" > jdbc:mysql://localhost:3306/sshdemo </ property >
- < property name = "hibernate.connection.username" > root </ property >
- < property name = "hibernate.connection.password" > root </ property >
- < property name = "hibernate.hbm2ddl.auto" > update </ property >
- < property name = "hibernate.show_sql" > true </ property >
- < property name = "hibernate.format_sql" > true </ property >
- < property name = "hibernate.current_session_context_class" > thread </ property >
- <!-- 最大连接数 -->
- < property name = "hibernate.c3p0.max_size" > 20 </ property >
- <!-- 最小连接数 -->
- < property name = "hibernate.c3p0.min_size" > 5 </ property >
- <!-- 获得连接的超时时间,如果超过这个时间,会抛出异常,单位毫秒 -->
- < property name = "hibernate.c3p0.timeout" > 120 </ property >
- <!-- 最大的PreparedStatement的数量 -->
- < property name = "hibernate.c3p0.max_statements" > 100 </ property >
- <!-- 每隔120秒检查连接池里的空闲连接 ,单位是秒-->
- < property name = "hibernate.c3p0.idle_test_period" > 120 </ property >
- <!-- 当连接池里面的连接用完的时候,C3P0一下获取的新的连接数 -->
- < property name = "hibernate.c3p0.acquire_increment" > 2 </ property >
- <!-- 每次都验证连接是否可用 -->
- < property name = "hibernate.c3p0.validate" > true </ property >
- < mapping class = "domain.Task" />
- </ session-factory >
- </ hibernate-configuration >
四:TaskList Demo
详细代码查看附件,附件一使用maven构建。进入目录,使用mvn jetty:run启动项目,记住创建sshdemo mysql数据库。附件二为Eclipse项目,包含所有依赖包。