`
xly_971223
  • 浏览: 1264967 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

spring3mvc与struts2比较

阅读更多
项目刚刚换了web层框架,放弃了struts2改用spring3mvc
当初还框架的时候目的比较单纯---springmvc支持rest,小生对restful url由衷的喜欢
不用不知道 一用就发现开发效率确实比struts2高

我们用struts2时采用的传统的配置文件的方式,并没有使用传说中的0配置
spring3 mvc可以认为已经100%零配置了(除了配置springmvc-servlet.xml外)

比较了一下strus2与spring3 mvc的差别

============================================
struts2框架是类级别的拦截,每次来了请求就创建一个Action,然后调用setter getter方法把request中的数据注入
struts2实际上是通过setter getter方法与request打交道的
struts2中,一个Action对象对应一个request上下文

spring3 mvc不同,spring3mvc是方法级别的拦截,拦截到方法后根据参数上的注解,把request数据注入进去
在spring3mvc中,一个方法对应一个request上下文

好了 我们来整理一下
struts2是类级别的拦截, 一个类对应一个request上下文,
springmvc是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应
所以说从架构本身上 spring3 mvc就容易实现restful url
而struts2的架构实现起来要费劲
因为struts2 action的一个方法可以对应一个url
而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了

===================================
spring3mvc的方法之间基本上独立的,独享request response数据
请求数据通过参数获取,处理结果通过ModelMap交回给框架
方法之间不共享变量

而struts2搞的就比较乱,虽然方法之间也是独立的,但其所有Action变量是共享的
这不会影响程序运行,却给我们编码 读程序时带来麻烦

====================================
spring3 mvc的验证也是一个亮点,支持JSR303
处理ajax的请求更是方便 只需一个注解@ResponseBody ,然后直接返回响应文本即可

附上一段代码
	@RequestMapping(value="/whitelists")
	public String index(ModelMap map){
		Account account = accountManager.getByDigitId(SecurityContextHolder.get().getDigitId()) ;
		List<Group> groupList = groupManager.findAllGroup(account.getId()) ;
		map.put("account", account);
		map.put("groupList", groupList);
		return "/group/group-index" ;
	}
        //@ResponseBody ajax响应  
	@RequestMapping(value="/whitelist/{whiteListId}/del")
	@ResponseBody  
	public String delete(@PathVariable Integer whiteListId){
		whiteListManager.deleteWhiteList(whiteListId) ;
		return "success" ;
	}

分享到:
评论
206 楼 guojigjkill 2014-05-05  
111
205 楼 victorming 2011-03-26  
chrislee1982 写道
struts同样可以做方法上的拦截,这样配置就可以了
<action name="login" class="xx.LoginAction" method="login">
   <interceptor....../><!-- interceptor A -->
   <result...../>
</action>

<action name="logout" class="xx.LoginAction" method="logout">
   <interceptor....../> ><!-- interceptor B -->
   <result...../>
</action>

我赞成okayeye的意见,在富客户端的情况下,springMVC和struts2的流转控制可以放到客户端来做,比如Flex,服务器端尽量只做数据读写和服务集成,这样可以获取更高的并发流量
204 楼 chrislee1982 2011-03-18  
struts同样可以做方法上的拦截,这样配置就可以了
<action name="login" class="xx.LoginAction" method="login">
   <interceptor....../><!-- interceptor A -->
   <result...../>
</action>

<action name="logout" class="xx.LoginAction" method="logout">
   <interceptor....../> ><!-- interceptor B -->
   <result...../>
</action>
203 楼 george 2011-02-17  
downpour 写道
george 写道
downpour 写道
shiren1118 写道
你觉得这有啥可炫耀的吗?spring的多view解析实现这个跟玩一样

看看这兄弟的帖子吧http://www.iteye.com/topic/748006


帅哥,咱不再做框架之争了好么?SpringMVC与Struts2都是优秀的Web层框架。框架的优劣,是程序员自身的哲学选择。有些东西,我说是缺点,你却说是优点,这是永远也争不清楚的。

在这里我需要给那些使用SpringMVC的同学提个醒。Annotation进行UrlMapping在大型的web应用中的可维护性是值得质疑的。在团队开发中,这一问题显得格外严重。所以,请不要神化SpringMVC的某些功能。谢谢。

顶,支持。

这点我深有体会,Spring MVC 3.0.5 留给开发者的自由度太大了,让开发者可以在一个controller 里,在class上和method上自由定义url,这样的话,会造成同一个包路径下的controller 映射到任何层次级别的url上去,也会造成不同的包路径下的controller 映射到相同层次的url上去,甚至会出现多个controller 映射到同一个url,一句话概括就是:【杂乱无章】,这样的自由度泛滥,在大的项目中必定造成维护上的混乱,不要指望每个程序员都是命名规范,自觉遵循项目约定的“顺草”,基本上每个项目组都是“杂草丛生”。


这一点其实我在最早的讨论中就指出来了。SpringMVC的Annotation来指定URL Mapping的可维护性为0。

这里的本质问题在于Annotation和XML到底谁更加适合来做某种类型的配置。

当我们引入一个Annotation,实际上获得的好处在于我们可以在Java Code级别解决配置问题,但同时,我们也引入了其他的问题:

1) 引入了Annotation,就引入了对框架的强依赖,一个原本可以单独测试的东西,却必须放在容器中做集成测试。
2) 引入了Annotation,就将这个Annotation所代表的配置类型,分散到了不同的Java Code中。就像在一个沙地里面,我们要寻找散落在各处的黄豆,实际上是非常困难的。

当我们引入XML的时候,虽然我们引入的是一个额外的配置文件和额外的配置,但是我们却获得的统一的查找路径,可维护性得到了保证。

XML也不推荐大量使用,最好是使用约定,不按照约定来命名类和方法,根本就无法访问url,这样即减少了配置文件,又能很方便地找到URL所对应的控制器类,而且还能强迫那些“胡乱写类名、方法名”的“懒汉”把命名规范起来。
202 楼 downpour 2011-02-17  
george 写道
downpour 写道
shiren1118 写道
你觉得这有啥可炫耀的吗?spring的多view解析实现这个跟玩一样

看看这兄弟的帖子吧http://www.iteye.com/topic/748006


帅哥,咱不再做框架之争了好么?SpringMVC与Struts2都是优秀的Web层框架。框架的优劣,是程序员自身的哲学选择。有些东西,我说是缺点,你却说是优点,这是永远也争不清楚的。

在这里我需要给那些使用SpringMVC的同学提个醒。Annotation进行UrlMapping在大型的web应用中的可维护性是值得质疑的。在团队开发中,这一问题显得格外严重。所以,请不要神化SpringMVC的某些功能。谢谢。

顶,支持。

这点我深有体会,Spring MVC 3.0.5 留给开发者的自由度太大了,让开发者可以在一个controller 里,在class上和method上自由定义url,这样的话,会造成同一个包路径下的controller 映射到任何层次级别的url上去,也会造成不同的包路径下的controller 映射到相同层次的url上去,甚至会出现多个controller 映射到同一个url,一句话概括就是:【杂乱无章】,这样的自由度泛滥,在大的项目中必定造成维护上的混乱,不要指望每个程序员都是命名规范,自觉遵循项目约定的“顺草”,基本上每个项目组都是“杂草丛生”。


这一点其实我在最早的讨论中就指出来了。SpringMVC的Annotation来指定URL Mapping的可维护性为0。

这里的本质问题在于Annotation和XML到底谁更加适合来做某种类型的配置。

当我们引入一个Annotation,实际上获得的好处在于我们可以在Java Code级别解决配置问题,但同时,我们也引入了其他的问题:

1) 引入了Annotation,就引入了对框架的强依赖,一个原本可以单独测试的东西,却必须放在容器中做集成测试。
2) 引入了Annotation,就将这个Annotation所代表的配置类型,分散到了不同的Java Code中。就像在一个沙地里面,我们要寻找散落在各处的黄豆,实际上是非常困难的。

当我们引入XML的时候,虽然我们引入的是一个额外的配置文件和额外的配置,但是我们却获得的统一的查找路径,可维护性得到了保证。
201 楼 george 2011-02-16  
downpour 写道
shiren1118 写道
你觉得这有啥可炫耀的吗?spring的多view解析实现这个跟玩一样

看看这兄弟的帖子吧http://www.iteye.com/topic/748006


帅哥,咱不再做框架之争了好么?SpringMVC与Struts2都是优秀的Web层框架。框架的优劣,是程序员自身的哲学选择。有些东西,我说是缺点,你却说是优点,这是永远也争不清楚的。

在这里我需要给那些使用SpringMVC的同学提个醒。Annotation进行UrlMapping在大型的web应用中的可维护性是值得质疑的。在团队开发中,这一问题显得格外严重。所以,请不要神化SpringMVC的某些功能。谢谢。

顶,支持。

这点我深有体会,Spring MVC 3.0.5 留给开发者的自由度太大了,让开发者可以在一个controller 里,在class上和method上自由定义url,这样的话,会造成同一个包路径下的controller 映射到任何层次级别的url上去,也会造成不同的包路径下的controller 映射到相同层次的url上去,甚至会出现多个controller 映射到同一个url,一句话概括就是:【杂乱无章】,这样的自由度泛滥,在大的项目中必定造成维护上的混乱,不要指望每个程序员都是命名规范,自觉遵循项目约定的“顺草”,基本上每个项目组都是“杂草丛生”。
200 楼 yangfuchao418 2011-02-12  
一个破框架吵啥。俺都是手写
199 楼 xiaoyu 2011-01-25  
REST URL 不一定就搜索引擎友好, 这个要看哪个搜索引擎了。 如果是百度。。。。。 哎, 这个百度的新闻收录。就
198 楼 jarorwar 2011-01-25  
不知道在谈论什么,大家都吵起来了!
197 楼 jarorwar 2011-01-25  
downpour 写道
shiren1118 写道
你觉得这有啥可炫耀的吗?spring的多view解析实现这个跟玩一样

看看这兄弟的帖子吧http://www.iteye.com/topic/748006


帅哥,咱不再做框架之争了好么?SpringMVC与Struts2都是优秀的Web层框架。框架的优劣,是程序员自身的哲学选择。有些东西,我说是缺点,你却说是优点,这是永远也争不清楚的。

在这里我需要给那些使用SpringMVC的同学提个醒。Annotation进行UrlMapping在大型的web应用中的可维护性是值得质疑的。在团队开发中,这一问题显得格外严重。所以,请不要神化SpringMVC的某些功能。谢谢。



是的,如果没有源码,这个维护确实是问题,但是咱不可否认,Springmvc 开发起来快!struts2和SpringMVC都用过!
196 楼 jarorwar 2011-01-25  
oakeye 写道
还有就是中文问题  我只能复写那个StringHttpMessageConverter,然后把编码方式写成utf-8

我一般是自定义一个ajax试图处理器,分别用来返回纯文本,xml和json类型!
195 楼 george 2011-01-17  
一直在使用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,它是没有什么优势的。
194 楼 skyHuang 2010-12-23  
<p>使用中,, 确实比struts方便很多    lz分析的很到位<img src="http://dl.iteye.com/upload/attachment/374351/523ce437-572d-32e8-9d26-458299af6de3.jpg" alt="" width="741" height="330"></p>
193 楼 pengjj2 2010-12-23  
我就想问一下,springMVC3有没有解决嵌套对象的问题。。

让我可以这么写<input id="user.id" type="text"/>

model为role,role中嵌套user
192 楼 helloworldwyn 2010-12-09  
选择springmvc,感觉比struts开发效率高
191 楼 wenxiang_tune 2010-11-29  
我只能说,这个帖子真的很棒。。目前用struts2.2.1谢谢。。
190 楼 icewubin 2010-11-04  
glovebx 写道
icewubin 写道
rustlingwind 写道
icewubin 写道
rustlingwind 写道
wen66 写道
strut2和spring3的性能问题, 大家可以写个简单的例子, 然后用loadruner跑一下, 就知道性能的差别的, 这个就是属于谁用谁知道的东西.


我在项目里使用的是 struts2,至少用 visualvm 发现性能瓶颈绝不在 struts2,一般都是在 数据库io和其他网络io上。

而且,我目前的测试结果是,两台机器(16G内存,双路四核cpu,15000转硬盘,两年前的dell服务器),5个tomcat节点,1个nginx负载均衡,带有业务的用例很轻松就可以跑到 1万 多的 tps (业务用例要经过struts2 自定义拦截器,访问redis,访问 memcached,访问数据库,并提供只读事务)


struts2默认的拦截器不用的全部要去掉,经我们测试是影响性能的,当然我们的并发是超高的,能看出区别。


我想问一下,用ssh写的程序,1个应用服务器节点,每秒处理多少个请求才算是性能比较不错了?硬件上相对于目前大众化的服务器配置来说(16G内存,双路四核cpu,15000转硬盘),网络带宽不考虑。

我目前的项目要求 每秒要能够处理 24000 个并发请求(读取数据库的业务),我计划用1台server扛下来,但目前看来还差的远,唉。

你先不要考虑其他因素,你可以自己用纯servlet和struts2处理纯内存操作作性能对比,有点差距的。

一般认为Tomcat最高并发在300-400左右,综合经验。所以一台扛下24000个请求不可能的。

然后说数据库的问题,由于app这层可以很方便的扩展,而且app的机器往往可以很便宜,配置要求不高。数据库要支持24000个并发请求,就有点问题了,要么上缓存架构,要么数据库这一层做扩展。

要考虑tomcat集群+ngnix,另外考虑加上缓存架构,一台是很难扛下来的

一般来说,app之前的缓存(例如SQUID)稳定之后,没有命中的请求单台不能超过每秒300,否则响应时间会很慢的。
189 楼 里克尔奇 2010-11-04  
不错,拜读一下。
188 楼 glovebx 2010-11-04  
icewubin 写道
rustlingwind 写道
icewubin 写道
rustlingwind 写道
wen66 写道
strut2和spring3的性能问题, 大家可以写个简单的例子, 然后用loadruner跑一下, 就知道性能的差别的, 这个就是属于谁用谁知道的东西.


我在项目里使用的是 struts2,至少用 visualvm 发现性能瓶颈绝不在 struts2,一般都是在 数据库io和其他网络io上。

而且,我目前的测试结果是,两台机器(16G内存,双路四核cpu,15000转硬盘,两年前的dell服务器),5个tomcat节点,1个nginx负载均衡,带有业务的用例很轻松就可以跑到 1万 多的 tps (业务用例要经过struts2 自定义拦截器,访问redis,访问 memcached,访问数据库,并提供只读事务)


struts2默认的拦截器不用的全部要去掉,经我们测试是影响性能的,当然我们的并发是超高的,能看出区别。


我想问一下,用ssh写的程序,1个应用服务器节点,每秒处理多少个请求才算是性能比较不错了?硬件上相对于目前大众化的服务器配置来说(16G内存,双路四核cpu,15000转硬盘),网络带宽不考虑。

我目前的项目要求 每秒要能够处理 24000 个并发请求(读取数据库的业务),我计划用1台server扛下来,但目前看来还差的远,唉。

你先不要考虑其他因素,你可以自己用纯servlet和struts2处理纯内存操作作性能对比,有点差距的。

一般认为Tomcat最高并发在300-400左右,综合经验。所以一台扛下24000个请求不可能的。

然后说数据库的问题,由于app这层可以很方便的扩展,而且app的机器往往可以很便宜,配置要求不高。数据库要支持24000个并发请求,就有点问题了,要么上缓存架构,要么数据库这一层做扩展。

要考虑tomcat集群+ngnix,另外考虑加上缓存架构,一台是很难扛下来的
187 楼 icewubin 2010-11-04  
rustlingwind 写道
icewubin 写道
rustlingwind 写道
wen66 写道
strut2和spring3的性能问题, 大家可以写个简单的例子, 然后用loadruner跑一下, 就知道性能的差别的, 这个就是属于谁用谁知道的东西.


我在项目里使用的是 struts2,至少用 visualvm 发现性能瓶颈绝不在 struts2,一般都是在 数据库io和其他网络io上。

而且,我目前的测试结果是,两台机器(16G内存,双路四核cpu,15000转硬盘,两年前的dell服务器),5个tomcat节点,1个nginx负载均衡,带有业务的用例很轻松就可以跑到 1万 多的 tps (业务用例要经过struts2 自定义拦截器,访问redis,访问 memcached,访问数据库,并提供只读事务)


struts2默认的拦截器不用的全部要去掉,经我们测试是影响性能的,当然我们的并发是超高的,能看出区别。


我想问一下,用ssh写的程序,1个应用服务器节点,每秒处理多少个请求才算是性能比较不错了?硬件上相对于目前大众化的服务器配置来说(16G内存,双路四核cpu,15000转硬盘),网络带宽不考虑。

我目前的项目要求 每秒要能够处理 24000 个并发请求(读取数据库的业务),我计划用1台server扛下来,但目前看来还差的远,唉。

你先不要考虑其他因素,你可以自己用纯servlet和struts2处理纯内存操作作性能对比,有点差距的。

一般认为Tomcat最高并发在300-400左右,综合经验。所以一台扛下24000个请求不可能的。

然后说数据库的问题,由于app这层可以很方便的扩展,而且app的机器往往可以很便宜,配置要求不高。数据库要支持24000个并发请求,就有点问题了,要么上缓存架构,要么数据库这一层做扩展。

相关推荐

Global site tag (gtag.js) - Google Analytics