三:搭建Spring
1.添加Spring的Jar包
2.添加Struts2,Spring插件的Jar包
3.添加Oracle10g 数据库的Jar包
4.使用Spring来管理struts2的Action,DAO层,Service层
1)在原来web.xml基础之上添加Spring的监听器
2)修改loginAction的内容
3)在Src目录下新建bean.xml文件
4)这时部署项目到Tomcat,运行Tomcat,结果如下
点击“test Action”操作,报500错
说明未将studentService注入到loginAction中。
A:这个问题的原因是: loginAction没有真正的纳入Spring的管理当中
Spring的bean.xml配置文件的确对loginAction做了配置
但是Struts.xml配置文件中
没有用到Spring管理的loginAction,而是用类名重新引用的。loginAction
B:解决这个问题的方法:
修改Struts.xml的配置信息:
将原来的class="com.wl.struts.action.loginAction" 替换为 class="loginAction",其中的loginAction就是Spring中定义的id为loginAction的bean。
备注:
Spring对Struts的Action管理配置中不能忘记 scope="prototype"
默认情况下,Spring从bean工厂所取得的实例为Singleton(bean的singleton属性) Singleton: Spring容器只存在一个共享的bean实例,默认的配置。 Prototype: 每次对bean的请求都会创建一个新的bean实例;二者选择的原则:有状态的bean都使用Prototype作用域,而对无状态的bean则应该使用singleton作用域。
在ssh2 项目中,struts2的action交由spring管理的时候,spring默认是singleton的,而struts2的action显然是有状态的,所以必须显示设置为scope="prototype",prototype为原型模式,每次action请求过来都会创建一个action但是对那些Dao的实现类推介scope="singleton" ,因为这些类没有状态,用singleton只需维护一个实例,显然性能高一些。
5)重新部署项目,启动Tomcat后,点击“test Action”连接后控制条结果如下:
但是从数据库中查找数据,数据没有添加成功。
A: 问题原因: 缺少对事务的管理,数据未持久化到数据库中
B:解决的方法:添加对事务的管理,在bean.xml文件中添加配置信息
现在重新启动Tomcat后,点击“test Action”连接后,就会将数据持久化到数据库中。
1.添加Spring的Jar包
2.添加Struts2,Spring插件的Jar包
3.添加Oracle10g 数据库的Jar包
4.使用Spring来管理struts2的Action,DAO层,Service层
1)在原来web.xml基础之上添加Spring的监听器
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app version="2.5"
- xmlns="http://java.sun.com/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
- http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
- <welcome-file-list>
- <welcome-file>index.jsp</welcome-file>
- </welcome-file-list>
- <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>/*</url-pattern>
- </filter-mapping>
- <listener>
- <!--监听器在default情况下读取的是:/WEB-INF/applicationContext.xml -->
- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
- </listener>
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <!--
- <param-value>
- /WEB-INF/applicationContext-*.xml,classpath*:applicationContext-*.xml
- </param-value>
- -->
- <!-- 监听器启动后会读取classpath目录下面的beans.xml文件 -->
- <param-value>classpath:beans.xml</param-value>
- </context-param>
- </web-app>
2)修改loginAction的内容
- package com.wl.struts.action;
- import com.opensymphony.xwork2.ActionSupport;
- import com.wl.po.Student;
- import com.wl.service.studentService;
- @SuppressWarnings("serial")
- public class loginAction extends ActionSupport {
- private studentService stuService;
- public studentService getStuService() {
- return stuService;
- }
- public void setStuService(studentService stuService) {
- this.stuService = stuService;
- }
- @Override
- public String execute() throws Exception {
- Student stu=new Student();
- stu.setId("10");
- stu.setStuName("Zhangsan");
- stu.setStuAge(29);
- stu.setStuGrade("A");
- stu.setStuNo("201017");
- stu.setStuSex("male");
- stuService.saveStudent(stu);
- return SUCCESS;
- }
- }
3)在Src目录下新建bean.xml文件
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:contentx="http://www.springframework.org/schema/content"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
- http://www.springframework.org/schema/content
- http://www.springframework.org/schema/content/spring-content-2.5.xsd">
- <!-- configure the sessionFactory -->
- <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
- <property name="configLocation">
- <value>classpath:hibernate.cfg.xml</value>
- </property>
- </bean>
- <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
- <property name="sessionFactory" ref="sessionFactory"></property>
- </bean>
- <!-- manager the dao -->
- <bean id="studentDao" class="com.wl.dao.impl.studentDaoImpl">
- <property name="sessionFactory" ref="sessionFactory"></property>
- </bean>
- <!-- manager the service -->
- <bean id="studentService" class="com.wl.service.impl.studentServiceImpl">
- <property name="stuDao" ref="studentDao"></property>
- </bean>
- <!-- manager the action in struts2 -->
- <bean id="loginAction" class="com.wl.struts.action.loginAction" scope="prototype">
- <property name="stuService">
- <ref bean="studentService"/>
- </property>
- </bean>
- </beans>
4)这时部署项目到Tomcat,运行Tomcat,结果如下
点击“test Action”操作,报500错
说明未将studentService注入到loginAction中。
A:这个问题的原因是: loginAction没有真正的纳入Spring的管理当中
Spring的bean.xml配置文件的确对loginAction做了配置
- <!-- manager the action in struts2 -->
- <bean id="loginAction" class="com.wl.struts.action.loginAction" scope="prototype">
- <property name="stuService">
- <ref bean="studentService"/>
- </property>
- </bean>
但是Struts.xml配置文件中
- <package name="login" namespace="/" extends="struts-default">
- <action name="login" class="com.wl.struts.action.loginAction">
- <result name="success">/success.jsp</result>
- <result name="error">/error.jsp</result>
- </action>
- </package>
没有用到Spring管理的loginAction,而是用类名重新引用的。loginAction
B:解决这个问题的方法:
修改Struts.xml的配置信息:
- <package name="login" namespace="/" extends="struts-default">
- <action name="login" class="loginAction">
- <result name="success">/success.jsp</result>
- <result name="error">/error.jsp</result>
- </action>
- </package>
将原来的class="com.wl.struts.action.loginAction" 替换为 class="loginAction",其中的loginAction就是Spring中定义的id为loginAction的bean。
备注:
Spring对Struts的Action管理配置中不能忘记 scope="prototype"
默认情况下,Spring从bean工厂所取得的实例为Singleton(bean的singleton属性) Singleton: Spring容器只存在一个共享的bean实例,默认的配置。 Prototype: 每次对bean的请求都会创建一个新的bean实例;二者选择的原则:有状态的bean都使用Prototype作用域,而对无状态的bean则应该使用singleton作用域。
在ssh2 项目中,struts2的action交由spring管理的时候,spring默认是singleton的,而struts2的action显然是有状态的,所以必须显示设置为scope="prototype",prototype为原型模式,每次action请求过来都会创建一个action但是对那些Dao的实现类推介scope="singleton" ,因为这些类没有状态,用singleton只需维护一个实例,显然性能高一些。
5)重新部署项目,启动Tomcat后,点击“test Action”连接后控制条结果如下:
但是从数据库中查找数据,数据没有添加成功。
A: 问题原因: 缺少对事务的管理,数据未持久化到数据库中
B:解决的方法:添加对事务的管理,在bean.xml文件中添加配置信息
- <!-- Transaction configuration Information -->
- <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
- <property name="sessionFactory" ref="sessionFactory"></property>
- </bean>
- <tx:advice id="txAdvice" transaction-manager="transactionManager">
- <tx:attributes>
- <tx:method name="*" propagation="REQUIRED" rollback-for="java.lang.Exception" />
- </tx:attributes>
- </tx:advice>
- <!-- 执行com.wl.service包及其子包下面的任何类的以Student结尾的任何方法 -->
- <aop:config>
- <aop:advisor pointcut="execution(* com.wl.service..*.*Student(..))" advice-ref="txAdvice" />
- </aop:config>
现在重新启动Tomcat后,点击“test Action”连接后,就会将数据持久化到数据库中。