一,本质对比
分析web.xml,我们可以发现,一个Web应用程序主要由context-param、listener、filter、servlet四部分组成。一个前台http请求发到后台服务器时,Tomcat 等Web容器首先把请求转化成ServletRequest和ServletResponse两个对象,然后依次调用Web应用程序在web.xml文件中定义的如上4个环节。
Filter实现filter接口,对ServletRequest对象进行一定的加工处理,然后把处理结果写入到ServletResponse对象中。一个Web应用程序可以有多个Filter,不同Filter之间依次串行执行。Filter接口的方法说明如下:
Method Summary | |
void |
destroy() Called by the web container to indicate to a filter that it is being taken out of service. |
void |
doFilter(ServletRequest request, ServletResponse response, FilterChain chain) The doFilter method of the Filter is called by the container each time a request/response pair is passed through the chain due to a client request for a resource at the end of the chain. |
void |
init(FilterConfig filterConfig) Called by the web container to indicate to a filter that it is being placed into service. |
Servlet实现servlet接口。一个Web应用程序只能有一个servlet。Servlet接口的方法说明如下:
Method Summary | |
void |
destroy() Called by the servlet container to indicate to a servlet that the servlet is being taken out of service. |
ServletConfig |
getServletConfig() Returns a ServletConfig object, which contains initialization and startup parameters for this servlet. |
java.lang.String |
getServletInfo() Returns information about the servlet, such as author, version, and copyright. |
void |
init(ServletConfig config) Called by the servlet container to indicate to a servlet that the servlet is being placed into service. |
void |
service(ServletRequest req, ServletResponse res) Called by the servlet container to allow the servlet to respond to a request. |
Strut2通过org.apache.struts2.dispatcher.ng.filter. StrutsPrepareAndExecuteFilter切入到web.xml中,其本质为一个Filter。
SpringMVC通过org.springframework.web.servlet.DispatcherServlet切入到web,xml中,其本质为一个servlet。
二,入参绑定对比
Struts2是基于类开发的,Struts2框架会自动把前台浏览器传入的参数自动绑定到类的成员变量中。考虑到多线程访问相同成员变量,Struts2默认为每个前台request创建一个独立的Action对象。
Struts2+Spring模式,如果Action是通过spring定义的单例bean,在多线程场景下,不能直接使用类成员变量,需要实时从request对象中获取浏览器入参。
SpringMVC是基于方法开发的,前台浏览器传入的参数会自动被SpringMVC框架绑定到controller中接收该请求的方法的形参上。
三,返回值绑定对比
Struts2 Action没有返回值,需要开发人员手动把处理结果写入到ServletRequest或ServletResponse对象中
SpringMVC Controller中的方法定义支持ModelAndView, Model, ModelMap, Map,View, String, void等多种返回值类型。SpringMVC框架自动对这些类型的返回值进行后续处理。
总结:
通过以上分析,我们可以发现SpringMVC比Struts2功能更强大,使用也更简单。尤其在Spring被业界广泛作为java开发首选框架的今天,其与Spring的强绑定不仅没有限制其灵活性,反而减少了很多兼容性问题。
相反,Struts2对Spring没有依赖关系,没有spring的世界里,其依旧可以生存。而且Struts2对Web应用程序的切入面小于SpringMVC(一个Web应用程序可以有多个filter,但只能有一个servlet),降低了其与Web应用程序本身的耦合性。