Struts1、Struts2和SpringMVC剖析【转载】
前段框架用了不少,今天就来做个总结。网上关于Struts1、Struts2、SpringMVC的文章有很多,这里的内容就是基于它们,来做个比较。
这三个框架是按照上面的顺序,依次出现的,它们都是对MVC模式的实现。为什么会出现这三个、甚至更多的MVC框架呢?他们都是为了将URL世界映射到Java世界。尽管它们它们内部的实现思路不同,有着各自的优缺点,但是它们都做到了个自己的使用目的。
历史介绍
大多Web应用程序,都是运行在HTTP上的。HTTP协议是一系列无状态的文本传输协议。无状态的协议不记录收到的多个请求之间的关系,也就是说服务器与相应客户端如何对应起来,是一个问题。此外,HTTP是基于文本的。如何将基于文本的技术与强类型的Java匹配起来,这需要大量的数据绑定工作。
HTTP协议原本就不是为了满足Web应用程序开发人员的需求而设计的,它们是为请求和处理静态HTML文档而设计的。
Java Servlet API能够解决这些问题,Servlet通过一套面向对象的抽象直接封装客户/服务器交互的细节。我们不用自己解析HTTP请求,而是处理一个包装好的Java对象。
ava程序员可以根据HTTP客户/服务器通信以直观的面向对象的抽象方式,编写HTTP服务器代码。Servlet API的核心对象是Servlet、请求和相应。Servlet是一个单例的Java对象。
但是使用Servlet编程,就需要我们大量的“重复创新的轮子”。比如请求参数到Java类型的数据绑定、数据验证、界面渲染等,都需要手动编写。
这三个框架,就基于此,做了封装,简化开发。下面我们就来看看它们的区别。
struts1
现在Strut1使用的越来越少了,不过还是有一些老项目在使用struts1,由于我也使用过该框架,也拿它来做个比较:
1、服务器启动,Web应用启动时就会加载web.xml初始化actionServlet和记载struts配置文件(struts-config.xml),读配置信息到内存中,供以后action调用
2、用户通过客户端向服务器发出一个请求,http://localhost:8080/struts_login/login.do
3、tomcat会创建出HttpRequest和HttpResponse实例,并根据用户的Method请求方式,调用中央控制器的doGet或者doPost方法;
我们已经在web.xml配置了所有符合某特定格式的请求都将由struts指定的Servlet来处理。比如:只要是以.do结尾的请求(*.do)都由 org.apache.struts.action.ActionServlet来对其进行处理.ActionServlet会拿到用户的请求,并且去分析这个URL,ActionServlet中央控制器会截下 /login. 截下来之后,它是为了去struts-config.xml这个配置文件里面找标签path属性的值等于所截部分的那个 Action,将Action标签里面的信息放在ActionMapping里面。
4、根据ActionMapping中的name名称查找ActionForm,如果配置了ActionForm,那么就到request或session中查找,如果在request或session中存在已经创建的ActionForm,那么将返回;如果不存在,那么会根据ActionForm的完成路径采用反射进行创建,再将创建好的ActionForm放到reqeust或session中
5、首先执行ActionForm中的reset方法进行重置,然后得到表单中所有输入域的name名称,再调用request.getParameterValues(),根据name名称得到相应的值,最后将表单中的数据全部放到一个map中,map中的key为表单输入域的名称,map的value位表单输入域的值(字符串数组),接下来调用一个第三方组件BeanUtils,将Map中的值,根据ActionForm中的setter方法设置到ActionForm上。
6、根据Action的完成类名称到Map中查找,如果存在就在返回Action对象,否则根据Action类的完整名称采用反射去创建,再将创建好的Action放到Map中。所以struts1的Action是单实例的,存在线程安全问题。
找到对应的action之后,ActionServlet会把表单提交的数据给存放(生成对应调用 set/get方法)到struts-config中相应的action标签的name属性值指定的actionform类中(若有, [actionform的子类,并且在form-bean标签中配置了,若要进行数据验证可以在actionform中覆盖validate方法,推荐使用js,减轻服务器负担]).同时把actionform和当前HttpServletrequest 对象注入到代调用的action方法中.
7、执行用户自定义的Action中的Execute方法,将ActionMapping,ActionForm,request,response传递过去,将ActionForward返回给ActionServlet。
8、根据返回的ActionForward完成转向,ActionForward对象根据此action配置的匹配name进而调转到对应path的jsp页面上。
struts2
是基于Filter拦截实现的,实现图如下:
访问过程如下:
1、Tomcat服务器启动,Web应用启动时,首先会加载web.xml文件,然后初始化Filter过滤器,初始化org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter监听程序。这时,会把Struts2的配置文件读到内存里面(如果是Struts2与Spring集成,会是Listner先启动,Spring完成Struts2的acion的创建,不耽误Struts2文件的初始化)供以后Action调用;
2、用户访问浏览器,发送请求,指向Servlet容器。
3、容器tomcat会创建出HttpRequest和HttpResponse实例;并通过web.xml文件映射请求,截取并获取控制器的名称。
4、然后容器调用StrutsPrePareAndExecutionFilter,StrutsPrepareAndExecuteFilter通过ActionMapper来决定获取Action的信息
5、如果ActionMapper决定需要调用某个Action,StrutsPrepareAndExecuteFilter把请求的处理交给Action的代理ActionProxy;
6、控制器调用ActionProxy
7、ActionProxy通过ConfigurationManager读取strut.xml配置文件来获取action和interceptor的信息,找到需要调用的Action类;
8、ActionProxy把request请求传递给ActionInvocation对象;
9、ActionInvocation实例使用命令模式来调用,依次调用action和interceptor;
10、根据action的配置信息,产生result,result信息返回给actionInvocation。
11、返回结果给客户端。
特点:
1、线程模式,每一次请求都会产生一个新的实例处理请求,多线程环境下没有数据同步问题;
2、引入数据的依赖注入【页面表单数据注入到Action的注入、实例对象的注入,通过set方法注入】
3、基于AOP的拦截器,可以在每次请求前后灵活控制;
4、配置文件支持表单式,基于约定大于配置,简化配置;
5、内置以插件形式支持ajax如dojo,支持多种末班展示jsp、freemarker,veiocity等。
SpringMVC
SpringMVC是基于Servlet拦截实现的,主要由前端控制器(DispatcherServlet)、映射处理器(HandlerMapping)、适配器(HandlerAdapter)、拦截器(HandlerInterceptor)、控制器(Controller)、视图解析器(ViewResolver)、视图(View)这几部分构成。下面看SpringMVC的工作流程。
漏洞,但是Struts2,和SpringMVC仍然是非常流行的MVC框架,而Strut1尽管效率最高,但现在使用的越来越少。所以,我们来看看它们的异同。
这三个框架中,Struts1的效率仅次于JSP,三者当中效率最高。但是Struts1内部是面向抽象类编程,而不是面向接口编程的。Struts2提供了一个名为ActionSupport的基类,虽然不是必须的,但是要想使用Struts2的功能,基本上都会继承它。SpringMVC是面向接口编程,需要实现一个接口(配置文件时)。
Struts1的入口点是Servlet,Struts2的入口点是Filter,SpringMVC入口点是Servlet;
Struts2是类级别的拦截,每个请求创建一个action,然后通过调用setter方法把Request中的数据注入;SpringMVC是基于方法的拦截,一个方法对应一个Request上下文,而方法同时又跟一个URL对应;
Struts2的类属性被所有方法共享,这就无法用注解标识其所属方法了,方法之间独立,但是所有Action变量是共享的。SpringMVC的方法之间基本独立,共享Request数据,请求数据通过参数获取,处理结果通过ModelMap交回给框架,方法之间不共享变量。
interceptor实现机制:struts2有自己的拦截器机制,SpringMVC用的是独立的AOP方式。所以,尽管Spring的配置能够继承,但是配置量仍大于SpringMVC;
SpringMVC的配置是基于IOC容器的,一方面方便SpringMVC进行扩展和增强,另一方面有利于与Spring整合;而Struts2与Spring的整合,需要Spring提供了第三方包。
Struts2里面可以没有HttpServletRequest和HttpServletResponse,只有getter、setter或ActionContext里的数据,这样就会使Action比较独立。整个web与Action无关,这个action可以在任何环境下独立运行,也就是说,它可以最大限度的被重用。而SpringMVC不像Struts2那样隐藏了HttpServletRequest和HttpServletResponse,而是将它们做为了形参传入控制器的方法中。
Struts1的Action与SpringMVC的Controller一样,都是单例的,不是线程安全的。这就意味着,每个Request请求,系统都会用原有的instance去处理。这虽然减少了对象的创建和垃圾收集的时间,但是处理多线程调用时,Controller不是线程安全的;而Struts2是线程安全的。
本文转载自:http://www.2cto.com/kf/201410/345641.html
Struts1、Struts2和SpringMVC剖析【转载】的更多相关文章
- (转)聊聊Servlet、Struts1、Struts2以及SpringMvc中的线程安全
前言 很多初学者,甚至是工作1-3年的小伙伴们都可能弄不明白?servlet Struts1 Struts2 springmvc 哪些是单例,哪些是多例,哪些是线程安全? 在谈这个话题之前,我们先了解 ...
- struts1,struts2,springMVC终极对比
最近做项目用到了struts2,之前一直是用struts1和springMVC.感觉到了struts2从很大程度上和这两个还是有很大区别的,所以今天搜集了些资料,给他们做一下对比. Struts1官方 ...
- 聊聊Servlet、Struts1、Struts2以及SpringMvc中的线程安全
前言 很多初学者,甚至是工作1-3年的小伙伴们都可能弄不明白?servlet Struts1 Struts2 springmvc 哪些是单例,哪些是多例,哪些是线程安全? 在谈这个话题之前,我们先了解 ...
- struts1和struts2和springMVC的区别和介绍
MVC是web开发常用的模式,M即模型层(Model):主要由javabean来实现.V即视图层(View):主要由jsp.velocity.freemarker等.C即控制层(Controller) ...
- 为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?
今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制层的技术框架由struts2迁移到springMVC,我突然有了一个新的疑 ...
- 转: 为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?
from: https://github.com/RubyLouvre/agate/issues/8 今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以 ...
- Struts2和SpringMVC简单配置以及区别总结
Struts2: struts 2 是一个基于MVC(mode-view-con)设计模式的Web应用框架,是由Struts1和WebWork两个经典框架发展而来的. 工作流程: 1客户端浏览器发出H ...
- Servlet、Struts2、SpringMVC执行流程
Servlet 有以下四个阶段: 1.加载和实例化 Servlet容器负责加载和实例化Servlet. 当Servlet容器启动时,或者在容器检测到需要这个Servlet来响应第一个请求时,创建Ser ...
- Struts2和SpringMVC的区别
简单谈一下Struts2和SpringMVC的区别,文章有所引用知乎所对应的答案数据,和所查看的其余资料数据,进行一个简单的汇总,后续查看时使用: 知乎解释链接为:https://www.zhihu. ...
随机推荐
- JS关闭窗口或JS关闭页面的几种代码
//JS定时自动关闭窗口 <script language="javascript"> <!-- function closewin(){ self.opener ...
- WebService学习笔记
WebService有什么用? 入门之前先简单介绍下WCF.在用WebService做开发时,很多人都不知道WCF和WebService之间的关系.实际上WCF包含了WebService,这是一个很强 ...
- QVW中实现日期区间的选择功能!
QV在日期的选择上不是很灵活,日期区段的选择可以在列表框中直接用鼠标拖拉区段,如果跨周期比较长了还是不是很方便啦. 下面介绍的方式是完全实现了起始日期的选择功能. 注:日期这个字段在抽取的时候一定要格 ...
- UITextField 对输入金额的约束
[2016/1/18更新] -- 五个人辛辛苦苦干了一年的项目终于上线了,今天有空看了一下正则表达式教程,然后开始rebuild之前的种种对字符串的约束,首先就从这个金额输入框开始吧,修改后的代码如下 ...
- JPEG 图
多媒体教程 - JPEG 图 JPEG 是在 Web 上使用的主要图像格式之一. 本文讲解 JPEG 图像的概念和特性. 理解图像格式 无论是 HTML 还是 XHTML 都没有规定图像的官方格式.然 ...
- Photon引擎开发实战(1)——Photon 简介
Photon简介 Photon是一套使用广泛的socket server引擎,服务端底层C++编写,客户端C#编写,跨多平台,收费,效率可观的一款引擎.实用上前有九城游戏(原魔兽世界代理),现在笔者发 ...
- 正则过滤html标签
var html = "<p>好好学习,<br>天天向上</p>"; var re=/<[^>]+>/g; var text ...
- 关于移动div的具体实现(js)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- x的平方根
class Solution { public: /** * @param x: An integer * @return: The sqrt of x */ int getResult(long s ...
- power designer中查看表sql去掉字段属性双引号设置
把Database → Edit Current DBMS → General → Script → Sql → Format → CaseSensitivityUsingQuote设置为NO