框架學習--springmvc--01
阿新 • • 發佈:2018-11-28
一、概述
1、springmvc 特點
- 註解開發很方便;
- 支援rest風格url;
2、HelloWorld程式
- 導包:四個spring 核心包、一個aop包、兩個 web 包和一個logging 包;
- 配置 web xml 就是配置一個 dispatcherServlet,設定開機自啟,指定springmvc配置檔案位置;
- 配置springmvc檔案,就是一個包掃描和一個檢視解析器(前後綴);
- 寫一個類用@controller 標記,其中的方法用@requestMapping來實現和url 的對映關係;
二、使用及原理(註解開發)
1、@requestMapping 註解
(1)可以用在方法和類上,起到窄化請求的作用;
(2)其中的屬性還包含 method、param 和 header,都是更加精確請求的作用;
(3)@PathVariable 註解指定 url 佔位符和方法引數之間的對映;
2、rest 風格 URL
(1)CRUD 示例
- 新增:/order post
- 刪除:/order/1 delete
- 修改:/order/1 put
- 查詢:/order/1 get
(2)put 和 delete 請求怎麼傳送
- web xml 中配置 HiddenhttpMethodFilter;
- 傳送 post 請求;
- 表單中增加一個 name=“_method” 的隱藏域,其值是 delete 和 put;
3、引數相關注解
(1)@RequestParam註解
- 作用就是對映請求引數;
- 註解有三個屬性:value(請求引數的名字)、required(預設為true)、defaultValue(請參的預設值)
(2)@RequestHeader 和 @CookieValue 註解
- 作用就是將請求頭和cookie 的資訊對映到方法的引數;
- 註解的屬性和用法都和requestParam 差不多;
(3)請求引數對映到 pojo
- 保證請求引數的名字和pojo 的屬性名一致即可自動完成對映,還支援級聯屬性;
- 名字不一則無法對映,相應的值為 null;
(4)方法引數還支援 servlet 的原生 API,支援的型別包括:
- request、response、session、Principal
- InputStream、outputStream、reader、writer
4、模型資料處理
(1)方法返回 ModelAndView
- mv 可以包含檢視和模型的資訊;最終這些資料都是存放到 request 域中;
(2)方法可以新增 Map 或者 Model 型別的引數
(3)@sessionAttributes
- 這個註解是類註解,不能修飾方法;
- 可以通過名稱指定也可以通過型別來指定放到 session 中的資料;
5、目標方法 pojo 型別入參過程
(1)@ModelAttribute註解:這個註解標記的方法會在每個目標方法執行前被執行
1、基本過程
- 執行這個註解修飾的方法,從資料庫中取出物件放入 map,鍵值類名首字母小寫;
- 從 map 中取出物件,並把表單傳來的請求引數賦值到物件的相應屬性中;
- 物件傳入目標方法引數;
2、修飾目標方法引數
- springmvc 會用這個註解中指定的名稱到 implicitModel 去找物件,找到就直接入參;
- 同時會將這個名稱為key,pojo物件為 value 存到 request 中;
(2)pojo 入參過程
(3)使用 @sessionAttributes 註解丟擲異常的解決方法
- sessionAttributes 中的名稱和方法引數 modelAttribute 中指定的名稱不一致即可;
- 要麼就是必須得有 modelAttribute 標記的方法,保證能夠取到 sessionAttributes 名稱對應的物件就不會拋異常;
6、檢視解析
(1)檢視解析流程
- 目標方法無論返回的是 string、model還是 mv,最終都是包裝成 modelAndView返回;
- 檢視的作用:渲染模型資料;
- 檢視解析器的作用:將邏輯檢視轉換為物理檢視;
- 常用的檢視解析器:BeanNameViewResolver 和 InternalResourceViewResolver;配置多個解析器的話存在優先順序的;
(2)jstlView 和 view-controller 標籤
- 專案加入jstl 的jar,springmvc 自動將檢視解析為 jstlView;
- 若要使用 jstl fmt 標籤要在 springmvc 的配置檔案中配置一個 messageSource;
- view-controller 和 annotion-driven 標籤合起來使用可以實現直接將請求跳轉到檢視,不用經過 handler;
(3)自定義檢視和重定向
- 自定義檢視:實現view 介面,重寫 render 方法;最後還要在 springmvc 的配置檔案中配置beanNameViewresolver,注意解析器的優先順序;
- 轉發和重定向:就是在 return 的 String 中加入字首 forward: 或者 redirect:
三、其他補充
1、RESTFULL-CRUD
(1)spring 的表單標籤
(2)springmvc 的靜態資源對映
(3)a 標籤的 get 請求轉 post 通過 js 完成
(4)方法入參的時候物件在 map 中的鍵名沒有指定的話預設就是類名第一個字母小寫
2、資料繫結
(1)資料繫結的流程:核心就是DataBinder
(2)資料轉換
- springmvc 內建了很多型別轉換器,一般情況下不需要我們自己寫;
- 自定義型別轉換器
- 第一步:實現 Converter<S,T>介面,重寫方法實現想要的型別轉換;
- 第二步:在 spring 的 ioc 容器中配置convertionService;
- 第三步:mvc:annotion-driven註解中配置 convertionService,將這個註冊到 springmvc 的上下文中;
(3)關於mvc:annotation-driven
- 這個標籤會自動註冊RequestMappingHandlerMapping 、RequestMappingHandlerAdapter、ExceptionHandlerExceptionResolver 三個bean;
- 此外還支援配置convertionService,還支援格式化註解(@NumberFormat annotation、@DateTimeFormat)驗證註解(@Valid)請求響應體註解(@RequestBody 和 @ResponseBody)
(4)@InitBinder 註解
- @InitBinder 標識的方法,可以對 WebDataBinder 對 象進行初始化;
- WebDataBinder 是 DataBinder 的子類,用 於完成由表單欄位到 JavaBean 屬性的繫結 ;
- @InitBinder方法不能有返回值,它必須宣告為void;
- @InitBinder方法的引數通常是WebDataBinder;
3、資料格式化
(1)前提
- 資料格式化相關的bean:FormattingConversionServiceFactroyBean;
- <mvc:annotation-driven/> 預設建立的ConversionService 例項即為FormattingConversionServiceFactroyBean;
(2)日期格式化和數值格式化示例
4、資料校驗
(1)校驗框架
- JSR 303 是 Java 為 Bean 資料合法性校驗提供的標準框架, 已包含在 JavaEE 6.0 中;
- Hibernate Validator 是 Bean Validation 的參考實現 .;
- Hibernate Validator 提供了 JSR 303 規範中所有內建 constraint 的實現,除此之外還有一些附加的 constraint
(2)可以實現的校驗
(3)校驗的流程
- LocalValidatorFactoryBean是實現校驗的bean;
- annotion-driven會預設裝配好一個 LocalValidatorFactoryBean;
- 在處理方法的入參上標註@valid 註解,入參還可以加一個 bindingResult的引數;
- 需校驗的 Bean 物件和其繫結結果物件bindingResult或錯誤物件時成對出現的,之間不允許宣告其他的入參;
- 在對應 pojo 的屬性欄位上加上校驗註解;
- 在方法裡獲取校驗的結果(getFieldError、getFieldErrors、getFieldValue、getErrorCount);
- 在頁面上顯示錯誤( 錯誤資訊會隨一個隱含模型傳到jsp,頁面直接用<form:errors path=“userName”>就可以獲取);
(4)錯誤提示訊息的國際化
- 建一個國際化properties檔案,裡面錯誤的鍵名類似Pattern.user.password,值是要顯示的訊息;
- 在 spring 的ioc 容器裡配置一個 messageSource 註冊國際化資原始檔;
5、JSON處理
(1)步驟
- 加入三個 jackson 的jar;
- 寫目標方法返回值為 json 對應的物件和集合;
- 在方法加上responseBody 的註解;
(2)原理
- 底層是通過 HttpMessageConverter<T> 來實現的,具體的原理如下:
- spring提供兩種使用途徑: