Spring 和 struts 整合的三种方式。

 

《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《
Spring 和 struts 整合的三种方式。《《《《《《《《《《《《《《《
《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《

1,使用Spring 的 ActionSupport

2, 使用Spring 的 DelegatingRequestProcessor 类。
3,全权委托。

无论用那种方法来整合第一步就是要为struts来装载spring的应用环境。 就是在 struts 中加入一个插件。
struts-config.xml中

 <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
  <set-property property="contextConfigLocation" value="/WEB-INF/classes/applicationContext.xml"/>
 </plug-in>


spring 的配置文件被作为参数配置进来。这样可以省略对web.xml 文件中的配置。确保你的applicationContext.xml 在WEB-INF目录下面的classes

1,方法一>>>>>>>使用Spring的ActionSupport .
Spring 的ActionSupport 继承至 org.apache.struts.action.Action
ActionSupport的子类可以或得 WebApplicationContext类型的全局变量。通过getWebApplicationContext()可以获得这个变量。

这是一个 servlet 的代码:
public class LoginAction extends org.springframework.web.struts.ActionSupport {
 
 public ActionForward execute(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response) {
  LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method stub
                //获得  WebApplicationContext  对象             
  WebApplicationContext ctx = this.getWebApplicationContext();
 
  LoginDao dao = (LoginDao) ctx.getBean("loginDao");
  User u = new User();
 
  u.setName(loginForm.getName());
  u.setPwd(loginForm.getPwd());
 
 
  if(dao.checkLogin(u)){
   return mapping.findForward("success");
  }else{
   return  mapping.findForward("error");
  }
 
 }
}

applicationContext.xml 中的配置
<beans>
 <bean id="loginDao" class="com.cao.dao.LoginDao"/>
</beans>

这中配置方式同直接在web.xml文件配置差别不大。注意:Action继承自 org.springframework.web.struts.ActionSupport 使得struts和spring耦合在一起。
但实现了表示层和业务逻辑层的解耦(LoginDao dao = (LoginDao) ctx.getBean("loginDao"))。


2,方法二>>>>>>>使用Spring 的 DelegatingRequestProcessor 类
DelegatingRequestProcessor  继承自 org.apache.struts.action.RequestProcessor 并覆盖了里面的方法。
sturts-config.xml  中  <controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor"/> 通过 <controller >来替代
                        org.apache.struts.action.RequestProcessor 的请求处理。

public class LoginAction extends Action {
 //利用spring来注入这个对象。
 private LoginDao dao ;
 
 public void setDao(LoginDao dao) {
  System.out.println("执行注入");
  this.dao = dao;
 }

 public LoginDao getDao() {
  return dao;
 }

 public ActionForward execute(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response) {
  LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method stub
  //这样一改这行代码似乎没有必要了。
  //WebApplicationContext ctx = this.getWebApplicationContext();
  //LoginDao dao = (LoginDao) ctx.getBean("loginDao");
 
  User u = new User();
 
  u.setName(loginForm.getName());
  u.setPwd(loginForm.getPwd());
 
  //直接用dao来调用spring会将这个对象实例化。
  if(dao.checkLogin(u)){
   return mapping.findForward("success");
  }else{
   return  mapping.findForward("error");
  }
 
 }
}
这里的。
LoginAction extends Action 说明 struts 没有和spring 耦合。
看一下
applicationContext.xml 中的配置。
<beans>
 <bean id="loginDao" class="com.cao.dao.LoginDao"/>
 
 <bean name="/login" class="com.cao.struts.action.LoginAction">
  <property name="dao">
   <ref local="loginDao"/>
  </property>
 </bean>
</beans>

这里 name="/login" 与struts 中的path匹配
    class="com.cao.struts.action.LoginAction" 与struts 中的type匹配

还要为 LoginAction 提供必要的setXXX方法。 获得ApplicationCotext和依赖注入的工作都在DelegatingRequestProcessor中完成。


3,方法三>>>>>>>全权委托:
Action 的创建和对象的依赖注入全部由IOC容器来完成。 使用Spring的DelegatingAcionProxy来帮助实现代理的工作
org.springframework.web.struts.DelegatingActiongProxy继承于org.apache.struts.action.Action .


全权委托的配置方式同 方式 2 类似 (applcationContext.xml文件的配置和 Action类的实现方式相同)。
<struts-config>
  <data-sources />
  <form-beans >
    <form-bean name="loginForm" type="com.cao.struts.form.LoginForm" />

  </form-beans>

  <global-exceptions />
  <global-forwards />
 <action-mappings >
    <!-- type指向的是spring 的代理类 -->
    <action
      attribute="loginForm"
      input="login.jsp"
      name="loginForm"
      path="/login"
      scope="request"

      type="org.springframework.web.struts.DelegatingActionProxy" >
     
      <forward name="success" path="/ok.jsp" />
      <forward name="error" path="/error.jsp" />
    </action>
 
 </action-mappings>
 
 
  <message-resources parameter="com.cao.struts.ApplicationResources" />

 <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
  <set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml"/>
 </plug-in>

</struts-config>
不同之处
1, <action>中 type指向的是spring 的代理类

2, 去掉struts-config.xml中 <controller >

 **********************************************************************************

三种整和方式中我们优先选用 全权委托的方式。
理由:
1,第一种使得过多的耦合了Spring和Action .
2,RequestProcessor类已经被代理 如果要再实现自己的实现方式(如:编码处理)怕有点麻烦。

 

 **********************************************************************************
总结一下:
整合工作中的步骤:
1,修改struts-config.xml  
2, 配置applicationContext.xml
3, 为Action添加get/set方法 来获得依赖注入的功能。

 

 


8、增加声明式事务处理

》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

》》》》》》》》》》》》》》》》》》applicationContext.xml中事务的整合》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
<!-- 使用Spring框架的代理处理器代替Struts框架原有的ActionServlet客户请求后交由srping处理 -->
<controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor"></controller>

    <!-- 集成Spring插件 -->
     <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
        <set-property property="contextConfigLocation"
            value="/WEB-INF/classes/applicationContext.xml"/>
    </plug-in>


 <!--表示要载入的配置文件,用于整合spring框架-->
    <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
        <set-property property="contextConfigLocation"
            value="/WEB-INF/applicationContext.xml,
                   /WEB-INF/daoContext.xml,
                   /WEB-INF/*action-servlet.xml"/>
    </plug-in>

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
///


在applicationcontext。xml中
 <!--   6、增加声明式事务处理 (注意:这里AOP的jar包必须导入,否则配置文件出错)
 
  6.1 先配置事务管理器: -->
 <bean id="transactionManager"
  class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory" ref="sessionFactory" />
 </bean>

 <!-- 6.2 再配置事务拦截器: -->

 <bean id="transactionInterceptor"
  class="org.springframework.transaction.interceptor.TransactionInterceptor">
  <!--  事务拦截器bean需要依赖注入一个事务管理器 -->
  <property name="transactionManager" ref="transactionManager" />

  <property name="transactionAttributes">
   <!--  下面定义事务属性-->
   <props>
    <prop key="save*">PROPAGATION_REQUIRED</prop>
    <prop key="update*">PROPAGATION_REQUIRED</prop>
    <prop key="del*">PROPAGATION_REQUIRED</prop>
    <prop key="get*">PROPAGATION_REQUIRED,readOnly
    </prop>
   </props>
  </property>
 </bean>

 <!--
  6.2
  应用事务拦截器,去拦截service或dao:一般情况下是拦截service类,只有项目中没有service层的时候,才去拦截dao层的类
 -->

 <bean
  class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
  <!--  指定对满足哪些bean name的bean自动生成业务代理 -->
  <property name="beanNames">
   <!--  下面是所有需要自动创建事务代理的bean-->
   <list>
    <value>carInfoDAO</value>
             <value>serviceInfoDAO</value>
   </list>
   <!--  此处可增加其他需要自动创建事务代理的bean-->
  </property>
  <!--  下面定义BeanNameAutoProxyCreator所需的事务拦截器-->
  <property name="interceptorNames">
   <list>
    <!--  这里是事务拦截器 -->
    <value>transactionInterceptor</value>
   </list>
  </property>
 </bean>

   事务属性:传播属性(必选),隔离级别(可选),是否为只读(可选),抛出异常时的回滚规则(可选)

   PROPAGATION_REQUIRED:让方法运行在一个事务里

   oracle, sqlserver: read committed

   mysql: INNODB:repeatable read

   不设定则使用数据库默认的隔离级别

   reanonly: 是否为只读事务;给了后端数据库一个机会,来应用那些它认为合适的优化措施。

             因为只读的优化措施是在事务启动时由后端数据库实施,所以,只有将那些可能启动新事务的传播行为的方法的事务标记成只读才有意义

   回滚规则:当事务运行过程中抛出异常时,事务回滚或者不回滚。

   应用事务拦截器,去拦截service或dao:

   <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
 <!--  指定对满足哪些bean name的bean自动生成业务代理 -->
 <property name="beanNames">
  <!--  下面是所有需要自动创建事务代理的bean-->
  <list>
   <value>empManager</value>
  </list>
  <!--  此处可增加其他需要自动创建事务代理的bean-->
 </property>
 <!--  下面定义BeanNameAutoProxyCreator所需的事务拦截器-->
 <property name="interceptorNames">
  <list>
   <!– 这里是事务拦截器 -->
   <value>transactionInterceptor</value>
  </list>
 </property>
  </bean>

  结果: empManager里所有 saveXXX(),updateXXX(),delXXX()运行在一个事务里

                          getXXX()也是运行在一个事务里,并且只读

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值