重新学习之spring第四个程序,整合struts2+hibernate+spring
第一步:导入三大框架的jar包(struts2.3.16.1+hibernate3.2+spring3.2.4)
第二步:编写web.xml 和struts.xml和applicationContext.xml和applicationContext-service.xml和application-actionContext.xml和applicationContext-dao.xml
web.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app version="2.5" 3 xmlns="http://java.sun.com/xml/ns/javaee" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 6 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 7 8 <context-param> 9 <description> 10 将applicationContext.xml放在src目录下,依然能够找到该配置文件 11 </description> 12 13 <param-name>contextConfigLocation</param-name> 14 <param-value>/WEB-INF/classes/applicationContext.xml</param-value> 15 </context-param> 16 <!-- 配置CharacterEncoding,设置字符集 --> 17 <filter> 18 <filter-name>characterEncodingFilter</filter-name> 19 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 20 <init-param> 21 <param-name>encoding</param-name> 22 <param-value>UTF-8</param-value> 23 </init-param> 24 <init-param> 25 <param-name>forceEncoding</param-name> 26 <param-value>true</param-value> 27 </init-param> 28 </filter> 29 30 <filter-mapping> 31 <filter-name>characterEncodingFilter</filter-name> 32 <url-pattern>/*</url-pattern> 33 </filter-mapping> 34 35 <listener> 36 <description> 37 项目启动时,创建Ioc容器,将项目下所有费数据类创建对象,并注入,建立对象之间的关系 38 </description> 39 40 <listener-class> 41 org.springframework.web.context.ContextLoaderListener</listener-class> 42 </listener> 43 44 45 <!-- 配置Spring自动管理Session. 要配置到struts过滤器之前扩大session生命周期!--> 46 <filter> 47 <filter-name>hibernateSessionFilter</filter-name> 48 <filter-class> 49 org.springframework.orm.hibernate3.support.OpenSessionInViewFilter 50 </filter-class> 51 </filter> 52 <filter-mapping> 53 <filter-name>hibernateSessionFilter</filter-name> 54 <url-pattern>/*</url-pattern> 55 </filter-mapping> 56 57 <!-- 页面session配置 --> 58 <session-config> 59 <session-timeout>20</session-timeout> 60 </session-config> 61 62 63 <!-- struts2拦截器,将所有请求拦截到struts2的框架中 --> 64 <filter> 65 <filter-name>struts2</filter-name> 66 <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> 67 </filter> 68 69 <filter-mapping> 70 <filter-name>struts2</filter-name> 71 <url-pattern>/*</url-pattern> 72 </filter-mapping> 73 74 </web-app>
struts.xml
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 4 "http://struts.apache.org/dtds/struts-2.3.dtd"> 5 6 <struts> 7 <!-- 如果请求地址=actionName!methodName ,则该配置需要进行设置,否则访问地址错误--> 8 <constant name="struts.enable.DynamicMethodInvocation" value="true" /> 9 10 <!-- 开发模式 --> 11 <constant name="struts.devMode" value="true" /> 12 13 <!-- 编码格式过滤 --> 14 <constant name="struts.i18n.encoding" value="utf-8"></constant> 15 16 <!-- 告诉struts.xml不要自己通过反射new,对象,去spring的ioc容器中找 17 action中的class='spring中Ioc容器中对象的id' 18 annotation注解生成对象默认情况下id值为是:类名首字符小写 19 需要加jar包struts-spring-plugin..jar 20 --> 21 <constant name="struts.objectFactory" value="spring"></constant> 22 23 24 <package name="default" namespace="/" extends="struts-default"> 25 <!-- actionName!methodName请求方式的配置 --> 26 <action name="StudentAction" class="StudentAction"> 27 <result name="success">/page/success.jsp</result> 28 </action> 29 </package> 30 </struts>
applicationContext.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:aop="http://www.springframework.org/schema/aop" 5 xmlns:tx="http://www.springframework.org/schema/tx" 6 xsi:schemaLocation=" 7 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 8 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd 9 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> 10 11 12 <!-- 数据库连接池,以及建立数据库连接 --> 13 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 14 <!-- 驱动 --> 15 <property name="driverClass" value="com.mysql.jdbc.Driver"> 16 17 </property> 18 <!-- 数据库地址 --> 19 <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"> 20 21 </property> 22 <!-- 默认初始化获取3个连接 --> 23 <!-- 空闲连接检查时间 --> 24 <property name="idleConnectionTestPeriod" value="18000"></property> 25 <!-- 最大空闲连接时间 3小时 --> 26 <property name="maxIdleTime" value="25000"></property> 27 <!-- 检查获取的连接是否有效 --> 28 <property name="testConnectionOnCheckin" value="true"></property> 29 <property name="testConnectionOnCheckout" value="true"></property> 30 <!-- 测试语句 --> 31 <property name="preferredTestQuery" value="select 1"></property> 32 <!-- 连接数据库 --> 33 <property name="properties"> 34 <props> 35 <prop key="user">root</prop> 36 <prop key="password">1234</prop> 37 <prop key="c3p0.acquire_increment">5</prop> 38 <prop key="c3p0.idle_test_period">18000</prop> 39 40 <!-- 连接空闲超时时间 --> 41 <prop key="c3p0.timeout">20000</prop> 42 <prop key="c3p0.max_size">40</prop> 43 <prop key="c3p0.max_statements">100</prop> 44 <prop key="c3p0.min_size">10</prop> 45 </props> 46 </property> 47 </bean> 48 49 50 51 <!-- 替代hibernate中hibernate.cfg.xml包括:连接数据库信息,实体类和表的映射桥梁,全局参数的配置 --> 52 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 53 <!-- 54 一般有三类配置信息!! 55 1. 和数据库连接信息。 56 2. 全局参数配置 比如缓存配置, sql打印信息,等等。。 57 3. mapping 58 --> 59 <!-- 【1】数据库连接 --> 60 <property name="dataSource" > 61 <ref bean="dataSource"/> 62 </property> 63 <!-- 【2】参数配置 --> 64 <property name="hibernateProperties"> 65 <props> 66 <!-- 一些hibernate框架的设置 --> 67 <!-- hibernate 会自动生成sql。 为了能够屏蔽 数据库的差异。 需要配置 数据库方言--> 68 <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 69 70 <!-- 如果数据库中无相应的表的话,则自动生成一个与po对应的表 --> 71 <prop key="hibernate.hbm2ddl.auto">update</prop> 72 73 <!-- 在服务器后台打印出hibernate映射的sql语句 ,格式打印sql语句--> 74 <prop key="hibernate.show_sql" >true</prop> 75 <prop key="hibernate.format_sql" >true</prop> 76 </props> 77 </property> 78 79 <!-- 【3】mapping数据模型和数据库的桥梁,只需要配置到路径,无需一个个配置 --> 80 <property name="mappingDirectoryLocations"> 81 <list> 82 <value>classpath:/com/bjsxt/sxf/po</value> 83 </list> 84 </property> 85 </bean> 86 87 88 <!-- 在ioc容器中创建HibernateTemplate对象,并将sessionFactory工厂的对象,注入其中。 --> 89 <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate" > 90 <property name="sessionFactory" ref="sessionFactory"></property> 91 </bean> 92 93 94 <!-- 事务 --> 95 <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 96 <property name="sessionFactory" ref="sessionFactory"></property> 97 </bean> 98 99 <!-- 动态批量代理,事务,确保实际业务逻辑的完整性,合理性。比如银行转账的事务 --> 100 <tx:advice id="txadvice" transaction-manager="transactionManager"> 101 <tx:attributes> 102 <tx:method name="get*" propagation="REQUIRED" read-only="true"/> 103 <tx:method name="find*" propagation="REQUIRED" read-only="true"/> 104 <tx:method name="query*" propagation="REQUIRED" read-only="true"/> 105 <tx:method name="*" propagation="REQUIRED" /> 106 </tx:attributes> 107 </tx:advice> 108 <!-- 面向切面编程 --> 109 <aop:config proxy-target-class="true"> 110 <!-- 切面 --> 111 <aop:pointcut id="serviceMethods" expression="execution(* com.bjsxt.sxf.service.impl.*.*(..))"/> 112 <aop:advisor advice-ref="txadvice" pointcut-ref="serviceMethods"/> 113 </aop:config> 114 115 <!-- 导入各种包,将bean分类。进行配置。 --> 116 <import resource="applicationContext-dao.xml"/> 117 <import resource="applicationContext-service.xml"/> 118 <import resource="applicationContext-action.xml"/> 119 120 </beans>
applicationContext-dao.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans 3 xmlns="http://www.springframework.org/schema/beans" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xmlns:p="http://www.springframework.org/schema/p" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> 7 8 9 <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> 10 <property name="sessionFactory" ref="sessionFactory"></property> 11 </bean> 12 13 <bean id="StudentDao" class="com.bjsxt.sxf.dao.StudentDao" scope="prototype" > 14 <property name="hibernateTemplate" ref="hibernateTemplate"></property> 15 </bean> 16 </beans>
applicationContext-service.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans 3 xmlns="http://www.springframework.org/schema/beans" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xmlns:p="http://www.springframework.org/schema/p" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> 7 8 <bean id="StudentService" class="com.bjsxt.sxf.service.impl.StudentServiceImpl" scope="prototype" autowire="byType"></bean> 9 </beans>
applicationContext-action.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans 3 xmlns="http://www.springframework.org/schema/beans" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xmlns:p="http://www.springframework.org/schema/p" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> 7 8 <bean id="StudentAction" class="com.bjsxt.sxf.action.StudentAction" scope="prototype" autowire="byType" ></bean> 9 10 </beans>
第三步:测试--项目布局。
项目布局
student.hbm.xml
1 <?xml version="1.0"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 5 <hibernate-mapping 6 package="com.bjsxt.sxf.po"><!-- 实体类包名 --> 7 8 <class name="Student" table="shang_student"> 9 10 11 <!-- 主键递增 --> 12 <id name="id" column="id"> 13 <generator class="native"></generator> 14 </id> 15 16 <!-- 学生名字 --> 17 <property name="name" column="name"></property> 18 <!-- 学生性别 --> 19 <property name="sex" column="sex"></property> 20 21 22 </class> 23 24 </hibernate-mapping>
添加一个用户
访问localhost:8080/Struts2HibernateSpring/StudentAction!add向数据库中的表添加一个用户
StudenAction省去setget方法
1 public class StudentAction { 2 private StudentService studentService; 3 4 5 public String add(){ 6 System.out.println("StudentAction.add(8888888888888)"); 7 Student student =new Student(); 8 student.setName("shangxiaoyan"); 9 student.setSex("女"); 10 studentService.addStudent(student); 11 return null; 12 }