你对springmvc的理解和struts2的区别

struts2和springmvc区别? - 知乎119被浏览27611分享邀请回答129 条评论分享收藏感谢收起Struts与Spring MVC的比较 - sky-net - ITeye博客
博客分类:
前段时间与一名同事一起讨论起了spring mvc与struts,今天查看了相应的资料,,对其作了总结:
一,Struts2
1,每次请求(request)都会实例化一个控制类(Action),因为Model存在与Action中,即action是有状态的,所以每次请求都要实例化,而且struts2的设计者认为在强大的垃圾收集器下,用完就扔,并不会影响性能问题,而且还可以保证线程的安全问题.
2,自从struts2之后,里面的设计除了action之外,大部分功能都围绕着拦截器设计,如果称我们平常的逻辑为横性思维的话,拦截器提供了纵向思维扩展,在我们执行action时,可以任意提供其他的应用,有点像aop的味道....
3,至于struts2提供了很丰富的界面功能,,这点我觉的没必要比较,因为在大多数应用开发中,,大多数人在界面上都运用其他的第三方如jstl或者extjs等等...这个不作优势比较
4,稍微看了下源码,使用了代理(ActionProxy)以及反射机制进行(dispatch),有些人说这样的代理是最损耗性能,,,如上面的设计者所说每次都创建一个实例没事,更何况这个代理呢,,,在java企业应用时,大部分可以就架构而去性能..
二,spring mvc
1,也有提供拦截器,,但是提供的并没有sturts2完全以及强大
2,spring提供了annotation的注释,使我们更少的去配置xml,而且灵活度非常强,使开发起来更加便利
3,spring 提供的handleAdapter,可使servlet或者其他自己实现的接口替换进来,相当灵活
4,spring提供的mapping,action,view(jsp,velocity等),根据需要可以实现最大限度的灵活性
结:本人认为,综合了上述的内容,,
一个团队中决定使用哪种框架开发,应该取决于团队对某种框架的了解程度,,达到更高效的开发才最合适,,没有最好的框架,只有最适合的框架...
-----------------------------------------------------------------------------------------------------------
综上只是本人作的一些比较,,,如有错误可以提出指正.....
浏览 19120
论坛回复 /
(27 / 15094)
lzmhehe 写道zt 写道Struts2的零配置也是Struts2的一大亮点,只是用Struts2零配置的人不太多而已.
springmvc也可以达到
关键springmvc的性能比struts2的好
我没发现Spring 3 MVC可以做到零配置,Spring 3 MVC中,每个控制器类的每个方法,都必须使用注解写上此控制器所对应的URL,并且需要在方法内指定本方法所对应的视图文件(jsp.....)的路径,这本身就是一种配置,而且这种注解配置,是分散在各个类里面的,并不集中,如果你想修改一个URL,你必须找到其所对应的控制器类,修改其注解,最关键的是,因为Spring 3 MVC没有使用“约定大于配置”的理念,控制器类和视图文件的路径是可以随便放的,如果一个里的开发人员,对包路径的命名不规范,对视图文件的存放也懒惰省事,随处堆放,这样你如果想找一个URL所对应的控制器类和视图文件,是极其困难的,比如:
URL是:/app/friends/fid/6986
那么,这个URL所对应的视图文件和控制器类在哪里,你能看出来么?
如果你使用Struts2约定大于配置(struts2-convention-plugin-2-2-1.jar插件)的开发模式,上面的URL是这样:/app/friends.action?fid=6986
你可以直接找到action类和jsp页面:
Action类路径:StrutsAction起始路径.app.FriendsAction.java
jsp页面路径:视图起始文件夹/app/friends.jsp
这样不是一目了然么?
如果你说Spring 3 MVC 对REST URL支持得天衣无缝,对搜索引擎友好,
那么,如果我的应用是局域网应用,根本就不发布到互联网上,所以无所谓搜索引擎优化不优化。
Spring 3 MVC的性能可能是一个优势。
我最不喜欢Spring 3 MVC的地方,是它不能做到“约定大于配置”,给开发人员的自由度太高,如果遇上一个懒惰的程序员,会把整个项目搞得乌七八糟,文件一个放在昆仑山,另一个放在海南岛,让整个项目根本就无法被维护,很难控制。
在我认为上,配置只是一件小事,特别是annotation的配置,,那种一点好处都没有,反璞归真的感觉,也像楼上说的很难查找,,,重点是其性能优些,而且在controller,handle mapping,还有view上,各个模块上的扩展都很强,,况且在ssh上,在已经使用spring的基础上,何必再引进struts....
zt 写道Struts2的零配置也是Struts2的一大亮点,只是用Struts2零配置的人不太多而已.
springmvc也可以达到
关键springmvc的性能比struts2的好
我没发现Spring 3 MVC可以做到零配置,Spring 3 MVC中,每个控制器类的每个方法,都必须使用注解写上此控制器所对应的URL,并且需要在方法内指定本方法所对应的视图文件(jsp.....)的路径,这本身就是一种配置,而且这种注解配置,是分散在各个类里面的,并不集中,如果你想修改一个URL,你必须找到其所对应的控制器类,修改其注解,最关键的是,因为Spring 3 MVC没有使用“约定大于配置”的理念,控制器类和视图文件的路径是可以随便放的,如果一个懒惰的开发人员,对包路径的命名不规范,对视图文件的存放也懒惰省事,随处堆放,这样你如果想找一个URL所对应的控制器类和视图文件,是极其困难的,比如:
URL是:/app/friends/fid/6986
那么,这个URL所对应的视图文件和控制器类在哪里,你能看出来么?
如果你使用Struts2约定大于配置(struts2-convention-plugin-2-2-1.jar插件)的开发模式,上面的URL是这样:/app/friends.action?fid=6986
你可以直接找到action类和jsp页面:
Action类路径:StrutsAction起始路径.app.FriendsAction.java
jsp页面路径:视图起始文件夹/app/friends.jsp
这样不是一目了然么?
如果你说Spring 3 MVC 对REST URL支持得天衣无缝,对搜索引擎友好,
那么,如果我的应用是局域网应用,根本就不发布到互联网上,所以无所谓搜索引擎优化不优化。
Spring 3 MVC的性能可能是一个优势。
我最不喜欢Spring 3 MVC的地方,是它不能做到“约定大于配置”,给开发人员的自由度太高,如果遇上一个懒惰的程序员,会把整个项目搞得乌七八糟,文件一个放在昆仑山,另一个放在海南岛,让整个项目根本就无法被维护,很难控制,这是一个致命的弱点。
我遇到的程序员,99%都是写代码非常邋遢,文件存放位置和类命名,都是邋遢到一定程度,比如像Spring 3 MVC的一个控制器类,他能给你这样命名和存放:
shiyan.zheshishiyan.kongzhiqi.hi123.java
如果一个项目组中,99%的人是这种习惯,请问作为项目负责人,你如何在以后维护这个项目?
--------------------------------------------------------------------------
而如果使用Struts2的“约定大于配置”模式,起码项目架构师能够硬性规定Action类的起始包路径和jsp页的存放文件夹路径,如果你的命名不规范,存放路径不在指定的包下,不和视图文件对应,那么你做的模块根本就运行不起来,这样强制的硬性约束,逼得那些懒惰的程序员把 haha.okla.chenggong.java
这样的习惯改掉
一直在使用struts2。
这个帖子从第一页看到最后,也没有看到Spring 3 mvc有哪些决定性优势。
至于REST式的URL,我想问的是:它有什么优势?
如果你说“对搜索引擎友好”,那么,如果我的项目是内网使用,根本不会发布到互联网上,REST URL对搜索引擎友好的优点,还有什么意义?
spring mvc需要对每个方法,使用注解定义方法所对应的URL,也需要在方法中指定URL所绑定的视图文件路径,这些在struts2中都可以使用struts2-convention-plugin-2-2-1.jar插件,以“约定大于配置”的方式来绑定,不需要额外的xml配置,也不需要注解来“隐形配置”【当然,如果你有复杂的跳转需求,你也可以在action类中,使用@Results({@Result(name = "toInfoList", location = "info-list.action?viewType=Common", type = "redirectAction")})这样的注解,定义action的跳转url】,大大节省了时间,而且强制约束了视图文件和action类的路径,使得视图文件和action类的路径更加集中、命名更加规范规范。
但是Spring 3 MVC,除非你自己强力约束自己,否则视图文件可以存放在文件夹内的任何层次内,这样就会给开发者“杂乱无章地存放试图文件”提供温床。
而且,Spring 3 MVC 控制器的方法参数,既可以是和Url参数对应的参数,也可以是HttpServletRequest类的对象request,还可以是实体类的对象,还要考虑同一个URL,如果method=RequestMethod.GET会对应一个方法,如果method=RequestMethod.PUT,又对应另一个方法,还要考虑方法的@RequestMapping注解内,有没有使用类似“params = "viewType=showUri“这样的参数定义,URL有没有传递这个参数过来,如果传递了会映射到这个方法上,如果没有传递则不能映射到这个方法上,诸如此类,总体感觉就是:“Spring 3 MVC”杂乱无章,给开发者的自由度太大,容易让懒惰的程序员把程序搞得乌七八糟,当然,如果是一个写程序非常规范的程序员,严格约束自己的开发风格,命名规范上严格约束自己,这样的程序员来使用Spring 3 MVC,也能做到“井然有序”,但毕竟Spring 3 MVC给了开发者太多的自由度,为懒惰的程序员提供了创造“杂乱无章的程序”的温床。
批评了Spring 3 mvc之后,称赞一下它比较好的地方,对json和xml的支持比较好,这样,使用一些JavaScript树的时候,树的数据源就不用使用Servlet来提供了。
我觉得Spring 3 MVC如果不采用“约定大于配置”的方式,使用“类路径 + 方法名” 对应 “约定的URL” ,对应“约定路径的视图文件”这种方式的话,对于struts2,它是没有什么优势的。
Struts2的零配置也是Struts2的一大亮点,只是用Struts2零配置的人不太多而已.
springmvc也可以达到
关键springmvc的性能比struts2的好
chrisx 写道关于线程安全问题,不管是哪种MVC框架,与Spring集成之后,都得配置成非单例模式加载,即scope="prototype",这样即可保证线程安全,每次必实例化
struts1中的action是线程安全的,不必设置非单例模式,而且struts2不是支持通配符来配置文件吗?这样也可以启动减少配置文件的目的
spring里面的prototype模式,不也是一样。。。
chrisx 写道关于线程安全问题,不管是哪种MVC框架,与Spring集成之后,都得配置成非单例模式加载,即scope="prototype",这样即可保证线程安全,每次必实例化
struts1中的action是线程安全的,不必设置非单例模式,而且struts2不是支持通配符来配置文件吗?这样也可以启动减少配置文件的目的
struts2的action是线程安全的 因为每个请求都会创建一个实例
chrisx 写道关于线程安全问题,不管是哪种MVC框架,与Spring集成之后,都得配置成非单例模式加载,即scope="prototype",这样即可保证线程安全,每次必实例化
struts1中的action是线程安全的,不必设置非单例模式,而且struts2不是支持通配符来配置文件吗?这样也可以启动减少配置文件的目的
最近好好研究了一下spring mvc,感觉spring更好一些,你所说的线程安全,或是通配符,,spring中都有,而且还提高了很强的扩展性,不管是mapping,或是controller还有view都很好用,,,,所以在以后的使用中,可能会去掉struts而改用spring,,,,,
关于线程安全问题,不管是哪种MVC框架,与Spring集成之后,都得配置成非单例模式加载,即scope="prototype",这样即可保证线程安全,每次必实例化
struts1中的action是线程安全的,不必设置非单例模式,而且struts2不是支持通配符来配置文件吗?这样也可以启动减少配置文件的目的
感觉上spring MVC比struts2更MVC
这个观点,不赞同,,,,
因为spring mvc依赖于ioc实现的,,struts2才是真正意义上的mvc
一直用spring mvc 想学学struts2 不过一直没时间
我正好相反
& 上一页 1
wu_quanyin
浏览: 148724 次
来自: 福建省
顶 很有帮助,感谢楼主,好人一生平安
代码有错误,我戳。
小鸟学习了!
写的不错! 弱弱说一句 建议使用URL二次转码, 这样可以避免 ...struts2和springMVC的比较(超详细)-五星文库
免费文档下载
struts2和springMVC的比较(超详细)
导读:这些年来Struts2在技术革新上的作为似乎步子就迈得比较小,把这张图放在这里,我是想说SpringMVC和Struts2真的是不一样的,虽然在都有着核心分发器等相同的功能组件(这些由MVC模式本身决定的)。为什么SpringMVC会赢得最后的胜利呢?谈几点我自己的看法:第一、MVC框架的出现是为了将URL从HTTP的世界中映射到JAVA世界中,这是MVC框架的核心功能。而在URL这一点Spr把这张图放在这里,我是想说SpringMVC和Struts2真的是不一样的,虽然在都有着核心分发器等相同的功能组件(这些由MVC模式本身决定的)。
为什么SpringMVC会赢得最后的胜利呢?谈几点我自己的看法:
第一、MVC框架的出现是为了将URL从HTTP的世界中映射到JAVA世界中,这是MVC框架的核心功能。而在URL这一点SpringMVC无疑更加优雅。
第二、从设计实现角度来说,我觉得SpringMVC更加清晰。即使我们去对比Struts2的原理图和SpringMVC的类图,它依然很让人困惑,远没有SpringMVC更加直观:
SpringMVC设计思路:将整个处理流程规范化,并把每一个处理步骤分派到不同的组件中进行处理。 这个方案实际上涉及到两个方面: l 处理流程规范化 ―― 将处理流程划分为若干个步骤(任务),并使用一条明确的逻辑主线将所有的步骤串联起来 l 处理流程组件化 ―― 将处理流程中的每一个步骤(任务)都定义为接口,并为每个接口赋予不同的实现模式 处理流程规范化是目的,对于处理过程的步骤划分和流程定义则是手段。因而处理流程规范化的首要内容就是考虑一个通用的Servlet响应程序大致应该包含的逻辑步骤: l 步骤1―― 对Http请求进行初步处理,查找与之对应的Controller处理类(方法)
――HandlerMapping l 步骤2―― 调用相应的Controller处理类(方法)完成业务逻辑
――HandlerAdapter l 步骤3―― 对Controller处理类(方法)调用时可能发生的异常进行处理
――HandlerExceptionResolver l 步骤4―― 根据Controller处理类(方法)的调用结果,进行Http响应处理
――ViewResolver
正是这基于组件、接口的设计,支持了SpringMVC的另一个特性:行为的可扩展性。
第三、设计原则更加明朗。
【Open for extension /closed for modification】 这条重要的设计原则被写在了Spring官方的reference中SpringMVC章节的起始段: A key design principle in SpringWeb MVC and in Spring in general is the “Open for extension, closed for modification” principle. 并且重点很好地体现在SpringMVC的实现当中,可以扩展,但却不能改变。我曾经扩展过Spring的IOC、AOP功能,这一点SpringMVC应该和Spring一脉相承。
第四、组件化的设计方案和特定的设计原则让SpringMVC形散神聚。 ? ? 神 ―― SpringMVC总是沿着一条固定的逻辑主线运行 形 ―― SpringMVC却拥有多种不同的行为模式 SpringMVC是一个基于组件的开发框架,组件的不同实现体系构成了“形”;组件的逻辑串联构成了“神”。因此,“形散神不散”: SpringMVC的逻辑主线始终不变,而行为模式却可以多种多样。 第五、更加贴合Web发展的趋势,这个更加虚了,不再展开说这个 问题了。
第六、技术上的放缓导致了程序员对Struts2失去了热情,导致SpringMVC依靠自身的努力和Spring的口碑,逐渐显露了自身的优势和特点。
为什么SpringMVC会赢得最后的胜利呢?最后,我们不妨想一想Struts2是怎样流行起来的! 我自己是从Struts1用过来的,后来Struts1的问题很明显了,开源社区出现了很多的MVC框架,最为突出的是Webwork2。 Webwork2探索了一条与传统Servlet模型不同的解决方案,逐渐被大家熟识和理解,不断发展并得到了广大程序员的认可。它以优秀的设计思想和灵活的实现,吸引了大批的Web层开发人员投入它的 怀抱。 Apache社区与Opensymphony宣布未来的Struts项目将与Webwork2项目合并,并联合推出Struts2。 Struts2能够在一个相当长的时间段内占据开发市场主导地位的重要原因在于其技术上的领先优势。而这一技术上的领先优势,突出表现为对Controller的彻底改造: public class UserController {
private User user
public String execute() {
// 这里加入业务逻辑代码
从上面的代码中,我们可以看到Webwork2 /Struts2对于Controller最大的改造有两点: ? 在Controller中彻底杜绝引入HttpServletRequest或者HttpServletResponse这样的原生Servlet对象。 ? 将请求参数和响应数据都从响应方法中剥离到了Controller中的属性变量。 这两大改造被看作是框架的神来之笔。因为通过这一改造,整个Controller类彻底与Web容器解耦,可以方便地进行单元测试。而摆脱了Servlet束缚的Controller,也为整个编程模型赋予了全新的定义。从引入新的编程元素的角度来说,Webwork2 / Struts2无疑也是成功的。因为在传统Servlet模式中的禁地Controller中的属性变量被合理利用了起来作为请求处理过程中的数据部分。这样的改造不仅使得表达式引擎能够得到最大限度的发挥,同时使得整个Controller看起来更像是一个POJO。因而,这种表现形态被笔者冠以的名称 是:POJO实现模式。POJO实现模式是一种具有革命性意义的模式,因为它能够把解耦合这样一个观点发挥到极致。从面向对象的角度来看,POJO模式无疑也是所有程序员所追求的一个目标。这也就是Webwork2 /Struts2那么多年来经久不衰的一个重要原因。 所以,我们看到第一条原因是Struts2依靠技术上的革新赢得了程序员的青睐。但是,这些年来Struts2在技术革新上的作为似乎步子就迈得比较小。我们可以看到,在JDK1.5普及之后,Annotation作为一种新兴的Java语法,逐渐 被大家熟知和应用。这一点上SpringMVC紧跟了时代的潮流,直接用于请求-响应的映射。而Struts2却迟迟无法在单一配置源的问题上形成突破。 当然,这只是技术革新上的一个简单的例子,其他的例子还有很多。 至少给人的感觉是这样的。在这一点上Struts并不是很沾光,因为Spring的口碑和影响力也客观程度上加深了大家对SpirngMVC是技术领导者的印象。
包含总结汇报、IT计算机、资格考试、考试资料、教学教材、word文档以及struts2和springMVC的比较(超详细)等内容。
相关内容搜索&&&&&&&&&&&&&&&&&&
posts - 10,comments - 0,trackbacks - 0
学习学习。
1、Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上SpringMVC就容易实现restful url,而struts2的架构实现起来要费劲,因为Struts2中Action的一个方法可以对应一个url,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了。
2、由上边原因,SpringMVC的方法之间基本上独立的,独享request response数据,请求数据通过参数获取,处理结果通过ModelMap交回给框架,方法之间不共享变量,而Struts2搞的就比较乱,虽然方法之间也是独立的,但其所有Action变量是共享的,这不会影响程序运行,却给我们编码 读程序时带来麻烦,每次来了请求就创建一个Action,一个Action对象对应一个request上下文。
3、由于Struts2需要针对每个request进行封装,把request,session等servlet生命周期的变量封装成一个一个Map,供给每个Action使用,并保证线程安全,所以在原则上,是比较耗费内存的。
4、&拦截器实现机制上,Struts2有以自己的interceptor机制,SpringMVC用的是独立的AOP方式,这样导致Struts2的配置文件量还是比SpringMVC大。
5、SpringMVC的入口是servlet,而Struts2是filter(这里要指出,filter和servlet是不同的。以前认为filter是servlet的一种特殊),这就导致了二者的机制不同,这里就牵涉到servlet和filter的区别了。
6、SpringMVC集成了Ajax,使用非常方便,只需一个注解@ResponseBody就可以实现,然后直接返回响应文本即可,而Struts2拦截器集成了Ajax,在Action中处理时一般必须安装插件或者自己写代码集成进去,使用起来也相对不方便。
7、SpringMVC验证支持JSR303,处理起来相对更加灵活方便,而Struts2验证比较繁琐,感觉太烦乱。
8、springMVC和Spring是无缝的。从这个项目的管理和安全上也比Struts2高(当然Struts2也可以通过不同的目录结构和相关配置做到SpringMVC一样的效果,但是需要xml配置的地方不少)。
9、&设计思想上,Struts2更加符合OOP的编程思想, SpringMVC就比较谨慎,在servlet上扩展。
10、SpringMVC开发效率和性能高于Struts2。
11、SpringMVC可以认为已经<span style="color: #ff%零配置。
原文链接:http://blog.csdn.net/chenleixing/article/details/
阅读(...) 评论()struts2和springmvc区别? - 知乎119被浏览27611分享邀请回答2添加评论分享收藏感谢收起}

我要回帖

更多关于 spring mvc原理 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信