技术开发 频道

使用 Spring 更好地处理 Struts 动作


窍门 3. 将动作管理委托给 Spring

  一个更好的解决方法是将 Strut 动作管理委托给 Spring。您可以通过在 struts-config 动作映射中注册一个代理来实现。代理负责在 Spring 环境中查找 Struts 动作。由于动作在 Spring 的控制之下,所以它可以填充动作的 JavaBean 属性,并为应用诸如 Spring 的 AOP 拦截器之类的特性带来了可能。
 
清单 5 中的 Action 类与清单 4 中的相同。但是 struts-config 有一些不同:
 
清单 5. Spring 整合的委托方法
 
<?xml version="1.0" encoding="ISO-8859-1" ?>
 
<!DOCTYPE
struts-config PUBLIC
          "-//Apache Software Foundation
          //DTD Struts Configuration 1.1//EN"
          "http://jakarta.apache.org
          /struts/dtds/struts-config_1_1.dtd">
 
<struts-config>
 <form-beans>
    <form-bean name="searchForm" 
      type="org.apache.struts.
      validator.DynaValidatorForm">
               <form-property name="isbn"   
                 type="java.lang.String"/>
    </form-bean>
  
 </form-beans>
 
 <global-forwards
 type="org.apache.struts.
 action.ActionForward">
     <forward   name="welcome"               
      path="/welcome.do"/>
     <forward   name="searchEntry"           
      path="/searchEntry.do"/>
     <forward   name="searchSubmit"          
      path="/searchSubmit.do"/>
 </global-forwards>
 
 <action-mappings>
    <action    path="/welcome"
     forward="/WEB-INF/pages/welcome.htm"/>
    <action    path="/searchEntry"
     forward="/WEB-INF/pages/search.jsp"/>
    <action    path="/searchSubmit" 
             type="org.springframework.
               web.struts.DelegatingActionProxy" |(1)
             input="/searchEntry.do"
             validate="true"
             name="searchForm">
             <forward name="success"
               path="/WEB-INF/pages/detail.jsp"/>
             <forward name="failure"
               path="/WEB-INF/pages/search.jsp"/>
    </action>  
 
 </action-mappings>
 
 <message-resources
 parameter="ApplicationResources"/>
 
 <plug-in className="org.apache.struts.
 validator.ValidatorPlugIn">
    <set-property 
    property="pathnames" 
    value="/WEB-INF/validator-rules.xml,
     /WEB-INF/validation.xml"/>
 </plug-in>
 
 <plug-in 
    className="org.springframework.web.
     struts.ContextLoaderPlugIn">
    <set-property
     property="contextConfigLocation"
     value="/WEB-INF/beans.xml"/>
 </plug-in>
 
</struts-config>
 
  清单 5 是一个典型的 struts-config.xml 文件,只有一个小小的差别。它注册 Spring 代理类的名称,而不是声明动作的类名,如(1)处所示。DelegatingActionProxy 类使用动作映射名称查找 Spring 环境中的动作。这就是我们使用 ContextLoaderPlugIn 声明的环境。
 
  将一个 Struts 动作注册为一个 Spring bean 是非常直观的,如清单 6 所示。我利用动作映射使用标记的名称属性(在这个例子中是 "/searchSubmit")简单地创建了一个 bean。这个动作的 JavaBean 属性像任何 Spring bean 一样被填充:
 
清单 6. 在 Spring 环境中注册一个 Struts 动作
 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "
-//SPRING//DTD BEAN//EN" 
 "http://www.springframework.
 org/dtd/spring-beans.dtd">
 
<beans>
 <bean id="bookService"
 class="ca.nexcel.books.
 business.BookServiceImpl"/>
 
 <bean name="/searchSubmit"   
        class="ca.nexcel.books.
         actions.SearchSubmit">
     <property name="bookService">
        <ref bean="bookService"/>
     </property>
 </bean>
 
</beans>
0
相关文章