我们用struts2时采用的传统的配置文件的方式,并没有使用传说中的0配置。spring3 mvc可以认为已经100%零配置了(除了配置spring mvc-servlet.xml外)。 " K% W2 { [9 D/ L6 l2 O0 ?3 K, z4 m- Y" a7 }! s
Spring MVC和Struts2的区别:2 c( R' d: q* x. [4 I
2 _/ o6 P' i3 V, h1 l) o( Z
机制:spring mvc的入口是servlet,而struts2是filter(这里要指出,filter和servlet是不同的。以前认为filter是 servlet的一种特殊),这样就导致了二者的机制不同,这里就牵涉到servlet和filter的区别了。 * F7 y* V# O- q b. a# V " d i8 m) z( O+ n性能: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上下文。 8 d) _) P& K) V! s1 N; Q1 k1 ]% O9 v- J6 T; l( R" Y
参数传递:struts是在接受参数的时候,可以用属性来接受参数,这就说明参数是让多个方法共享的。! \! P, v$ y. ~+ M% T2 E8 \: M Z
2 U: g; b: b, p, s
设计思想上:struts更加符合oop的编程思想, spring就比较谨慎,在servlet上扩展。5 u* y9 u- U* r$ F7 x
. \; K4 y" U7 U9 H. L J9 A9 o
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变量是共享的,这不会影响程序运行,却给我们编码,读程序时带来麻烦。 1 L9 \9 G+ j9 q0 u# H7 @9 n / j( V. g, k1 t7 \另外,spring3 mvc的验证也是一个亮点,支持JSR303,处理ajax的请求更是方便,只需一个注解@ResponseBody ,然后直接返回响应文本即可。送上一段代码: 4 s9 A, V- G2 }1 e9 P1 \1 k, T! F; F( V5 Y
@RequestMapping(value=“/whitelists”) 1 R: |. E9 W+ D; K9 o ! F( o# ~) m6 J' {2 dpublic String index(ModelMap map) {; S1 e" U8 }- f6 ?
' ?: q9 U- D& |1 c! U1 l0 z3 a' Y OAccount account = accountManager.getByDigitId(SecurityContextHolder.get().getDigitId());# U8 R. H |& D9 n, T
# \$ M. \! Q& H ~( c
List groupList = groupManager.findAllGroup(account.getId()); ) V8 `9 X; F! l# a) f) a" M! q: s/ [# s n) b
map.put(“account”, account);' b: z" b# `' S! r. j6 h' z3 W0 D
1 }* x1 y# ~4 s- V2 bmap.put(“groupList”, groupList); ; h8 ^+ e: H8 a* A1 U + m; E3 I% b u7 o# D. g# yreturn “/group/group-index”;; z7 e2 ~* y) J$ O' w$ Q- G7 J9 d
, y p" m' c7 V# U: H2 i* @
}2 H! h* n3 H9 g+ \/ k/ C. q
# @* I9 |3 D! O5 {3 w6 j# y
// @ResponseBody ajax响应,处理Ajax请求也很方便0 W/ A& p+ I0 n1 ~$ h
/ M% [+ t7 N. }- m@RequestMapping(value=“/whitelist/{whiteListId}/del”) + Q& r( C$ l `2 n4 i- c 1 j! a1 U3 H; K, `0 }# H@ResponseBody , W4 ~9 l! I2 \) [; a* d7 e" f; j' W. ~9 P
public String delete(@PathVariable Integer whiteListId) { 6 A# c: C& v8 Q3 h! j9 ]. u0 w3 V* f+ Z: p) v
whiteListManager.deleteWhiteList(whiteListId); * r, Y! H/ Q3 L# G$ K9 {) C) c! v5 d0 }3 v2 M! Z
return “success”;. ~% J/ M* m3 x2 |6 f' T
u) O! \) o+ m7 G: |' P8 b9 b
}3 U( K) z3 f6 P3 k
===========================================================4 k5 E; U+ Y: C9 P
下面列出我对这两个都很优秀的框架的评估,请各位帮忙评判一下: 0 P. j* }( p& S( x8 D. ?- i- q( m+ n3 g
------------------------SpringMVC-----Struts2.0(webwork2)--------------获胜者 4 w. m: K; p. n6 X$ E5 r1 O开发效率----------------5-------------?---------------------------------? 0 F4 J- c1 A$ A# W( U- s# s( |- Y0 h- G6 x* I
运行效率----------------5-------------4(action非单例)------------------SpringMVC , ^: r' }; Q, j5 B; `8 \' u
2 D" R+ m; z; J学习成本----------------4-------------3(同事反应学习曲线比较陡)--------SpringMVC ' X O# F1 [6 }; f; l8 C: g
$ K2 T& p$ D5 u" |8 }* R
与Spring集成------------5(无缝集成) 4----------------------------------SpringMVC 5 J$ _+ e) a5 p T$ {& S7 n. {
难易程度 ) s1 Q* r4 y7 s: _* {- G( C$ `4 P 8 l2 J6 H, }8 g: _; gvalidator集成-----------4(commons)--5----------------------------------Struts2.0 2 y2 _: k1 }! T% n* T7 [+ \6 x
9 _9 k3 k) e+ j
AJAX集成----------------4-------------5(丰富的tag支持)-----------------Struts2.0 * z* z6 n5 _8 i a9 T
+ a) [" t* g& _" ]) J- v% |
可测试性----------------5-------------5----------------------------------平局$ Y$ j$ b3 A4 b- b- z+ j
. W. ~" W* Q+ C2 q R; ]* @4 x ! Z3 J H3 i% |7 ^& ?% I6 ^* r0 w. e# I3 D
从实际开发效果来看,在4个项目用了spring2.5 mvc,2个项目用struts2,发现招聘时,都是struts1,struts2的求职者,而spring mvc全得现培训,不过学习曲线实在是低,把架构搭好之后,绝大部分的人都能很快适应,并快速开发。而struts2的开发,以前2个项目,都是刚好别人搭的架构(完全照搬天乙社区里面的开发方式),实际做功能测试和性能测试时,问题成堆。struts2的数据绑定简直就是灾难,新手经常性的把参数给弄乱。. G9 X: K q( J