Struts和SpringMVC的区别
1、Struts是类级别的拦截,一个request上下文对应一个类;SpringMVC是方法级别的拦截,一个request上下文对应一个方法,而方法又对应一个url。具体看一个实现过程就明白了,struts常用是配置xml实现,而SpringMVC是注解实现。
①下面是一个struts.xml配置代码:
<package name="admin" namespace="/admin" extends="struts-default"> <!-- 使用通配符与动态值配置AdminAction --> <action name="*" class="admin" method="{1}"> <result name="login">/login.jsp</result> <result name="users">/admin/users.jsp</result> <result name="add">/admin/add.jsp</result> <result name="input">/message.jsp</result> <result name="message">/message.jsp</result> <!-- 为AdminAction类中login方法配置映射 --> <action name="login" class="admin" method="login"> <result name="success" >manage.jsp</result> <result name="input">/login.jsp</result> </action> </package>
一个<package/>标签可以是包括整个类的业务方法,注意看<action/>标签,每一个标签都要指定一个类,以及实现的方法(当然不指定实现方法,会默认执行execute方法),根据不同的String类型的值,跳转不同的页面,这就很明显说明了Struts是属于类级别的拦截;
②下面是SpringMVC的注解代码:
@Controller public class AttributeController { @GetMapping("/attributeTest") public ModelAndView attributeTest(ModelAndView mv){ System.out.println("attributeTest被调用..."); mv.setViewName("redirect:main"); return mv; } @RequestMapping("/main") public String main( @RequestAttribute("school") String school, @SessionAttribute("author") String author){ System.out.println("main方法被调用..."); System.out.println("school="+school+", author="+author); return "welcome"; } }
@GetMapping和@RequestMapping都是对指定url的响应,每次的request请求只会根据url来找到对应的方法执行,这样子就容易理解SpringMVC是方法级别的拦截。
2、由于两者的拦截级别不同,所以request和response上下文的数据生命周期也有所不同,SpringMVC每个方法独享request和response的数据,参数通过url获取;而Struts是通过页面的控件属性自动绑定到类上,即每个Action类的方法都能共享request和response的数据。
3、拦截器方面,struts有自己的拦截机制,SpringMVC采用AOP的方式,导致配置上Struts要多很多。
4、struts的入口是filter,springmvc则是servlet;
5、验证框架方面,springmvc支持JSR303,直接在类的属性上用注解,简单方便,而struts要自己实现support类,还要实现validate方法,写验证规则,显得比较麻烦。