1. 程式人生 > >框架學習--springmvc--01

框架學習--springmvc--01

一、概述

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提供兩種使用途徑: