日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

SpringMVC 、Struts的区别

發布時間:2023/12/4 javascript 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringMVC 、Struts的区别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

先說結論:目前Spring MVC已經一統江山,Struts正在被拋棄

1、Spring MVC原理

Spring 體系:

Spring MVC工作流程圖


SpringMVC的工作流程描述

1. 用戶向服務器發送請求,請求被Spring前端控制Servelt DispatcherServlet捕獲;2. DispatcherServlet對請求URL進行解析,得到請求資源標識符(URI)。然后根據該URI,調用HandlerMapping獲得該Handler配置的所有相關的對象(包括Handler對象以及Handler對象對應的攔截器),最后以HandlerExecutionChain對象的形式返回;
  • DispatcherServlet根據獲得的Handler,選擇一個合適的HandlerAdapter。(附注:如果成功獲得HandlerAdapter后,此時將開始執行攔截器的preHandler(…)方法)

  • 提取Request中的模型數據,填充Handler入參,開始執行Handler(Controller)。在填充Handler的入參過程中,根據你的配置,Spring將幫你做一些額外的工作:
  • HttpMessageConveter:將請求消息(如Json、xml等數據)轉換成一個對象,將對象轉換為指定的響應信息

    數據轉換:對請求消息進行數據轉換。如String轉換成Integer、Double等

    數據根式化:對請求消息進行數據格式化。如將字符串轉換成格式化數字或格式化日期等

    數據驗證:驗證數據的有效性(長度、格式等),驗證結果存儲到BindingResult或Error中

  • Handler執行完成后,向DispatcherServlet 返回一個ModelAndView對象;

  • 根據返回的ModelAndView,選擇一個適合的ViewResolver(必須是已經注冊到Spring容器中的ViewResolver)返回給DispatcherServlet ;

  • ViewResolver結合Model和View,來渲染視圖

  • 8.將渲染結果返回給客戶端。

    2、Struts原理

    Struts架構圖


    從圖可以看出,一個請求在Struts2框架中的處理大概分為以下幾個步驟:

    1、客戶端初始化一個指向Servlet容器(例如Tomcat)的請求;

    2、這個請求經過一系列的過濾器(Filter)(這些過濾器中有一個叫做ActionContextCleanUp的可選過濾器,這個過濾器對于Struts2和其他框架的集成很有幫助,例如:SiteMeshPlugin);

    3、接著StrutsPrepareAndExecuteFilter被調用,StrutsPrepareAndExecuteFilter詢問ActionMapper來決定這個請求是否需要調用某個Action;

    4、如果ActionMapper決定需要調用某個Action,StrutsPrepareAndExecuteFilter把請求的處理交給ActionProxy;

    5、ActionProxy通過ConfigurationManager詢問框架的配置文件,找到需要調用的Action類;

    6、ActionProxy創建一個ActionInvocation的實例。

    7、ActionInvocation實例使用命名模式來調用,在調用Action的過程前后,涉及到相關攔截器(Intercepter)的調用。

    8、一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果。返回結果通常是(但不總是,也可能是另外的一個Action鏈)一個需要被表示的JSP或者FreeMarker的模版。在表示的過程中可以使用Struts2框架中繼承的標簽。在這個過程中需要涉及到ActionMapper。

    以上是從宏觀上對比下二者的工作流程,下面針對細節對比二者的不同。

    3、Struts2和Spring Mvc的區別

    3.1、攔截機制的不同
      Struts2是類級別的攔截,每次請求就會創建一個Action,和Spring整合時Struts2的ActionBean注入作用域是原型模式prototype,然后通過setter,getter吧request數據注入到屬性。
      Struts2中,一個Action對應一個request,response上下文,在接收參數時,可以通過屬性接收,這說明屬性參數是讓多個方法共享的。Struts2中Action的一個方法可以對應一個url,而其類屬性卻被所有方法共享,這也就無法用注解或其他方式標識其所屬方法了,只能設計為多例。

    SpringMVC是方法級別的攔截,一個方法對應一個Request上下文,所以方法直接基本上是獨立的,獨享request,response數據。而每個方法同時又何一個url對應,參數的傳遞是直接注入到方法中的,是方法所獨有的。處理結果通過ModeMap返回給框架。在Spring整合時,SpringMVC的Controller Bean默認單例模式Singleton,所以默認對所有的請求,只會創建一個Controller,有應為沒有共享的屬性,所以是線程安全的,如果要改變默認的作用域,需要添加@Scope注解修改。

    Struts2有自己的攔截Interceptor機制,SpringMVC這是用的是獨立的Aop方式,這樣導致Struts2的配置文件量還是比SpringMVC大。

    3.2、底層框架的不同
      Struts2采用Filter(StrutsPrepareAndExecuteFilter)實現,SpringMVC(DispatcherServlet)則采用Servlet實現。Filter在容器啟動之后即初始化;服務停止以后墜毀,晚于Servlet。Servlet在是在調用時初始化,先于Filter調用,服務停止后銷毀。

    3.3、性能方面
      Struts2是類級別的攔截,每次請求對應實例一個新的Action,需要加載所有的屬性值注入,SpringMVC實現了零配置,由于SpringMVC基于方法的攔截,有加載一次單例模式bean注入。所以,SpringMVC開發效率和性能高于Struts2。

    3.4、和Spring集成

    spring MVC和Spring是無縫的。從這個項目的管理和安全上也比Struts2高(當然Struts2也可以通過不同的目錄結構和相關配置做到SpringMVC一樣的效果,但是需要xml配置的地方不少)。

    3.5、驗證機制

    SpringMVC驗證支持JSR303,處理起來相對更加靈活方便,而Struts2驗證比較繁瑣,感覺太煩亂。

    3.6、設計思想

    Struts2更加符合OOP的編程思想, SpringMVC就比較謹慎,在servlet上擴展。

    3.7、集成方面

    SpringMVC集成了Ajax,使用非常方便,只需一個注解@ResponseBody就可以實現,然后直接返回響應文本即可,而Struts2攔截器集成了Ajax,在Action中處理時一般必須安裝插件或者自己寫代碼集成進去,使用起來也相對不方便。

    拓展:
    攔截器與過濾器的區別 :

  • 攔截器是基于java的反射機制的,而過濾器是基于函數回調。
  • 攔截器不依賴與servlet容器,過濾器依賴與servlet容器。
  • 攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。
  • 攔截器可以訪問action上下文、值棧里的對象,而過濾器不能訪問。
  • 在action的生命周期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次
    • servlet:servlet是一種運行服務器端的Java應用程序,具有獨立于平臺和協議的特性,并且可以動態的生成web頁面,它工作在客戶端請求與服務器響應的中間層。

    • filter:filter是一個可以復用的代碼片段,可以用來轉換HTTP請求、響應和頭信息。Filter不像Servlet,它不能產生一個請求或者響應,它只是修改對某一資源的請求,或者修改從某一的響應。

    • listener:監聽器,從字面上可以看出listener主要用來監聽只用。通過listener可以監聽web服務器中某一個執行動作,并根據其要求作出相應的響應。通俗的語言說就是在application,session,request三個對象創建消亡或者往其中添加修改刪除屬性時自動執行代碼的功能組件。

    • interceptor:是在面向切面編程的,就是在你的service或者一個方法,前調用一個方法,或者在方法后調用一個方法,比如動態代理就是攔截器的簡單實現,在你調用方法前打印出字符串(或者做其它業務邏輯的操作),也可以在你調用方法后打印出字符串,甚至在你拋出異常的時候做業務邏輯的操作。

    • servlet、filter、listener是配置到web.xml中,interceptor不配置到web.xml中,struts的攔截器配置到struts.xml中。spring的攔截器配置到spring.xml中。

    總結

    以上是生活随笔為你收集整理的SpringMVC 、Struts的区别的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。