`
xly_971223
  • 浏览: 1276987 次
  • 性别: 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" ;
	}

分享到:
评论
186 楼 deng_1987 2010-11-04  
没创建Action把 ,是代理
185 楼 rustlingwind 2010-11-03  
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扛下来,但目前看来还差的远,唉。
184 楼 rustlingwind 2010-11-03  
downpour 写道
slaser 写道

第一,没看出来spring的aop拦截限制了什么应用了,我的输入输出都在参数和返回值上,为什么还需要其他拦截,你能拿出什么实际的例子让spring mvc做起来很难受的么?另外,说起spring aop天然支持aop有什么错,spring aop的后面是aspectj,对于领域对象的注入和拦截也是可以靠aspectJ搞定的。
第二,难道Spring MVC执行层次不多,定制化不强?可插入url的解析,多种view的支持,Spring Webflow,Security集成被你无视了。
第三,不认为Struts2在技术上完胜,struts2走了和Spring MVC不同的路,这个才是关键,而我觉得它现在是个半成品。论优雅,可以去学习JSF.



拦截器拦截的内容仅仅限制于参数和返回值是一件令人头疼的事情,这就意味着你的拦截器代码不可避免的要和这些内容去打交道。也就是说,一旦我要在里面加一些特殊的逻辑,比如根据参数或者返回值中的某个字段进行逻辑判断,就会使得你的拦截器依赖于特定的切面而变得毫无意义。

	@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" ;
	}


在这其中我们可以看到:

map.put("account", account);
map.put("groupList", groupList);


这两句话纯粹就是多余的。一共5行code,有2行在为返回输出做准备。你还能厚着脸皮说SpringMVC解放了你的生产力?

在Struts2中,代码就会变成这样:

        Account account;
        List<Group> groupList;

	public String index(){
		account = accountManager.getByDigitId(SecurityContextHolder.get().getDigitId()) ;
		groupList = groupManager.findAllGroup(account.getId()) ;
		return "/group/group-index" ;
	}



你所需要关注的,只是你的业务逻辑调用,而无需关心返回到底是什么名称,更不用提什么显示调用map.put这种恶心的代码了。

再问,你能用你所谓Spring的AOP把map.put这两行code给省略了嘛?所有的返回的内容都是局部变量,你去拦截啊?无能为力了吧。

至于说到什么url解析,多view的支持,SpringMVC的支持也仅仅限于支持而已,这些所谓的支持,成熟的Web层框架全部都有。所谓的Annotation带来的配置简化,本身就是一个伪命题。@RequestMapping(value="/whitelist/{whiteListId}/del")这种看上去优雅的实现,其实带来的问题却是致命的。这一点我很早就已经指出过。你可以翻看我以前的帖子。

SpringMVC充其量也就是一个简单的Web层的Mapping工具,要谈到综合性的Web层解决方案,它还差得很远。Struts2本身的设计思想和实现是所有MVC框架中最先进的。它也有很多问题,但是至今为止我还没有找到足够的证据来说明它的问题。所以希望大家在抱怨的同时,仔细想想你的观点是否真的站得住脚。




看得出来您很喜欢 struts2了,可惜我就是不理解为啥 struts2 对 rest 的支持为啥总是这么差劲(struts2-rest-plugin),而且 struts2 的更新越来越慢,至少 rest-plugin 的 bug 一直没有修复,郁闷。
183 楼 icewubin 2010-11-03  
rustlingwind 写道
wen66 写道
strut2和spring3的性能问题, 大家可以写个简单的例子, 然后用loadruner跑一下, 就知道性能的差别的, 这个就是属于谁用谁知道的东西.


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

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


struts2默认的拦截器不用的全部要去掉,经我们测试是影响性能的,当然我们的并发是超高的,能看出区别。
182 楼 rustlingwind 2010-11-03  
wen66 写道
strut2和spring3的性能问题, 大家可以写个简单的例子, 然后用loadruner跑一下, 就知道性能的差别的, 这个就是属于谁用谁知道的东西.


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

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

181 楼 178789175 2010-11-02  
我最近也在看springMVC 学习下
180 楼 rustlingwind 2010-11-01  
icewubin 写道
rustlingwind 写道
我一直都是 struts2 的坚定用户。但是目前struts2有几个比较郁闷的问题:

第一个就是 rest 的支持不够好(通过 struts2-rest-plugin),这一点比 springmvc 要差不少。尤其是不支持多参数的 restful url。类似: http://www.xxx.com/app/{userId}/{fooId}/{barId}.xml  ,没法实现。
并非俺对rest的标准规范执著,如果海量用户要求按照 userId 做 sharding,那么所有的业务api就必须传入userId。
也就是说,以前是:
http://www.xxx.com/app/photos/2.xml
做了 sharding 之后,应该是:
http://www.xxx.com/app/${userId}/photos/2.xml
当然也可以通过?参数的形式来传入 userId,但既然用了 rest,出现这种参数就非常奇怪!

第二个就是 struts2 的版本更新是在太慢!比 springmvc 慢很多。

当然strust2 的优点也很多了。比如线程安全,高压力下的性能表现至今我也没发现有问题。功能很强大,插件很丰富等。。

但是尤其是第一个问题,如果以后还不能很好的支持 rest,俺真打算改向 springmvc了!

<action name="app/*/*/*.xml" className="appAction">  
    <param name="userId">{1}</param>  
    <param name="fooId">{2}</param>  
    <param name="barId">{3}</param>  
    <result name="..." type="..."/>  
</action>  


谢谢兄弟告知的方法,不过我没用struts2 默认的action方式,用的是 struts2 convention plugin 和 rest plugin,基于注释的rest支持。这种方案是 struts2 官方支持的 rest,确实已经支持零配置,以及内容协商等机制,但是非常遗憾,不支持多参数的rest url,官方网站上有一个专门的bug说明:
https://issues.apache.org/jira/browse/WW-2842
但这个bug到现在还没有修正。。。可恶。。。
179 楼 池中物 2010-10-29  
JesseyHu 写道
Struts2首先是线程安全的,高并发不是问题,同时里面也有内存回收机制。
目前推荐版本为Strust2.2.1


178 楼 xianshi_cn 2010-10-29  
spring MVC 一看就没兴趣, 和N年前的servlet系统差不多, 一直用struts2.
177 楼 mdsp25xhm 2010-10-29  
争议贴,一种新技术的崛起,意味着旧技术将会被慢慢替代。学习。
176 楼 icewubin 2010-10-28  
rustlingwind 写道
我一直都是 struts2 的坚定用户。但是目前struts2有几个比较郁闷的问题:

第一个就是 rest 的支持不够好(通过 struts2-rest-plugin),这一点比 springmvc 要差不少。尤其是不支持多参数的 restful url。类似: http://www.xxx.com/app/{userId}/{fooId}/{barId}.xml  ,没法实现。
并非俺对rest的标准规范执著,如果海量用户要求按照 userId 做 sharding,那么所有的业务api就必须传入userId。
也就是说,以前是:
http://www.xxx.com/app/photos/2.xml
做了 sharding 之后,应该是:
http://www.xxx.com/app/${userId}/photos/2.xml
当然也可以通过?参数的形式来传入 userId,但既然用了 rest,出现这种参数就非常奇怪!

第二个就是 struts2 的版本更新是在太慢!比 springmvc 慢很多。

当然strust2 的优点也很多了。比如线程安全,高压力下的性能表现至今我也没发现有问题。功能很强大,插件很丰富等。。

但是尤其是第一个问题,如果以后还不能很好的支持 rest,俺真打算改向 springmvc了!

<action name="app/*/*/*.xml" className="appAction">  
    <param name="userId">{1}</param>  
    <param name="fooId">{2}</param>  
    <param name="barId">{3}</param>  
    <result name="..." type="..."/>  
</action>  
175 楼 rustlingwind 2010-10-28  
我一直都是 struts2 的坚定用户。但是目前struts2有几个比较郁闷的问题:

第一个就是 rest 的支持不够好(通过 struts2-rest-plugin),这一点比 springmvc 要差不少。尤其是不支持多参数的 restful url。类似: http://www.xxx.com/app/{userId}/{fooId}/{barId}.xml  ,没法实现。
并非俺对rest的标准规范执著,如果海量用户要求按照 userId 做 sharding,那么所有的业务api就必须传入userId。
也就是说,以前是:
http://www.xxx.com/app/photos/2.xml
做了 sharding 之后,应该是:
http://www.xxx.com/app/${userId}/photos/2.xml
当然也可以通过?参数的形式来传入 userId,但既然用了 rest,出现这种参数就非常奇怪!

第二个就是 struts2 的版本更新是在太慢!比 springmvc 慢很多。

当然strust2 的优点也很多了。比如线程安全,高压力下的性能表现至今我也没发现有问题。功能很强大,插件很丰富等。。

但是尤其是第一个问题,如果以后还不能很好的支持 rest,俺真打算改向 springmvc了!
174 楼 JesseyHu 2010-10-26  
Struts2首先是线程安全的,高并发不是问题,同时里面也有内存回收机制。
目前推荐版本为Strust2.2.1
173 楼 lshoo 2010-10-24  
存在就是合理!没有最好和的技术。只有最合适的,而且还只能在某个时间点上。选择什么技术,要根据使用环境决择。如果是学习的话,都学就没错了。
172 楼 aguai0 2010-10-09  
spring3mvc还没用过,lz可以提供些资料参考参考
171 楼 抢街饭 2010-10-09  
学习了!!!
170 楼 fuliang 2010-10-07  
wen66 写道


而在spring3的mvc下(restful), 会存在一个问题就是, 如果我要直接转向我的 http://localhost/myapp/model1/my.jsp 时如果我不在mvc配制文件下配制下配制, 那它怎么进行转向, 这也是一个问题. 也就是说我增加一个jsp, 还要改配制文件, 这很烦啊. 或者说是我没有发现有别的方法可做, 请大家指教.

我一般在一通用的控制器中配置:
@RequestMapping("{view}.jsp")
String raw_jsp(@PathVariable("view") String view){
   return view;
}
169 楼 webee 2010-10-07  
oakeye 写道
我也用的是这种@ResponseBody方式来做ajax,不知道有没有更合适的方式?

有的!我就没有用这种方式,这种方式将ajax的返回值搞的比较分散,我是使用Resolver来做的!
168 楼 icewubin 2010-10-05  
slaser 写道
icewubin 写道
slaser 写道
icewubin 写道
slaser 写道
池中物 写道
去掉mvc框架,用servlet和jsp吧。。

没觉得mvc框架有什么用

其实servlet也没什么用,为什么不直接用jsp做controller?

JSP运行时会先被编译成Servlet。

这不妨碍jsp做controller.比asp强大多了。

你为什么要和asp比呢?

而且MVC框架就是controller么?

JSP里面也可以有model的,虽然不专业。JSP出现之初不就是和ASP在比么?
对于不想用MVC框架的人,其实大可以不用servlet,直接用JSP不是很和其心意?

对于 目前“不想用MVC框架的人”,你如何知道他们要和ASP比?

看来你根本不了解那些“不想用MVC框架的人”,他们中相当一部分根本就没见过ASP,因为他们工作的时候ASP早就消失了,你明白么?
167 楼 slaser 2010-10-05  
icewubin 写道
slaser 写道
icewubin 写道
slaser 写道
池中物 写道
去掉mvc框架,用servlet和jsp吧。。

没觉得mvc框架有什么用

其实servlet也没什么用,为什么不直接用jsp做controller?

JSP运行时会先被编译成Servlet。

这不妨碍jsp做controller.比asp强大多了。

你为什么要和asp比呢?

而且MVC框架就是controller么?

JSP里面也可以有model的,虽然不专业。JSP出现之初不就是和ASP在比么?
对于不想用MVC框架的人,其实大可以不用servlet,直接用JSP不是很和其心意?

相关推荐

    spring webmvc struts 2.5 很难找的依赖包

    spring webmvc struts 2.5 spring webmvc struts 2.5 spring webmvc struts 2.5 spring webmvc struts 2.5 spring webmvc struts 2.5 spring webmvc struts 2.5 spring webmvc struts 2.5 spring webmvc struts 2.5 ...

    spring-webmvc-struts.jar

    spring-webmvc-struts.jar对Struts和Spring整合时需要用到的包

    struts1原理,struts2原理,spring mvc原理,struts1和struts2,struts和spring mvc

    **Struts2与Spring MVC比较:** 1. **灵活性**:Spring MVC允许更多的自定义,如自定义拦截器、视图解析器,而Struts2的扩展性相对弱些。 2. **依赖注入**:Spring MVC是Spring框架的一部分,天然支持DI,而Struts2...

    Spring3-MVC与Struts2.x比较.pdf

    下面我们将详细探讨Spring MVC的核心组件、工作流程以及与Struts2.x的比较。 1. **Spring MVC 核心组件** - **DispatcherServlet**:Spring MVC 的核心是DispatcherServlet,它作为一个前端控制器,负责接收请求...

    spring-webmvc-struts.jar aspectjweaver.jar

    2. Struts与Spring的整合,包括Action的配置、Service注入到Action、以及结果的处理。 3. 使用AspectJ的注解来定义切面,如`@Aspect`、`@Pointcut`、`@Before`、`@After`等。 4. 切面的织入策略,包括编译时织入和...

    Spring3-MVC与Struts2.x比较.docx

    3. **Interceptor**:类似于Spring MVC的HandlerInterceptor,Struts2的拦截器用于在Action执行前后执行特定任务。 4. **Result**:处理Action执行后的结果,决定如何展示给用户。 5. **ValueStack**:Struts2的...

    spring.jar spring-webmvc-struts.jar spring-webmvc.jar

    "spring-webmvc-struts"可能指的是Spring与Struts的集成包,Struts是另一个流行的Java Web MVC框架。这个库可能包含了一些桥接代码,帮助开发者将Spring的IoC(Inversion of Control,控制反转)和AOP功能与Struts的...

    spring-webmvc-struts-2.5.6-sources.jar

    spring-webmvc-struts-2.5.6-sources

    Spring+Spring MVC+Struts+hibernate开发摄影平台完整版系统

    《构建摄影平台:Spring+Spring MVC+Struts+Hibernate整合详解》 在现代Web开发领域,Spring框架以其灵活性和强大的企业级应用支持而备受青睐。本项目“Spring+Spring MVC+Struts+Hibernate开发摄影平台完整版系统...

    DWR与SPRING,DWR与STRUTS2的整合

    综上所述,"DWR与SPRING,DWR与STRUTS2的整合"主题涵盖了现代Java Web开发中重要的三个方面:DWR的实时通信能力、Spring的全面后端支持和Struts2的MVC架构。通过整合这三者,开发者可以构建出具有高效交互、灵活管理...

    ACCP 5.0 Y2 MVC和Struts2本书的选择题答案

    在IT行业中,MVC(Model-...理解并熟练运用MVC模式、Struts2框架、Spring框架以及Hibernate ORM,对于提升Java Web开发能力大有裨益。通过解答相关选择题,可以检验和巩固这些知识点的理解程度,进一步提升个人技能。

    搭建SSH框架需要引入的Struts2包(log4j,spring-web,struts2-spring-plugin)

    `struts2-spring-plugin-2.5.16.jar`是Struts2与Spring集成的插件,它使得Struts2可以利用Spring的依赖注入(DI)和面向切面编程(AOP)能力。通过这个插件,我们可以将Action类的实例化和管理交给Spring容器,从而...

    spring3+struts2+ibatis

    Spring3、Struts2和Ibatis的整合,构建了一个完整的MVC+持久层架构。Spring作为整个应用的调度中心,管理所有对象的生命周期,包括Struts2的Action和Ibatis的SqlSession。Struts2负责接收HTTP请求,调用Action执行...

    MVC注解Spring-Struts2Spring2hibernate3

    本项目“MVC注解Spring-Struts2Spring2hibernate3”结合了Spring、Struts2和Hibernate3这三大框架,以注解的方式实现了一个完整的MVC解决方案。下面将详细介绍这三个框架以及它们之间的协作。 首先,Spring框架是...

    Struts和Spring两种MVC框架究竟有什么不同呢?

    Spring MVC作为其Web层的一部分,与Struts相比,更加轻量级和灵活。Spring MVC通过DispatcherServlet作为入口点,处理HTTP请求,并通过配置或注解定义控制器(@Controller)。模型数据通常通过模型对象(Model或...

Global site tag (gtag.js) - Google Analytics