`

Struts2+Hibernate+Spring框架搭建(三)

阅读更多
三:搭建Spring
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”连接后,就会将数据持久化到数据库中。
  • 大小: 2.3 KB
  • 大小: 1005 Bytes
  • 大小: 1.2 KB
  • 大小: 9.7 KB
  • 大小: 6.8 KB
  • 大小: 684 Bytes
  • Spring_Jar.rar (4.4 MB)
  • 描述: 用到的Spring的Jar包
  • 下载次数: 129
  • Oracle-jar.rar (1.4 MB)
  • 描述: 用到的OracleJar包
  • 下载次数: 62
  • FirstSshProject_001.rar (16.2 KB)
  • 描述: Struts2+Hibernate+Spring框架搭建的整个工程(不包含Jar包)
  • 下载次数: 99
分享到:
评论
3 楼 seachen 2011-06-24  
OK了,我忘记加struts2-spring-plugin-2.1.8.1.jar了
2 楼 seachen 2011-06-24  
OK了,我忘记加struts2-spring-plugin-2.1.8.1.jar了
1 楼 seachen 2011-06-24  
将原来的class="com.wl.struts.action.loginAction" 替换为class="loginAction",其中的loginAction就是Spring中定义的id为loginAction的bean之后。
再启动tomcat ,
在控制台显示struts.xml配置文件出错。

Caused by: Action class [loginAction] not found - action - file:/D:/apache-tomcat-6.0.28/webapps/ssh/WEB-INF/classes/struts.xml:7:49
	at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.verifyAction(XmlConfigurationProvider.java:409)
	at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.addAction(XmlConfigurationProvider.java:354)
	at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.addPackage(XmlConfigurationProvider.java:468)
	at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadPackages(XmlConfigurationProvider.java:264)
	at org.apache.struts2.config.StrutsXmlConfigurationProvider.loadPackages(StrutsXmlConfigurationProvider.java:111)
	at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:193)
	at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:55)
	... 31 more

相关推荐

Global site tag (gtag.js) - Google Analytics