其实每个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的这部分代码如下:
..
return new ModelAndView( " hello.jsp " );
}
2.STRUTS中被痛批的actionFrom的多余问题,在最新版的Spring Framework MVC1.21中,也有同样的表现. 并且更加夸张!下面就是一个类似于actionForm的类.
public class PriceIncrease {
private int percentage;
public void setPercentage( int i) {
percentage = i;
}
public int getPercentage() {
return percentage;
}
}
如果引用呢, 它是在JSP中,显然比STRUTS中的XML配置更加原始,在JSP中是这样的:
3.Validator验校:这个简直退回到了STRUTS1.1以前版本的原始状态去了,我们知道STRUTS1.1以后的检校是配XML实现的.而不是写在一个类中. SPRING的验校代码如下:
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))传递上去。