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

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

標籤: springmvc前端


[TOC]java


本文對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頁面,僅是數據展現,沒有業務邏輯。

註解開發

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

<!--註解映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<!--註解適配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

在實際開發,使用<mvc:annotation-driven>代替上邊處理器映射器和適配器配置。web

  • @controller註解必需要加,做用標識類是一個Handler處理器。
  • @requestMapping註解必需要加,做用:
    • 一、對url和Handler的方法進行映射。
    • 二、能夠窄化請求映射,設置Handler的根路徑,url就是根路徑+子路徑請求方式
    • 三、能夠限制http請求的方法

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

註解開發中參數綁定

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

springmvc所支持參數綁定:後端

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

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

自定義參數綁定數組

  • 日期類型綁定自定義:

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

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

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

<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>

<!-- conversionService -->
<bean id="conversionService"
	class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
	<!-- 轉換器 -->
	<property name="converters">
		<list>
			<bean class="cn.itcast.ssm.controller.converter.CustomDateConverter"/>
		</list>
	</property>
</bean>

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

<!--註解適配器 -->
<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>

注意:若是使用<mvc:annotation-driven />則不用定義上邊的內容。

在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中添加靜態資源解析方法,如<mvc:resources location="/js/" mapping="/js/**"/>

攔截器

攔截器定義

定義攔截器,實現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必定要放行,且將它放在攔截器連接中第一個位置。
  • 登錄認證攔截器,放在攔截器連接中第一個位置。權限校驗攔截器,放在登錄認證攔截器以後。(由於登錄經過後才校驗權限,固然登陸認證攔截器要放在統一日誌處理攔截器後面)
相關文章
相關標籤/搜索