低耦合的Struts集成Spring的实例
	
		
		系统
		
		1868 0
	
	  
  
    我们在集成Spring和struts的时候,往往习惯于使用spring提供的ActionSupport,然后使用getWebApplicationContext()方法获得spring的bean,这样固然方便,但有一个弊端,就是我们的struts action依赖了spring的api,增加了耦合,现在什么都流行高内聚,低耦合,spring为我们提供了代理的Struts action,这样,我们在struts-config.xml不再为path设置真正的action,而是设计spring的代理Action,然后由spring的代理action,去寻找在spring bean 容器中的真正的action,这样,我们的action是一个完全没有依赖于spring的action ,具体实现请看以下代码:
  
  
     
  
  
    Action:
  
  
     
  
  
    
      
      
      
        /**/
      
      
        
          /*
        
        
          
          
           * Generated by MyEclipse Struts
          
          
           * Template path: templates/java/JavaClass.vtl
          
          
           
        
        
          */
        
      
      
        
        
      
      
        package
      
      
         action;
        
        
        
        
      
      
        import
      
      
         javax.servlet.http.HttpServletRequest;
        
        
      
      
        import
      
      
         javax.servlet.http.HttpServletResponse;
        
        
        
        
      
      
        import
      
      
         org.apache.struts.action.Action;
        
        
      
      
        import
      
      
         org.apache.struts.action.ActionForm;
        
        
      
      
        import
      
      
         org.apache.struts.action.ActionForward;
        
        
      
      
        import
      
      
         org.apache.struts.action.ActionMapping;
        
        
        
        
      
      
        import
      
      
         Service.StudentService;
        
        
        
        
        
        
        
      
      
        public
      
      
         
      
      
        class
      
      
         ListStudentActionAction 
      
      
        extends
      
      
         Action 
      
      
        ...
      
      
        
          {
          
          
              
        
        
          private
        
        
           StudentService studentService;
          
          
              
        
        
          public
        
        
           ActionForward execute(ActionMapping mapping, ActionForm form,
          
          
          
                      HttpServletRequest request, HttpServletResponse response) 
        
        
          ...
        
        
          
            {
            
            
            
            
                    System.out.println(
          
          
            this
          
          
            .studentService.getStudent().getName()
          
          
            +
          
          
            "
          
          
            --
          
          
            "
          
          
            +
          
          
            this
          
          
            .studentService.getStudent().getSex());
            
            
                    
          
          
            return
          
          
             
          
          
            null
          
          
            ;
            
            
                }
          
        
        
          
          
              
        
        
          //
        
        
          通过spring注入service
        
        
          
          
          
        
        
              
        
        
          public
        
        
           
        
        
          void
        
        
           setStudentService(StudentService studentService) 
        
        
          ...
        
        
          
            {
            
            
                    
          
          
            this
          
          
            .studentService 
          
          
            =
          
          
             studentService;
            
            
                }
          
        
        
          
          
              
          
          
              
          
          
          }
        
      
     
   
  
     
  
  
    Service:
  
  
     
  
  
    
      
      
        package Service;
        
        
        
        
        import Model.Student;
        
        
        
        
        public class StudentService {
        
        
        
        
          public Student getStudent(){
        
        
             return new Student("name","sex");  
        
        
          }
        
        
        }
        
        
      
     
   
  
     
  
  
    applicationContext.xml
  
  
    配置真正的strutsAction,并把service类注入
  
  
    
      
      
        <?
      
      
        xml version="1.0" encoding="UTF-8"
      
      
        ?>
      
      
        
        
      
      
        <
      
      
        beans
        
        
            
      
      
        xmlns
      
      
        ="http://www.springframework.org/schema/beans"
      
      
        
        
            xmlns:xsi
      
      
        ="http://www.w3.org/2001/XMLSchema-instance"
      
      
        
        
            xsi:schemaLocation
      
      
        ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"
      
      
        >
      
      
        
        
        
        
      
      
        <
      
      
        bean 
      
      
        name
      
      
        ="/listStudentAction"
      
      
         class
      
      
        ="action.ListStudentActionAction"
      
      
        >
      
      
        
        
          
      
      
        <
      
      
        property 
      
      
        name
      
      
        ="studentService"
      
      
        >
      
      
        
        
            
      
      
        <
      
      
        bean 
      
      
        class
      
      
        ="Service.StudentService"
      
      
        />
      
      
        
        
          
      
      
        </
      
      
        property
      
      
        >
      
      
        
        
      
      
        </
      
      
        bean
      
      
        >
      
      
        
        
      
      
        </
      
      
        beans
      
      
        >
      
     
   
  
     
  
  
    struts-config.xml
  
  
     
  
  
    
      
      
        <?
      
      
        xml version="1.0" encoding="UTF-8"
      
      
        ?>
      
      
        
        
      
      
        <!
      
      
        DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd"
      
      
        >
      
      
        
        
        
        
      
      
        <
      
      
        struts-config
      
      
        >
      
      
        
        
          
      
      
        <
      
      
        data-sources 
      
      
        />
      
      
        
        
          
      
      
        <
      
      
        form-beans 
      
      
        />
      
      
        
        
          
      
      
        <
      
      
        global-exceptions 
      
      
        />
      
      
        
        
          
      
      
        <
      
      
        global-forwards 
      
      
        />
      
      
        
        
          
      
      
        <
      
      
        action-mappings 
      
      
        >
      
      
        
        
           
      
      
        <!--
      
      
         不再真正的action,而注册spring的代理action
        
        
            <action path="/listStudentAction" type="action.ListStudentActionAction" />
        
        
              
      
      
        -->
      
      
        
        
            
      
      
        <
      
      
        action 
      
      
        path
      
      
        ="/listStudentAction"
      
      
         type
      
      
        ="org.springframework.web.struts.DelegatingActionProxy"
      
      
         
      
      
        />
      
      
        
        
        
        
        
        
          
      
      
        </
      
      
        action-mappings
      
      
        >
      
      
        
        
        
        
           
      
      
        <
      
      
        message-resources 
      
      
        parameter
      
      
        ="ApplicationResources"
      
      
         
      
      
        />
      
      
        
        
        
        
        
        
         
        
        
        
        
           
      
      
        <
      
      
        plug-in 
      
      
        className
      
      
        ="org.springframework.web.struts.ContextLoaderPlugIn"
      
      
        >
      
      
        
        
                
      
      
        <
      
      
        set-property 
      
      
        property
      
      
        ="contextConfigLocation"
      
      
        
        
                    value
      
      
        ="/WEB-INF/classes/applicationContext-service.xml"
      
      
        />
      
      
        
        
            
      
      
        </
      
      
        plug-in
      
      
        >
      
      
        
        
      
      
        </
      
      
        struts-config
      
      
        >
      
      
        
        
        
        
      
     
   
  
    需要说明的是,由于spring dtd规定id不能有"/",所以我们用name定义path,并且,spring bean的name要和struts-config.xml中的path一致
  
  
    使用DelegatingActionProxy的好处就在于你可以用不用任何spring特定的类编写Struts Action,这个方法也有不足之处,就是不太直观,因为所有路径都映射到同一个类了
  
  
    对于这种情况,spring也有解决方法,就是使用请求委托
  
  
    首先,为struts-config.xml增加controller
  
  
     
  
  
    
      
      
          
      
      
        <!--
      
      
         使用请求委托 
      
      
        -->
      
      
        
        
         
      
      
        <
      
      
        controller 
      
      
        processorClass
      
      
        ="org.springframework.web.struts.DelegatingRequestProcessor"
      
      
        >
      
      
        
        
         
      
      
        </
      
      
        controller
      
      
        >
      
     
   
  
     
  
  
    然后,修改我们的path定义位 <action path="/listStudentAction" type="action.ListStudentActionAction"/>
  
  
    这样,又和我们单独使用struts的时候一样了,但内部还是让spring取代理我们的真正的action
  
  
    需要说明的是,这里的type其实是个摆设,完全可以使用 <action path="/listStudentAction"/>,写上是为了解决我们上面提到的“不够直观的”的问题
  
  
  
  
  
  
    
      低耦合的Struts集成Spring的实例
    
  
 
 
 	
	
	
	
	
			
	
		
			
				
					更多文章、技术交流、商务合作、联系博主
					
						微信扫码或搜索:z360901061
					
					
					
						微信扫一扫加我为好友
						
							QQ号联系:  360901061
						
					 
				 
			 
		 
	 
	
		
			
				
					您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。
					
						【本文对您有帮助就好】元