论坛首页 Java企业应用论坛

spring3mvc与struts2比较

浏览 162758 次
该帖已经被评为良好帖
作者 正文
   发表时间:2010-04-17   最后修改:2010-04-17
项目刚刚换了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" ;
	}

   发表时间:2010-04-17  
我也用的是这种@ResponseBody方式来做ajax,不知道有没有更合适的方式?
0 请登录后投票
   发表时间:2010-04-17  
我也用的是这种@ResponseBody方式来做ajax,不知道有没有更合适的方式?
0 请登录后投票
   发表时间:2010-04-17  
还有就是中文问题  我只能复写那个StringHttpMessageConverter,然后把编码方式写成utf-8
0 请登录后投票
   发表时间:2010-04-18  
有2个JsonView的,或者更适合Ajax,当然自己写一个JsonView都很简单
1 json-lib-ext-spring
http://sourceforge.net/projects/json-lib/files/
2 spring json view
http://spring-json.sourceforge.net/download.html

一直用org.springframework.web.filter.CharacterEncodingFilter,没碰到什么中文的问题。
1 请登录后投票
   发表时间:2010-04-18  
哦 基于注解的
注解算不算配置?
0 请登录后投票
   发表时间:2010-04-18  
不错,但是现在用struts2的多啊,想换spring-MVC,不容易!
0 请登录后投票
   发表时间:2010-04-18  
我还没接触呢?楼主可以提供点资料吗?比如做好的简单项目啊!还有些关于这方面的资料!
0 请登录后投票
   发表时间:2010-04-18  
elvea 写道
有2个JsonView的,或者更适合Ajax,当然自己写一个JsonView都很简单
1 json-lib-ext-spring
http://sourceforge.net/projects/json-lib/files/
2 spring json view
http://spring-json.sourceforge.net/download.html

一直用org.springframework.web.filter.CharacterEncodingFilter,没碰到什么中文的问题。


你确定是在spring3的mvc上弄的,貌似3的mvc的编码是上面那个converter
可能我搞错了
0 请登录后投票
   发表时间:2010-04-18  
spring3与struts2有很大的区别, 最近我们在struts2.1及spring3.0.2上做过压力测试, 发现struts2.1在默认的配制下存在严重的性能问题. 每秒的点击数不会超过200, 而如果用struts2的dispatchServlet去拦截带有参数的jsp如(http://localhost/myapp/my.jsp?para1=1&para2=2) 这样的url时, 在大并发时, 存在很严重的内存泄漏的问题. 用jprofile可以发现java.util.concurrent.concurrenthashmap占用了大量的内存, 同时java.util.concurrent.locks也占用了大量的内存. 原因估计为struts2里面的参数转化拦截器出了问题(没有得到求证).

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

总共来说: 在高并发的情况下, strut2慎用, spring3可以大胆使用. spring3在性能和内存使用上都不会存在问题(这点我们是经过压力测试的). spring3 mvc可以达到每秒3000的并发点击. (当然经过的controller是很简单的, 没有业务逻辑在里面), 且内存可以正常回收. 
1 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics