Spring与Struts的整合策略

思想:将获取业务逻辑组件的方式放在父类中实现,而其余的Action则从父类中获取。

采用这个策略的优势:

  • 可在不同整合策略中自由切换
  • 避免重复创建DelegatingActionProxy实例
  • 使业务Action避免代码污染

下面举个例子来诠译这种整合方式,首先是BaseAction的源代码:

java 代码
  1. public class BaseAction extends ActionSupport
  2. {
  3. public Object getBean(String beanName)
  4. {
  5. return getWebApplicationContext().getBean(beanName);
  6. }
  7. }

该父类仅将ActionSupport的方法再次包装,但产生的优势非常明显,至少可以在实际业务Action中避免调用getWebApplicationContext方法。下面是业务Action的源代码:

java 代码
  1. //新的业务控制器,继承BaseAction类
  2. public class LoginAction extends BaseAction
  3. {
  4. //将一个ValidBean作为成员变量
  5. private ValidBean vb;
  6. public LoginAction()
  7. {
  8. System.out.println("------------");
  9. }
  10. //完成ValidBean的初始化
  11. public void setVb()
  12. {
  13. vb = (ValidBean)getBean("vb");
  14. }
  15. //必须重写该核心方法,该方法actionForm将表单的请求参数封装成值对象
  16. public ActionForward execute(ActionMapping mapping,
  17.                              ActionForm form,
  18.                              HttpServletRequest request,
  19.                              HttpServletResponse response)throws Exception
  20. {
  21. LoginForm loginForm = (LoginForm)form;
  22. String username = loginForm.getUsername();
  23. String pass = loginForm.getPass();
  24. setVb();
  25. //下面作服务器端的数据校验
  26. String errMsg = "";
  27. if (username == null || username.equals(""))
  28. {
  29. errMsg += "您的用户名丢失或没有输入,请重新输入";
  30. }
  31. else if(pass == null || pass.equals(""))
  32. {
  33. errMsg += "您的密码丢失或没有输入,请重新输入";
  34. }
  35. else
  36. {
  37. if (vb.valid(username,pass))
  38. {
  39. return mapping.findForward("welcome");
  40. }
  41. else
  42. {
  43. errMsg = "您的用户名和密码不匹配";
  44. }
  45. }
  46. if (errMsg != null && !errMsg.equals(""))
  47. {
  48. request.setAttribute("err" , errMsg);
  49. return mapping.findForward("input");
  50. }
  51. else
  52. {
  53. return mapping.findForward("welcome");
  54. }
  55. }
  56. }

从代码中可看出,在实际的业务控制器Action中,完全从Spring的API中分离出来,从而可以避免代码污染。

另外,还有一个最大的好处:实际的业务Action并没有与任何的整合策略耦合。假如需要在不同的整合策略之间切换,其业务Action完全不需要改变。

假设需要将整合策略切换到得用Spring IOC特性,则只需将BaseAction改成如下形式:

java 代码
  1. public class BaseAction   
  2. {  
  3.     //业务逻辑组件  
  4.     Object serviceObj;  
  5.     //依赖注入必需的setter方法  
  6.     public void setServiceObj(Object obj)  
  7.     {  
  8.         this.serviceObj = obj;  
  9.     }  
  10.     /** 
  11.       *根据beanName获取容器中的bean实例 
  12.       */  
  13.       public Object getBean(String beanName)  
  14.     {  
  15.           return serviceObj:  
  16.     }  
  17. }  
从代码中可以看出,BaseAction等待容器依赖注入。当BaseAction的子类调用getBean方法时,传入的baseName完全没有作用。因为使用了Spring的依赖注入,Action与业务逻辑组件之间的依赖关系可通过配置文件来设定。

下面的示例采用这种整合策略,而Spring管理Action则采用DelegatingRequestProcessor策略。其struts-config.xml和actionServlet的配置文件如下:

xml 代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2.   
  3. <!DOCTYPE struts-config PUBLIC  
  4.           "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"  
  5.           "http://struts.apache.org/dtds/struts-config_1_2.dtd">  
  6.   
  7. <struts-config>  
  8.     <form-beans>  
  9.         <form-bean name="loginForm" type="cn.LoginForm"/>  
  10.     </form-beans>  
  11.   
  12.     <action-mappings>  
  13.         <!--这里只定义了一个action,而且没有指定该action的type元素-->  
  14.         <action path="/login" name="loginForm"  
  15.             scope="request" validate="true" input="/login.jsp" >  
  16.             <forward name="input" path="/login.jsp"/>  
  17.             <forward name="welcome" path="/welcome.html"/>  
  18.         </action>  
  19.     </action-mappings>  
  20.   
  21.     <!--使用DelegatingRequestProcessor替换RequestProcessor-->  
  22.     <controller 
  23. processorClass="org.springframework.web.struts.DelegatingRequestProcessor"/>
  24.     <message-resources parameter="mess"/>  
  25.   
  26.      <!-- 装载验证的资源文件-->  
  27.     <plug-in className="org.apache.struts.validator.ValidatorPlugIn">  
  28.         <set-property property="pathnames"
  29. value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />  
  30.         <set-property property="stopOnFirstError" value="true"/>  
  31.     </plug-in>  
  32.   
  33.     <!-- 装载Spring配置文件,随同应用启动创建ApplicationContext实例-->  
  34.     <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">  
  35.         <set-property property="contextConfigLocation"   
  36.             value="/WEB-INF/applicationContext.xml,  
  37.                    /WEB-INF/action-servlet.xml"/>  
  38.     </plug-in>  
  39.   
  40. </struts-config>  

action-servlet的配置文件如下:

xml 代码
 
  1. <?xml version="1.0" encoding="GB2312"?>  
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"  
  3.     "http://www.springframework.org/dtd/spring-beans.dtd">  
  4.   
  5. <beans>  
  6.     <!--每个request请求产生新实例,所以将action配置成non-singleton-->  
  7.     <bean name="/login" class="lee.LoginAction" singleton="false">  
  8.        <!--配置依赖注入-->  
  9.         <property name="vb">  
  10.             <ref bean="vb"/>  
  11.         </property>  
  12.     </bean>  
  13. </beans>  

你可能感兴趣的:(spring,bean,xml,struts,vb)