spring mvc 與struts2區別

1、spring mvc的入口是servlet,而struts2是filter

filter功能:用戶可以改變一個request和修改一個response

Filter 不是一個servlet,它不能產生一個response,它能夠在一個request到達servlet之前預處理request,也可以在離開 servlet時處理response.換種說法,filter其實是一個”servlet chaining”(servlet 鏈).

一個filter 包括:

  1. 在servlet被調用之前截獲;

  2. 在servlet被調用之前檢查servlet request;

  3. 根據需要修改request頭和request數據;

  4. 根據需要修改response頭和response數據;

  5. 在servlet被調用之後截獲.

通常我們所訪問的資源是一個servlet或jsp頁面,而jsp其實是一個被封裝了的servlet(每個jsp執行前都會被轉化爲一個標準的 servlet,這點若還有不明白的請自己到網上查一下吧),於是我們就可以統一地認爲我們每次訪問的都是一個Servlet,而每當我們訪問一個 servlet時,web容器都會調用該Servlet的service方法去處理請求。而在service方法又會根據請求方式的不同(Get/Post)去調用相應的doGet()或doPost()方法,實際處理請求的就是這個doGet或doPost方法。寫過servlet的朋友都應該知道,我們在doGet(或doPost)方法中是通過response.getWriter()得到客戶端的輸出流對象,然後用此對象對客戶進行響應。

       到這裏我們就應該理解了過濾器的執行流程了:執行第一個過濾器的chain.doFilter()之前的代碼——>第二個過濾器的 chain.doFilter()之前的代碼——>……——>第n個過濾器的chain.doFilter()之前的代碼——>所請求 servlet的service()方法中的代碼——>所請求servlet的doGet()或doPost()方法中的代碼——>第n個過濾器的chain.doFilter()之後的代碼——>……——>第二個過濾器的chain.doFilter()之後的代碼——> 第一個過濾器的chain.doFilter()之後的代碼。

1、攔截器是基於java反射機制的,而過濾器是基於函數回調的。
2、過濾器依賴與servlet容器,而攔截器不依賴與servlet容器。
3、攔截器只能對Action請求起作用,而過濾器則可以對幾乎所有請求起作用。
4、攔截器可以訪問Action上下文、值棧裏的對象,而過濾器不能。
5、在Action的生命週期中,攔截器可以多次調用,而過濾器只能在容器初始化時被調用一次。

過濾器是在java web中,你傳入的request,response提前過濾掉一些信息,或者提前設置一些參數,然後再傳入servlet或者struts的 action進行業務邏輯,
比如過濾掉非法url(不是login.do的地址請求,如果用戶沒有登陸都過濾掉),
或者在傳入servlet或者 struts的action前統一設置字符集,
或者去除掉一些非法字符(聊天室經常用到的,一些罵人的話)。。。

攔截器 可通過的是符合條件的action。 攔截器本身是一個普通的Java對象,它能動態攔截Action調用,
Action執行前後執行攔截器本身提供的各種個樣的Web項目需求。也可以阻止Action的執行,同時也可以提取
Action中可以複用的部分。



Advice
  +-- AfterAdvice
    +-- AfterReturningAdvice
    +-- ThrowsAdvice
  +-- BeforeAdvice
    +-- MethodBeforeAdvice
  +-- Interceptor
    +-- MethodInterceptor

上面是spring代碼中Advice繼承層次的一個部分快照。從這個就可以看出Interceptor和Advice的關係。Advice是AOP編程中某一個方面(Aspect)在某個連接點(JoinPoint)所執行的特定動作,這個連接點(JoinPoint)可以是自定義的;而Spring中的 Interceptor更多關注程序運行時某些特定連接點(屬性訪問,對象構造,方法調用)時的動作。確切的說,Interceptor的範圍更窄一些


2. 性能:spring會稍微比struts快。spring mvc是基於方法的設計,而sturts是基於類

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


4. 設計思想上:struts更加符合oop的編程思想, spring就比較謹慎,在servlet上擴展。

5. intercepter的實現機制:struts有以自己的interceptor機制,spring mvc用的是獨立的AOP方式。

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


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章