程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> springmvc學習筆記(22)-springmvc開發小結

springmvc學習筆記(22)-springmvc開發小結

編輯:JAVA綜合教程

springmvc學習筆記(22)-springmvc開發小結


springmvc學習筆記(22)-springmvc開發小結


本文對springmvc系列博文進行小結

springmvc框架

springmvc_核心架構圖

DispatcherServlet前端控制器:接收request,進行response HandlerMapping處理器映射器:根據url查找Handler。(可以通過xml配置方式,注解方式) HandlerAdapter處理器適配器:根據特定規則去執行Handler,編寫Handler時需要按照HandlerAdapter的要求去編寫。 Handler處理器(後端控制器):需要程序員去編寫,常用注解開發方式
Handler處理器執行後結果是ModelAndView,具體開發時Handler返回方法值類型包括:ModelAndViewString(邏輯視圖名)、void(通過在Handler形參中添加request和response,類似原始 servlet開發方式,注意:可以通過指定response響應的結果類型實現json數據輸出) View Resolver視圖解析器:根據邏輯視圖名生成真正的視圖(在springmvc中使用View對象表示) View視圖:jsp頁面,僅是數據展示,沒有業務邏輯。

注解開發

使用注解方式的處理器映射器和適配器




在實際開發,使用代替上邊處理器映射器和適配器配置。

@controller注解必須要加,作用標識類是一個Handler處理器。 @requestMapping注解必須要加,作用:
1、對url和Handler的方法進行映射。 2、可以窄化請求映射,設置Handler的根路徑,url就是根路徑+子路徑請求方式 3、可以限制http請求的方法

映射成功後,springmvc框架生成一個Handler對象,對象中只包括 一個映射成功的method。

注解開發中參數綁定

將request請求過來的key/value的數據(理解一個串),通過轉換(參數綁定的一部分),將key/value串轉成形參,將轉換後的結果傳給形參(整個參數綁定過程)。

springmvc所支持參數綁定:

1、默認支持很多類型:HttpServletRequestresponsesessionmodel/modelMap(將模型數據填充到request域) 2、支持簡單數據類型,整型、字符串、日期..等
只要保證request請求的參數名和形參名稱一致,自動綁定成功 如果request請求的參數名和形參名稱不一致,可以使用@RequestParam(指定request請求的參數名),@RequestParam加在形參的前邊。 3、支持pojo類型
只要保證request請求的參數名稱和pojo中的屬性名一致,自動將request請求的參數設置到pojo的屬性中。 4、包裝類型pojo參數綁定
第一種方法:在形參中添加HttpServletRequest request參數,通過request接收查詢條件參數。 第二種方法:在形參中讓包裝類型的pojo接收查詢條件參數。 5、集合類型參數綁定
數組綁定:方法形參使用數組接收頁面請求的多個參數 list綁定:使用List接收頁面提交的批量數據,通過包裝pojo接收,在包裝pojo中定義list屬性 map綁定:在包裝類中定義Map對象,並添加get/set方法,action使用包裝對象接收

注意:形參中即有pojo類型又有簡單類型,參數綁定互不影響。

自定義參數綁定

日期類型綁定自定義:

定義的Converter<源類型,目標類型>接口實現類,比如:Converter,表示:將請求的日期數據串轉成java中的日期類型。

注意:要轉換的目標類型一定和接收的pojo中的屬性類型一致。

將定義的Converter實現類注入到處理器適配器中。





    
    
        
            
        
    

springmvc和struts2區別

springmvc面向方法開發的(更接近service接口的開發方式),struts2面向類開發。

springmvc可以單例開發,struts2只能是多例開發。

校驗

服務端校驗:

控制層conroller:校驗頁面請求的參數的合法性。在服務端控制層conroller校驗,不區分客戶端類型(浏覽器、手機客戶端、遠程調用) 業務層service(使用較多):主要校驗關鍵業務參數,僅限於service接口中使用的參數。 持久層dao:一般是不校驗的。

一般使用hibernate的校驗框架,依賴hibernate-validator.jar,jboss-logging.jar,validation-api.jar這幾個jar包

開發步驟

在springmvc.xml中添加校驗器 校驗器注入到處理器適配器中 在CustomValidationMessages.properties配置校驗錯誤信息 在pojo中添加校驗規則 在控制器中對參數注解@Validated來捕獲和顯示校驗錯誤信息

分組校驗

定義校驗分組 在校驗規則中添加分組 在controller方法使用指定分組的校驗

數據回顯

數據回顯有三種方法

1.springmvc默認對pojo數據進行回顯。
pojo數據傳入controller方法後,springmvc自動將pojo數據放到request域,key等於pojo類型(首字母小寫) 使用@ModelAttribute指定pojo回顯到頁面在request中的key 2.@ModelAttribute還可以將方法的返回值傳到頁面 3.使用最簡單方法使用model,可以不用@ModelAttribute

異常處理

系統的dao、service、controller出現都通過throws Exception向上拋出,最後由springmvc前端控制器交由異常處理器進行異常處理。

springmvc提供全局異常處理器(一個系統只有一個異常處理器)進行統一異常處理。

全局異常處理器處理思路:

解析出異常類型

如果該異常類型是系統自定義的異常,直接取出異常信息,在錯誤頁面展示 如果該異常類型不是系統自定義的異常,構造一個自定義的異常類型(信息為“未知錯誤”)

拋出異常的位置

如果與業務功能相關的異常,建議在service中拋出異常。 與業務功能沒有關系的異常,建議在controller中拋出。

上傳圖片

開發步驟

在頁面form中提交enctype=”multipart/form-data”的數據時,需要springmvc對multipart類型的數據進行解析。 在springmvc.xml中配置multipart類型解析器 加入上傳圖片的jar:commons-fileupload 創建圖片虛擬目錄存儲圖片

json數據交互

兩種json數據交互的形式:

請求json、輸出json,要求請求的是json串,所以在前端頁面中需要將請求的內容轉成json,不太方便。 請求key/value、輸出json。此方法比較常用。

需要的依賴:

jackson-databind jackson-mapper-asl

在注解適配器中加入messageConverters

<code class="language-xml hljs ">
<!--{cke_protected}{C}%3C!%2D%2D%E6%B3%A8%E8%A7%A3%E9%80%82%E9%85%8D%E5%99%A8%20%2D%2D%3E-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <property name="messageConverters">
    <list>
    <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
    </list>
    </property>
</bean></code>

注意:如果使用則不用定義上邊的內容。

在controller的返回值上加注解@ResponseBody來將java對象輸出json,返回json格式數據

RESTful支持

@RequestMapping(value="/ itemsView/{id}"){×××}占位符,請求的URL可以是/viewItems/1/viewItems/2,通過在方法中使用@PathVariable獲取{×××}中的×××變量。@PathVariable用於將請求URL中的模板變量映射到功能處理方法的參數上。

如果@RequestMapping中表示為/itemsView/{id},id和形參名稱一致,@PathVariable不用指定名稱。

同時需要配置前端控制器。若要訪問靜態資源,還需在springmvc.xml中添加靜態資源解析方法,如

攔截器

攔截器定義

定義攔截器,實現HandlerInterceptor接口。接口中提供三個方法。可以從名稱和參數看出各個接口的順序和作用

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
參數最少,只有三個 進入 Handler方法之前執行 用於身份認證、身份授權。比如身份認證,如果認證通過表示當前用戶沒有登陸,需要此方法攔截不再向下執行 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception
多了一個modelAndView參數 進入Handler方法之後,返回modelAndView之前執行 應用場景從modelAndView出發:將公用的模型數據(比如菜單導航)在這裡傳到視圖,也可以在這裡統一指定視圖 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception
多了一個Exception的類型的參數 執行Handler完成執行此方法 應用場景:統一異常處理,統一日志處理

攔截器的配置

針對HandlerMapping配置(一般不推薦)
springmvc攔截器針對HandlerMapping進行攔截設置,如果在某個HandlerMapping中配置攔截,經過該HandlerMapping映射成功的handler最終使用該攔截器 類似全局的攔截器
springmvc配置類似全局的攔截器,springmvc框架將配置的類似全局的攔截器注入到每個HandlerMapping中。

攔截器測試及其應用

鏈式執行測試

兩個攔截器都放行
preHandle方法按順序執行,postHandle和afterCompletion按攔截器配置的逆向順序執行 攔截器1放行,攔截器2不放行
攔截器1放行,攔截器2 preHandle才會執行。 攔截器2 preHandle不放行,攔截器2 postHandle和afterCompletion不會執行。 只要有一個攔截器不放行,postHandle不會執行。 兩個攔截器都不放
攔截器1 preHandle不放行,postHandle和afterCompletion不會執行。 攔截器1 preHandle不放行,攔截器2不執行。

應用

統一日志處理攔截器,需要該攔截器preHandle一定要放行,且將它放在攔截器鏈接中第一個位置。 登陸認證攔截器,放在攔截器鏈接中第一個位置。權限校驗攔截器,放在登陸認證攔截器之後。(因為登陸通過後才校驗權限,當然登錄認證攔截器要放在統一日志處理攔截器後面)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved