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

本文详细介绍了如何将Spring、Struts2和Hibernate(SSH)进行整合,包括添加必要的Jar包、配置监听器、设置Action依赖注入及事务管理等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

三:搭建Spring
1.添加Spring的Jar包

[img]http://dl.iteye.com/upload/attachment/468335/82582b67-3d16-3575-ae8b-585f23676814.png[/img]

2.添加Struts2,Spring插件的Jar包

[img]http://dl.iteye.com/upload/attachment/468339/fc55797b-00c8-3a79-8ef9-ed5d8e03cc67.png[/img]

3.添加Oracle10g 数据库的Jar包

[img]http://dl.iteye.com/upload/attachment/468342/7db4859b-5c91-3812-9c0c-4a61d9c56c34.png[/img]

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,结果如下

[img]http://dl.iteye.com/upload/attachment/469089/082b143f-ce64-3001-8870-8594e4c862f4.png[/img]
点击“test Action”操作,报500错

[img]http://dl.iteye.com/upload/attachment/469091/98a7dc72-d2e1-3baf-a791-17365b4cf325.png[/img]
说明未将studentService注入到loginAction中。

A:这个问题的原因是:[color=red][b]loginAction没有真正的纳入Spring的管理当中[/b][/color]
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>

[color=red][b]没有用到Spring管理的loginAction,而是用类名重新引用的。loginAction[/b][/color]
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" 替换为[color=red][b]class="loginAction"[/b][/color],其中的loginAction就是Spring中定义的id为loginAction的bean。
[color=red][b]备注:[/b][/color]
Spring对Struts的Action管理配置中不能忘记 [color=red][b]scope="prototype"[/b][/color]
默认情况下,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”连接后控制条结果如下:

[img]http://dl.iteye.com/upload/attachment/469104/a5449ab7-6dbd-321b-b0ca-6df9a92f5740.png[/img]
但是从数据库中查找数据,数据没有添加成功。
A: 问题原因:[color=red][b]缺少对事务的管理,数据未持久化到数据库中[/b][/color]
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”连接后,就会将数据持久化到数据库中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值