<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Chan Chen Coding...

    Java MVC 比較

    Spring MVC PK Struts2

    我們用struts2時(shí)采用的傳統(tǒng)的配置文件的方式,并沒有使用傳說中的0配置。spring3 mvc可以認(rèn)為已經(jīng)100%零配置了(除了配置spring mvc-servlet.xml外)。

    Spring MVC和Struts2的區(qū)別:

    1. 機(jī)制:spring mvc的入口是servlet,而struts2是filter(這里要指出,filter和servlet是不同的。以前認(rèn)為filter是servlet的一種特殊),這樣就導(dǎo)致了二者的機(jī)制不同,這里就牽涉到servlet和filter的區(qū)別了。

    2. 性能:spring會(huì)稍微比struts快。spring mvc是基于方法的設(shè)計(jì)而sturts是基于類,每次發(fā)一次請(qǐng)求都會(huì)實(shí)例一個(gè)action,每個(gè)action都會(huì)被注入屬性,而spring基于方法,粒度更細(xì),但要小心把握像在servlet控制數(shù)據(jù)一樣。spring3 mvc是方法級(jí)別的攔截,攔截到方法后根據(jù)參數(shù)上的注解,把request數(shù)據(jù)注入進(jìn)去,在spring3 mvc中,一個(gè)方法對(duì)應(yīng)一個(gè)request上下文。而struts2框架是類級(jí)別的攔截,每次來了請(qǐng)求就創(chuàng)建一個(gè)Action,然后調(diào)用setter getter方法把request中的數(shù)據(jù)注入;struts2實(shí)際上是通過setter getter方法與request打交道的;struts2中,一個(gè)Action對(duì)象對(duì)應(yīng)一個(gè)request上下文。

    3. 參數(shù)傳遞:struts是在接受參數(shù)的時(shí)候,可以用屬性來接受參數(shù),這就說明參數(shù)是讓多個(gè)方法共享的。

    4. 設(shè)計(jì)思想上:struts更加符合oop的編程思想, spring就比較謹(jǐn)慎,在servlet上擴(kuò)展。

    5. intercepter的實(shí)現(xiàn)機(jī)制:struts有以自己的interceptor機(jī)制,spring mvc用的是獨(dú)立的AOP方式。這樣導(dǎo)致struts的配置文件量還是比spring mvc大,雖然struts的配置能繼承,所以我覺得論使用上來講,spring mvc使用更加簡(jiǎn)潔,開發(fā)效率Spring MVC確實(shí)比struts2高spring mvc是方法級(jí)別的攔截,一個(gè)方法對(duì)應(yīng)一個(gè)request上下文,而方法同時(shí)又跟一個(gè)url對(duì)應(yīng),所以說從架構(gòu)本身上spring3 mvc就容易實(shí)現(xiàn)restful urlstruts2是類級(jí)別的攔截,一個(gè)類對(duì)應(yīng)一個(gè)request上下文;實(shí)現(xiàn)restful url要費(fèi)勁,因?yàn)閟truts2 action的一個(gè)方法可以對(duì)應(yīng)一個(gè)url;而其類屬性卻被所有方法共享,這也就無法用注解或其他方式標(biāo)識(shí)其所屬方法了。spring3 mvc的方法之間基本上獨(dú)立的,獨(dú)享request response數(shù)據(jù),請(qǐng)求數(shù)據(jù)通過參數(shù)獲取,處理結(jié)果通過ModelMap交回給框架方法之間不共享變量,而struts2搞的就比較亂,雖然方法之間也是獨(dú)立的,但其所有Action變量是共享的,這不會(huì)影響程序運(yùn)行,卻給我們編碼,讀程序時(shí)帶來麻煩。

    6. 另外,spring3 mvc的驗(yàn)證也是一個(gè)亮點(diǎn),支持JSR303,處理ajax的請(qǐng)求更是方便,只需一個(gè)注解@ResponseBody ,然后直接返回響應(yīng)文本即可。送上一段代碼: 

    @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響應(yīng),處理Ajax請(qǐng)求也很方便
    @RequestMapping(value="/whitelist/{whiteListId}/del")
    @ResponseBody
    public String delete(@PathVariable Integer whiteListId) {
    whiteListManager.deleteWhiteList(whiteListId);
    return "success";
    }


    測(cè)試環(huán)境:

    CPU

    :酷睿

    T5750

    ,內(nèi)存:

    DDR2-667 

    2G

    Web

    容器:

    Tomcat6.0

    ,最大線程數(shù)設(shè)

    置為

    1000

    ,操作系統(tǒng):

    WinXP-sp3 

     

    測(cè)試步驟:

    搭建

    6

    個(gè)

    Web

    工程,如下:

     

    1.

    JSP:

    不包含任何

    MVC

    框架,只有一個(gè)測(cè)試用的

    JSP

    頁(yè)面。

     

    2.struts1

    包含一個(gè)

    Action

    ,不做任何邏輯處理,直接轉(zhuǎn)發(fā)到一個(gè)

    JSP

    頁(yè)面

     

    3.struts2 JSP

    不包含

    Action

    ,只包含測(cè)試

    JSP

    頁(yè)面,直接訪問該頁(yè)面。

     

    4.struts2 

    單例

    Action

    采用

    Spring

    來管理

    Struts2

    Action

    實(shí)例,并配置成單例模式。

     

    5.struts2 

    多例

    Action

    采用

    Spring

    來管理

    Struts2

    Action

    實(shí)例,并配置成單例模式。

     

    6.SpringMVC3

    采用

    Spring

    來管理

    Controller

    實(shí)例,包含一個(gè)

    Controller

    ,不做邏輯處

    理,收到請(qǐng)求后,直接返回到一個(gè)

    JSP

    頁(yè)面。

     

     

    測(cè)試結(jié)果:

     

    測(cè)試工程

     

    請(qǐng)求

    數(shù)

     

    并發(fā)數(shù)

     

    總時(shí)

    (s) 

    總時(shí)

    (s) 

    總時(shí)

    (s) 

    平均

    (s) 

    Requests Per 

    Second(

    每秒處

    理請(qǐng)求數(shù)

    JSP 

    2000 

    200 

    5.55  

    3.59  

    4.11  

    4.42  

    452.83  

    struts1 

    2000 

    200 

    6.77  

    3.83  

    7.00  

    5.86  

    341.03  

    struts2 JSP 

    2000 

    200 

    25.20  26.30  24.11  

    25.20  

    79.35  

    struts2 

    單例

    Action 

    2000 

    200 

    28.36  27.59  27.69  

    27.88  

    71.74  

    struts2 

    多例

    Action 

    2000 

    200 

    31.31  31.97  39.56  

    34.28  

    58.34  

    SpringMVC3 

    2000 

    200 

    7.16  

    7.50  

    4.27  

    6.31  

    317.09  

     

    說明:

    以上測(cè)試雖不是非常的精確,但基本能說明一定的問題。每個(gè)

    JSP

    頁(yè)面和

    Action

    不包含任何的業(yè)務(wù)邏輯代碼,

    只是請(qǐng)求轉(zhuǎn)發(fā)。

    每輪測(cè)試取三次總時(shí)間的平均值。

    所有工程的

    測(cè)試均全部完成并正常處理請(qǐng)求,沒有請(qǐng)求拒絕情況發(fā)生。

     

    結(jié)論:

     

    1.

    JSP

    的性能應(yīng)該最高,這不難理解,

    JSP

    被編譯成

    Servlet

    后,沒有任何多余的功能,

    收到請(qǐng)求后直接處理。

    這也驗(yàn)證一句經(jīng)典的話:越原始效率就越高。

     

     

    2.struts1

    的性能是僅次于純

    JSP

    的,由于

    struts1

    采用單例

    Action

    模式,且本身的封裝

    相比

    struts2

    應(yīng)該說簡(jiǎn)單很多,雖然開發(fā)效率不如

    struts2

    ,但已經(jīng)過多年的實(shí)踐考驗(yàn),性

    能穩(wěn)定高效。

     

     

    3.

    相比來說

    struts2

    的性能就比較差了,這不難理解,

    struts2

    之所以開發(fā)方便,是由于采

    用值棧、

    OGNL

    表達(dá)式、攔截器等技術(shù)對(duì)請(qǐng)求參數(shù)的映射和返回結(jié)果進(jìn)行了處理,另外還采

    用大量的標(biāo)簽庫(kù)等,

    這些都無疑增加了處理的時(shí)間。

    因此降低了效率。

    在我們實(shí)際的項(xiàng)目中,

    我測(cè)試本地工程訪問每秒處理請(qǐng)求數(shù)只能達(dá)到

    35

    左右,應(yīng)該說還有不少可優(yōu)化的空間。

     

     

    4.

    很多人認(rèn)為

    struts2

    性能差是因?yàn)樗亩嗬?/p>

    Action

    模式導(dǎo)致的,

    但我們采用

    spring

    管理

    struts2

    Action

    ,并設(shè)置按單例方式生成

    Action

    實(shí)例后,發(fā)現(xiàn)其性能有所提高,但并不

    是很明顯。

    由此可見,

    多例

    Action

    模式并不是

    struts2

    性能瓶頸所在。

    另外,

    我們?cè)?/p>

    struts2

    中采用

    JSP

    方式訪問,

    發(fā)現(xiàn)其性能依舊和沒有采用任何

    MVC

    框架的純

    JSP

    之間存在好幾倍的

    差距,這又從另一個(gè)側(cè)面證實(shí)了我們剛才得出結(jié)論,

    struts2

    性能的瓶頸不在于它的多例

    Action

    模式。

     

     

     

     

     

     

    5.SpringMVC3

    的性能略遜于

    struts1

    ,但基本是同級(jí)別的,這讓人眼前一亮,

    springMVC

    著不比

    struts2

    差的開發(fā)效率和解耦度,

    但性能卻是

    struts2

    的好幾倍,

    這讓我們灰常振奮,

    SpringMVC

    無疑又是項(xiàng)目開發(fā)的一個(gè)好的選擇。

    唯一的問題就是,

    目前國(guó)內(nèi)使用面還不太多,

    各方面的參考資料相對(duì)較少,上手的話可能要稍微難點(diǎn)。

     



    -----------------------------------------------------
    Silence, the way to avoid many problems;
    Smile, the way to solve many problems;

    posted on 2013-05-04 16:21 Chan Chen 閱讀(510) 評(píng)論(0)  編輯  收藏 所屬分類: Architecture

    主站蜘蛛池模板: 国内精品乱码卡1卡2卡3免费| 国产va免费精品观看精品| 久久亚洲精品中文字幕无码| 亚洲综合久久成人69| 亚洲国产精品无码久久九九大片| a毛片免费在线观看| 三年片在线观看免费西瓜视频| 国产啪精品视频网免费| 亚洲日韩在线中文字幕第一页| 77777_亚洲午夜久久多人| 久久精品国产亚洲AV电影| 国产精品亚洲精品久久精品| 亚洲a一级免费视频| 免费国产人做人视频在线观看| 久久国产亚洲高清观看| 成人免费观看男女羞羞视频| www视频免费看| 中文亚洲AV片在线观看不卡| 亚洲熟妇AV乱码在线观看| 瑟瑟网站免费网站入口| 免费看片在线观看| 国产亚洲一区二区三区在线观看| 亚洲欧美日韩综合久久久 | 亚洲第一成年网站视频| 久久久久国产免费| 亚洲人成网站18禁止一区| 久久青青草原亚洲AV无码麻豆 | 可以免费观看的毛片| 免费国产成人高清视频网站| 亚洲国产亚洲片在线观看播放| 国产三级在线免费观看| 国产成人aaa在线视频免费观看| 国产亚洲精久久久久久无码77777 国产亚洲精品成人AA片新蒲金 | 精品无码国产污污污免费| 亚洲精品美女在线观看播放| GOGOGO高清免费看韩国| 又粗又黄又猛又爽大片免费| 亚洲第一男人天堂| 精品国产免费人成网站| 国产成人3p视频免费观看| 亚洲已满18点击进入在线观看|