TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
我们用struts2时采用的传统的配置文件的方式,并没有使用传说中的0配置。spring3 mvc可以认为已经100%零配置了(除了配置spring mvc-servlet.xml外)。% ~( C3 o5 B' q4 T) _1 Y6 a
8 t# l. }1 H- G( FSpring MVC和Struts2的区别:- t, i" i V) J# z; V
! C! N2 l+ U3 H& b
机制:spring mvc的入口是servlet,而struts2是filter(这里要指出,filter和servlet是不同的。以前认为filter是 servlet的一种特殊),这样就导致了二者的机制不同,这里就牵涉到servlet和filter的区别了。7 A( C4 b5 y4 p, x
: X7 v: L6 J( U; B) @* @. c性能:spring会稍微比struts快。spring mvc是基于方法的设计,而sturts是基于类,每次发一次请求都会实例一个action,每个action都会被注入属性,而spring基于方法,粒度更细,但要小心把握像在servlet控制数据一样。spring3 mvc是方法级别的拦截,拦截到方法后根据参数上的注解,把request数据注入进去,在spring3 mvc中,一个方法对应一个request上下文。而struts2框架是类级别的拦截,每次来了请求就创建一个Action,然后调用setter getter方法把request中的数据注入;struts2实际上是通过setter getter方法与request打交道的;struts2中,一个Action对象对应一个request上下文。( u3 b& J% A% T6 o9 G
* f; k5 @* {& z: }参数传递:struts是在接受参数的时候,可以用属性来接受参数,这就说明参数是让多个方法共享的。
8 c7 u V# X" q6 @% v" ^1 i! G3 g. S( r* q5 `
设计思想上:struts更加符合oop的编程思想, spring就比较谨慎,在servlet上扩展。& N7 _) i# [+ |- t( C. M
$ Y# [3 @+ h4 S& E/ I7 C& T) R* p
intercepter的实现机制:struts有以自己的interceptor机制,spring mvc用的是独立的AOP方式。这样导致struts的配置文件量还是比spring mvc大,虽然struts的配置能继承,所以我觉得论使用上来讲,spring mvc使用更加简洁,开发效率Spring MVC确实比struts2高。spring mvc是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上spring3 mvc就容易实现restful url。struts2是类级别的拦截,一个类对应一个request上下文;实现restful url要费劲,因为struts2 action的一个方法可以对应一个url;而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了。spring3 mvc的方法之间基本上独立的,独享request response数据,请求数据通过参数获取,处理结果通过ModelMap交回给框架方法之间不共享变量,而struts2搞的就比较乱,虽然方法之间也是独立的,但其所有Action变量是共享的,这不会影响程序运行,却给我们编码,读程序时带来麻烦。8 {- N% |) ^- {& N$ c: R
6 _" m; ~/ h1 L N3 C9 v7 ?另外,spring3 mvc的验证也是一个亮点,支持JSR303,处理ajax的请求更是方便,只需一个注解@ResponseBody ,然后直接返回响应文本即可。送上一段代码:
) I2 ?4 ?3 I1 X( q& H8 c1 r* l) J* C
# {" O" N: [* ]% P@RequestMapping(value=“/whitelists”)/ d7 k# h4 D# ~' K% i& @5 m1 k
9 m- ?3 o3 h# s! w% ?public String index(ModelMap map) {
0 p6 |2 e) I$ z. K
: s3 y# q9 p) j/ Z+ `1 V. d/ CAccount account = accountManager.getByDigitId(SecurityContextHolder.get().getDigitId());! `0 L. G; G) x
- y, A6 F2 n" n# B. n9 XList groupList = groupManager.findAllGroup(account.getId());. t' U" Y/ H( o( m
4 ?/ c& J+ i1 b3 E" c% t1 w6 imap.put(“account”, account);7 |, R3 {' s( B( Q+ }
9 e) A5 I) `: ?& J9 k$ \map.put(“groupList”, groupList);8 q8 A0 v- T/ _ D
8 m' o# {4 T3 {$ X1 t4 |( `
return “/group/group-index”;
% d7 p s' J& K/ M( T
2 P- y% u% a5 [1 s}
u1 w' {) R. V1 g
2 V, A9 N, N: ~+ c// @ResponseBody ajax响应,处理Ajax请求也很方便
! R( e) L7 L2 ]
3 X# a& q! _6 q+ E% L@RequestMapping(value=“/whitelist/{whiteListId}/del”)9 ]; k/ z2 b6 h
4 S! n6 c: D1 \ m( p@ResponseBody
6 B5 ~, R* J& z6 ^1 U: \. E1 A- ^: p
public String delete(@PathVariable Integer whiteListId) {" X4 n- u% u9 b1 ^2 C" \5 n
( Z/ D/ N9 M7 @7 l3 AwhiteListManager.deleteWhiteList(whiteListId);" o$ v/ w& D3 `, F( r( H
4 S8 p7 d7 @" l V
return “success”;, H9 r# Q6 S' m
$ S0 x8 m; g6 L}& s1 v9 D9 [! O
===========================================================0 L' `3 h2 [+ @; s
下面列出我对这两个都很优秀的框架的评估,请各位帮忙评判一下:
' y j. x. [- U( P8 R
( z' G( K$ W& A$ T( _6 U$ U------------------------SpringMVC-----Struts2.0(webwork2)--------------获胜者
3 H+ C1 P7 M! ] W! ^2 U3 o9 }开发效率----------------5-------------?---------------------------------? - b+ u4 n3 u9 t# I) V
3 |. |. @( E( L& E0 H运行效率----------------5-------------4(action非单例)------------------SpringMVC ' K6 G- C7 r$ a" Y! ~+ |/ v5 Y
6 A8 v+ m; C0 C; `% ]7 N
学习成本----------------4-------------3(同事反应学习曲线比较陡)--------SpringMVC 2 w7 I v% _1 ]( t; x
; ^2 n2 D! J, ^, {; t
与Spring集成------------5(无缝集成) 4----------------------------------SpringMVC
3 A7 P* F. q! D- s4 ~5 V- x难易程度
6 T+ ~% b3 {; |! U4 h5 j, j! [& b D& V& U3 k
validator集成-----------4(commons)--5----------------------------------Struts2.0 , D8 P0 w j% T9 ?
* K- w! [' E4 C6 H7 K; k' V0 ]: ^% ~AJAX集成----------------4-------------5(丰富的tag支持)-----------------Struts2.0
$ Q# W+ r/ \. t l$ B5 {4 A7 i' {2 {5 u$ g R
可测试性----------------5-------------5----------------------------------平局
9 K( m7 A: _: E$ Y' J4 Z1 k1 [* Z- w+ `1 v
$ ^" J: E( \" |: T- w$ z3 b$ T1 x
. `% ^/ s; f1 t( v0 e# l
从实际开发效果来看,在4个项目用了spring2.5 mvc,2个项目用struts2,发现招聘时,都是struts1,struts2的求职者,而spring mvc全得现培训,不过学习曲线实在是低,把架构搭好之后,绝大部分的人都能很快适应,并快速开发。而struts2的开发,以前2个项目,都是刚好别人搭的架构(完全照搬天乙社区里面的开发方式),实际做功能测试和性能测试时,问题成堆。struts2的数据绑定简直就是灾难,新手经常性的把参数给弄乱。, I+ q: X8 V' R6 t+ t9 U
( U* d7 w; V: y |
|