本文對springmvc系列博文進行小結
DispatcherServlet
前端控制器:接收request,進行response HandlerMapping
處理器映射器:根據url查找Handler。(可以通過xml配置方式,注解方式) HandlerAdapter
處理器適配器:根據特定規則去執行Handler,編寫Handler時需要按照HandlerAdapter的要求去編寫。 Handler
處理器(後端控制器):需要程序員去編寫,常用注解開發方式。ModelAndView
,具體開發時Handler
返回方法值類型包括:ModelAndView
、String
(邏輯視圖名)、void
(通過在Handler形參中添加request和response,類似原始 servlet開發方式,注意:可以通過指定response響應的結果類型實現json數據輸出) View Resolver
視圖解析器:根據邏輯視圖名生成真正的視圖(在springmvc中使用View對象表示) View
視圖:jsp頁面,僅是數據展示,沒有業務邏輯。
在實際開發,使用
代替上邊處理器映射器和適配器配置。
@controller
注解必須要加,作用標識類是一個Handler處理器。 @requestMapping
注解必須要加,作用:映射成功後,springmvc框架生成一個Handler對象,對象中只包括 一個映射成功的method。
將request請求過來的key/value的數據(理解一個串),通過轉換(參數綁定的一部分),將key/value串轉成形參,將轉換後的結果傳給形參(整個參數綁定過程)。
springmvc所支持參數綁定:
1、默認支持很多類型:HttpServletRequest
、response
、session
、model/modelMap
(將模型數據填充到request域) 2、支持簡單數據類型,整型、字符串、日期..等@RequestParam
(指定request請求的參數名),@RequestParam
加在形參的前邊。 3、支持pojo類型HttpServletRequest request
參數,通過request接收查詢條件參數。 第二種方法:在形參中讓包裝類型的pojo接收查詢條件參數。 5、集合類型參數綁定get/set
方法,action使用包裝對象接收
注意:形參中即有pojo類型又有簡單類型,參數綁定互不影響。
自定義參數綁定
日期類型綁定自定義:定義的Converter<源類型,目標類型>
接口實現類,比如:Converter
,表示:將請求的日期數據串轉成java中的日期類型。
注意:要轉換的目標類型一定和接收的pojo中的屬性類型一致。
將定義的Converter實現類注入到處理器適配器中。
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數據進行回顯。@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,不太方便。 請求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格式數據
@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
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception
鏈式執行測試
兩個攔截器都放行應用
統一日志處理攔截器,需要該攔截器preHandle一定要放行,且將它放在攔截器鏈接中第一個位置。 登陸認證攔截器,放在攔截器鏈接中第一個位置。權限校驗攔截器,放在登陸認證攔截器之後。(因為登陸通過後才校驗權限,當然登錄認證攔截器要放在統一日志處理攔截器後面)