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

分享到:
评论
46 楼 wen66 2010-04-19  
Agrael 写道
其实我觉得,对于struts2使用/*的,就不要说是struts2造成的性能问题。。。
使用validate方法验证的,不要说struts2的验证不好。
内存泄漏那这个能说得更详细点么?

to Agrael

在我做的测试里对struts2使用的是*.action, *.jsp, 没有用到你所说的/*

内存泄漏这个你只要写个jsp. 如http://localhost/myapp/my.jsp?para1=1&para2=2&para3=3. 在my.jsp里可以什么逻辑都不要, 只要输出这三个参数值就行. 然后使用road runner 在500用户下狂压20分钟看看。

当然我用的是struts2.1.6来做试验的.

在高版本下有没有解决这个问题就不知道了
45 楼 Agrael 2010-04-19  
其实我觉得,对于struts2使用/*的,就不要说是struts2造成的性能问题。。。
使用validate方法验证的,不要说struts2的验证不好。
内存泄漏那这个能说得更详细点么?
44 楼 或与非 2010-04-19  
我还在用2.5MVC呢。
关注
43 楼 icewubin 2010-04-19  
strut2要修改默认的拦截器链的配置。
42 楼 oakeye 2010-04-18  
一说到性能 这话题就扯的没完了
就好比扯hibernate  几乎是月经帖

象下面那个hibernate不适合做大项目  直接搞了40页
41 楼 fansofjava 2010-04-18  
总体来说,struts2门槛要底点,用起来要顺手一些,
不过单论设计来看,springmvc要比struts2设计得好,思路很清晰,而且相对也稳定,struts2.0到现在不知道已经搞了多少补丁了,一个web框架用了几M的源码,一点都不精简,struts2的OGNL算是一个不错的东西,其它的好像并没多大亮点。
40 楼 downpour 2010-04-18  
wen66 写道
引用

由于Struts2需要针对每个Request进行封装,把Request,Session等Servlet生命周期的变量封装成一个一个Map,供给每个Action使用,并保证线程安全。所以在原则上,是比较耗费内存的。但是这个和高并发无关。主要是你的系统架构,让Struts2承担了过多的功能。 Struts2只应处理那些需要被应用服务器处理的请求。

至于导向到JSP,应经过Action中转,这个是基本编程原则。


不是的, 这和高并发有关系, 且是存在内存泄漏的情况, 因为在请求完成后, 我们用手动去gc它, 它的内存都不回收, 且发现大量占用老年堆的内存.

在我们的系统里没有让strut2承担过多的功能, 就只是让它进行请求的转发和参数的组装. 业务逻辑都放在spring管理的bean里面了. 如果经过action然后转向jsp, 这样你的并发性就上不去了. 因为了struts2的原因. 所以我们会在有些要求高并发的页面上,直接在jsp里调用spring管理的bean, 然后用jstl输出. 如果在性能有最高的要求的下, 我们会连jstl都不用. 直接用java代码来输出.

经过这个项目, 发现如果要应对高并发, 那还是回到jsp +javaBean的方式来上. 这样简单, 且不容易出错. 同时性能也好.


我认为你的测试应该存在问题。

从Struts2的源码上来看,一个请求所绑定的线程安全的ActionContext,的确比较大,这应该是Struts2比较耗费内存的原因。但是我不认为高并发,与性能有很大的关系。你们的老年堆的内存确定是Struts2带来的嘛?你怎么证明?

使用什么技术并不是解决高并发的原因。因为我们的程序的主结构都是Servlet,顶多是上面做点封装。所谓的高并发如果造成了性能问题,你所需要分析恐怕更多的是网络因素,而不是程序框架。当然,我不否认封装得越少越好,但是损失的是你从框架获得的好处。比如,参数的自动类型转化等。
39 楼 downpour 2010-04-18  
zdmcjm 写道
to wen66
不用做压力测试也知道啦,光看@Name这种运行时注解就知道,他的性能不会好到哪,再看到他的动态注入方式,还双向,更加不要对他的性能抱希望啦。所以我说悲哀啊,seam是在正确的使用java,但是。。。


完全胡扯。

事件驱动的Web层框架永远不会成为主流,只要是基于浏览器的应用,请求-响应模式会贯穿始终。Seam提供的是一站式解决方案,但是它的Web层依然使用了JSF这样的落后技术。很多年前就被证明,JSF这种基于标签的实现,不可能解放我们的开发。
38 楼 zdmcjm 2010-04-18  
to wen66
不用做压力测试也知道啦,光看@Name这种运行时注解就知道,他的性能不会好到哪,再看到他的动态注入方式,还双向,更加不要对他的性能抱希望啦。所以我说悲哀啊,seam是在正确的使用java,但是。。。
37 楼 wen66 2010-04-18  
spring3.0对参数的校验引入了jee6里的jsr-303.

不过在我们的项目里我认为它起不了什么作用, 准备把jsr303给去掉. 要校验的地方自己手写代码校验, 这样比较放心些.
36 楼 wen66 2010-04-18  
zdmcjm 写道
moses3017 写道
zdmcjm 写道
像struts2和spring3 mvc这样的框架如果流行起来,那才真是java莫落的前兆。
而jsf,seam这样的真正把java威力发挥的框架不流行,是一种悲哀。

能说的再详细点吗?


我是觉得,像struts2系,spring3 mvc系等等整个围绕的是页面请求,参数,围绕这些东西思考的就是过程式。jsf,seam围绕的是事件,对象状态,对象交互,对象生命周期,jsf,seam中,页面也是通过一些标签包装后的,可供其他任意bean访问的对象,这些东西才是java做为一门静态强类型的,面向对象的语言应用的地方。

to zdmcjm
不知道你有没有测试过 jsf + seam 的性能怎么样. 建议你做过压力测试后在说这话. 其实每种技术的出现只能解决它所面对的特定的问题.

spring3我觉得对性能还是有一定的影响, 因为在它的代码里为了达到就有的灵活, 使用了很多的反射. 为了灵活, 这是必须的. 目前至少我是这么看的.
35 楼 zdmcjm 2010-04-18  
moses3017 写道
zdmcjm 写道
像struts2和spring3 mvc这样的框架如果流行起来,那才真是java莫落的前兆。
而jsf,seam这样的真正把java威力发挥的框架不流行,是一种悲哀。

能说的再详细点吗?


我是觉得,像struts2系,spring3 mvc系等等整个围绕的是页面请求,参数,围绕这些东西思考的就是过程式。jsf,seam围绕的是事件,对象状态,对象交互,对象生命周期,jsf,seam中,页面也是通过一些标签包装后的,可供其他任意bean访问的对象,这些东西才是java做为一门静态强类型的,面向对象的语言应用的地方。
34 楼 cnyangqi 2010-04-18  
Spring3 MVC相关的资料,中文的哪里比较好些呢?
33 楼 moses3017 2010-04-18  
zdmcjm 写道
像struts2和spring3 mvc这样的框架如果流行起来,那才真是java莫落的前兆。
而jsf,seam这样的真正把java威力发挥的框架不流行,是一种悲哀。

能说的再详细点吗?
32 楼 zdmcjm 2010-04-18  
像struts2和spring3 mvc这样的框架如果流行起来,那才真是java莫落的前兆。
而jsf,seam这样的真正把java威力发挥的框架不流行,是一种悲哀。
31 楼 Javac_MyLife 2010-04-18  
学习了 不错。spring3 mvc可以达到每秒3000的并发点击.印象深刻。。
30 楼 oakeye 2010-04-18  
3.0的validate我没搞明白  暂时只是简单应用  等有时间了  再考虑其他的
现在都不管入例校验  应为在客户端校验过了,服务器端默认就认为 客户端提交过来的数据是正确的  肯定是不安全的
29 楼 yhailj 2010-04-18  
主要就想看下 Spring MVC 3.0 里面的校验
用 Struts2 的时候, 我从来都是写了 validate 方法的
不知道 3.0 的校验是怎样的...
28 楼 wen66 2010-04-18  
strut2和spring3的性能问题, 大家可以写个简单的例子, 然后用loadruner跑一下, 就知道性能的差别的, 这个就是属于谁用谁知道的东西.
27 楼 caoyangx 2010-04-18  
spyker 写道
哦 基于注解的
注解算不算配置?

  不知道怎么形容你的疑问。

相关推荐

    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