SpringMVC和Struts2比较
1. 入口
spring mvc的入口是servlet,而struts2是filter(这里要指出,filter和servlet是不同的。以前认为filter是servlet的一种特殊),
这样就导致了二者的机制不同,这里就牵涉到servlet和filter的区别了。
2、主要机制
springmvc是方法级别的拦截,一个方法对应一个request上下文,
而方法同时又跟一个url对应,参数的传递是直接注入到方法中的,是该方法独有的。
struts2是类级别的拦截, 一个类对应一个request上下文, struts是在接受参数的时候,可以用属性来接受参数,
这就说明参数是让多个方法共享的,这也就无法用注解或其他方式标识其所属方法了
intercepter的实现机制。struts有以自己的interceptor机制,spring mvc 用的是独立的AOP方式。
这样导致struts的配置文件量还是比spring mvc大,虽然struts的配置能继承,spring mvc使用更加简洁。
3、SpringMVC对ajax的支持上要优于struts2。
struts2框架性能很好, 但struts2的标签性能太差了。 要避免使用 struts2标签。
Struts2 由于采用了 值栈、OGNL表达式、struts2标签库等,会导致性能下降,
很严重的下降。如果避免或减少使用这些,性能还是很好的。
Struts2的 多层拦截器、 多实例action性能都很好,并不是 导致性能问题的原因。
Filter与Servlet的区别和联系
| Filter | Servlet |
接口 | 实现Filter接口 | 实现Servlet接口 |
使用步骤 | 1、创建类,继承接口 2、实现方法 init() doFilter() destroy()
3、配置WEB-INF/web.xml | 1、创建类,继承接口 2、实现方法 init() service() destroy() getServletConfig() getServletInfo() 3、配置WEB-INF/web.xml |
初始化时间 | Servlet容器启动之后即初始化 | Servlet类被调用之后初始化、先于Filter调用。 初始化可以在容器启动后被调用但需要配置。 |
调用顺序 | 1. 按照web.xml中的映射配置顺序按照配置条件从后向前调用 2. 层次调用doFilter()方法中FilterChain.doFilter()之前的内容 3. 调用Servlet中的service()方法 4. service方法执行完毕后,层次调用doFilter()中FilterChain.doFilter()之后的方法,顺序与之前的相反
| 按照web.xml中的映射配置顺序按照配置条件从后向前调用第一个满足条件的Servlet,调用之前事先执行满足条件的Filter,不存在层次调用Servlet问题 |
销毁 | 服务器停止后销毁,晚于Servlet销毁之后 | 服务器停止后销毁 |
作用 | 1. 在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest。 2. 根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据。 3. 在HttpServletResponse到达客户端之前,拦截HttpServletResponse。 4. 根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。 | 主要是处理客户端的请求并将其结果发送到客户端。 |