Spring Framework MVC 学习感想!

来源:互联网 发布:mac diva dare you试色 编辑:程序博客网 时间:2024/06/10 22:04




其实每个MVC framework的执行过程都是大同小异的,当个request过来时,它都通过一个Servlet来响应request,再根据request的路径名和配置将这个request dispatch给一个Controller执行,最后将之返回配置文件里对应的页面。在Spring MVC里,这个Servlet的名字叫DispatchServlet

1.STRUTS 中被痛批的接口不干净的问题,就是直接把HttpServletRequest之类的对象传到ACTION中,在最新版的Spring Framework MVC1.21中,也有同样的表现. 为什么新出的Spring Framework MVC1.21不象WW2一样的处理呢?刚开始彼为迷惑. 经过仔细分析后,终于想通了,直接HttpServletRequest显然这么做是为了保证ACTION是一个单例. 想一想作为WEB系统,性能何其重要!

Spring Framework MVC的这部分代码如下:  

public  ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)  throws  ServletException, IOException  {   
   ..   
   
return   new  ModelAndView( " hello.jsp " );      
 }
 


2.STRUTS中被痛批的actionFrom的多余问题,在最新版的Spring Framework MVC1.21中,也有同样的表现. 并且更加夸张!下面就是一个类似于actionForm的类.

package  bus;  

public   class  PriceIncrease  {  
   
private   int  percentage;   

   
public   void  setPercentage( int  i)  {        
       percentage 
=  i;      
   }
  
   
   
public   int  getPercentage() {   
       
return  percentage;       
   }
    
}

如果引用呢, 它是在JSP中,显然比STRUTS中的XML配置更加原始,在JSP中是这样的:

< spring:bind path = " priceIncrease.percentage " >   

3.Validator验校:这个简直退回到了STRUTS1.1以前版本的原始状态去了,我们知道STRUTS1.1以后的检校是配XML实现的.而不是写在一个类中. SPRING的验校代码如下:

package  bus; 

import  java.io.Serializable;   
import  org.springframework.validation.Validator;   
import  org.springframework.validation.Errors;   
import  org.apache.commons.logging.Log;   
import  org.apache.commons.logging.LogFactory; 

public   class  PriceIncreaseValidator  implements  Validator 

    
protected   final  Log logger  =  LogFactory.getLog(getClass());   

    
private   int  DEFAULT_MIN_PERCENTAGE  =   0 ;   
    
private   int  DEFAULT_MAX_PERCENTAGE  =   50
    
    
// 2个要验证的字段
     private   int  minPercentage  =  DEFAULT_MIN_PERCENTAGE;   
    
private   int  maxPercentage  =  DEFAULT_MAX_PERCENTAGE; 
    
    
public   boolean  supports(Class clazz)  {   
        
return  clazz.equals(PriceIncrease. class );    
    }
  
    
    
public   void  validate(Object obj, Errors errors)  {   
       PriceIncrease pi 
=  (PriceIncrease) obj;   
       
if  (pi  ==   null {   
           errors.rejectValue(
" percentage " " error.not-specified " null " Value required. " );    
       }
else   {     
           logger.info(
" Validating with  "   +  pi  +   " "   +  pi.getPercentage());   
           
if  (pi.getPercentage()  >  maxPercentage)  {   
                errors.rejectValue(
" percentage " " error.too-high " ,        
                
new  Object[]  { new  Integer(maxPercentage)} " Value too high. " );   
            }
   
           
if  (pi.getPercentage()  <=  minPercentage)  {    
            errors.rejectValue(
" percentage " " error.too-low " ,   new  Object[]  { new  Integer(minPercentage)} , " Value too low. " );
           }
   
       }
   
   }
    
  
   
public   void  setMinPercentage( int  i)  {   
      minPercentage 
=  i;      
   }
      
   
   
public   int  getMinPercentage()  {        
      
return  minPercentage;      
   }
 
   
   
public   void  setMaxPercentage( int  i)  {     
      maxPercentage 
=  i;       
   }
 
   
   
public   int  getMaxPercentage()  {   
      
return  maxPercentage;   
   }
   
}
 

4.表现层标签.SPRING MVC采用jstl. 我认为这个很不错的选择,自已搞一套首选功能不会太好,比如STRUTS的就不太好用.现在即将出现新版的STRUTS正准备用jstl.

5.IOC, 这当然是最好的了,紧密结合SPRING的ICO.但是好处还没有看到,如果正式用于项目,配置文件会大的吓人!

6.TEST,在STRUTS中TEST在以摸拟环境的方式测试是失败的,虽然还有别的选择,SPRING的则这点不错.

Spring MVC是我见过的结构最清晰的MVC Model 2实现。
Action不叫Action,准确地称做Controller;Controller接收request, response参数,干脆利落地返回ModelAndView(其中的Model不是Object类型,而是Map类型,这个有点限制过头)。
其 它的Web Framework中, Action返回值一般都只是一个View Name;Model则需要通过其它的途径(如request.attribute (Struts),Context参数(Maverick),或Action本身的属性数据(Webwork))传递上去。