SpringMVC(二)

SpringMVC(二)spring

經過上一篇 SpringMVC 的博文,咱們掌握瞭如何新建 SpringMVC 項目,瞭解了其大體工做原理,瞭解了經常使用的註解,知道了 REST 風格的架構,經過源碼初步瞭解到了數據綁定的流程。接着上次咱們繼續對 SpringMVC 進行學習。json

數據綁定、校驗、格式化

  • SpringMVC 經過反射機制對目標處理方法進行解析,將請求消息綁定處處理方法的入參中。
  • 數據綁定流程
    1. SpringMVC 將 ServletRequest 對象及目標方法的入參實例傳遞給 WebDataBinderFactory 實例,以建立 WebDataBinder 實例
    2. DataBinder 調用裝配在 SpringMVC 上下文中的 ConversionService 組件進行數據類型轉換、數據格式化工做,將請求信息填充到入參對象中
    3. 調用 Validator 組件對已經綁定了請求信息的入參對象進行數據合法性校驗,並最終生成數據綁定結果 BindingData 對象
    4. SpringMVC 抽取 BindingResult 中的入參對象和校驗錯誤對象,將他們賦給處理方法的響應入參
  • 配置
    • 該配置在開發中通常都會添加。
    • 功能
      • 會自動註冊 RequestMappingHandlerMapping、RequestMappingHandlerAdapter 與 ExceptionHandlerExceptionResolver 三個 bean
      • 支持使用 ConversionService 實例對錶單參數進行類型轉換
      • 支持使用 @NumberFormatannotation、@DataTimeFormat 註解完成數據類型的格式化
      • 支持使用 @Valid 註解對 JavaBean 進行 JSR 303 驗證
      • 支持使用 @RequestBody@ReponseBody 註解(處理 Ajax 請求)
  • @InitBinder 註解
    • 由 @InitBinder 標識的方法,能夠對 WebDataBinder 對象進行初化。WebDataBinder 是 DataBinder 的子類,用於完成由表單字段 JavaBean 屬性的綁定
    • @InitBinder方法不能有返回值,它必須聲明爲 void
    • @InitBinder方法的參數一般是 WebDataBinder,它能夠對 DataBinder 進行初始化和一些設置,如設置綁定過程當中使得某些字段不被賦值
  • 數據格式化
    • Spring 在格式化模塊中定義了一個實現 ConversionService 接口的 FormattingConversionService 實現類,該實現類擴展了 GenericConversionService,所以它既具備類型轉換的功能,又具備格式化的功能
    • 默認建立的 ConversionService 實例即爲 FormattingConversionServiceFactroyBean(支持數據和日期的格式化)
    • FormattingConversionServiceFactroyBean 內部已經註冊了 :
      • NumberFormatAnnotationFormatterFactroy:支持對數字類型的屬性使用 @NumberFormat 註解
      • JodaDateTimeFormatAnnotationFormatterFactroy:支持對日期類型的屬性使用 @DateTimeFormat 註解架構

        @DateTimeFormat(pattern = "yyyy/mm/dd")
          private Date birth;
          @NumberFormat(pattern = "#,###,###.#")
          private float salary;
  • 數據校驗
    • 如何校驗
      • 使用 JSR303 驗證標準
      • 加入 hibernate-validator 驗證框架,即 jar 包
      • 加入 註解
      • 在 bean 屬性上添加對應的註解
      • 目標方法 bean 的屬性上添加 @valid 註解
      • 注意:須要校驗的 Bean 對象和其綁定結果或錯誤對象成對出現時,他們之間不容許聲明其餘入參
    • JSR 303
      • JSR 303 是 Java 爲 Bean 數據合法性校驗提供的標準框架,它已經包含在 JavaEE 6.0 中 .
      • JSR 303 經過在 Bean 屬性上標註相似於 @NotNull、@Max 等標準的註解指定校驗規則,並經過標準的驗證接口對 Bean 進行驗證
    • jar 包mvc

      <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>4.3.1.Final</version>
        </dependency>
    • 實體上添加註解
    • 處理方法中添加 @valid 註解

格式化、校驗錯誤的消息處理

  • 若數據的校驗以及格式化出錯,咱們先將其默認的錯誤消息打印到控制檯,下面的代碼將打印出具體的哪個字段的什麼錯誤。app

    @RequestMapping(value = "/emp", method = RequestMethod.POST)
      public String add(@Valid Employee employee, Errors result, Map<String, Object> map) {
      //        打印錯誤消息
          if (result.getErrorCount() > 0) {
              System.out.println("出錯了!");
              for (FieldError fieldError : result.getFieldErrors()) {
                  System.out.println(fieldError.getField() + " --> " + fieldError.getDefaultMessage());
              }
          }
          employeeDao.save(employee);
          return "redirect:/employeeList";
      }
  • 將錯誤消息顯示在頁面上
    • 轉回原頁面,並會回顯輸入的錯誤記錄
    • 頁面上使用標籤顯示錯誤消息
  • 如何覆蓋錯誤消息以及將錯誤消息國際化
    • 數據匹配是指是否和規定的格式同樣,數據校驗是指是否符合規定,咱們能夠配置國際化資源文件 i18n.properties,以及在 spring-c···onfig.xml 文件中配國際化資源,從而達到國際化資源消息的目標
    • properties 文件中聲明不一樣錯誤對應不一樣的錯誤消息格式,對於校驗使用對應的校驗前綴(如 NotEmpty),對於類型錯誤使用 typeMismatch
    • properties 文件中的第二個爲 @ModelAttribute 標註的 value,或是類名的第一個字母消息,如 employee

SpringMVC 處理 JSON

  • 導入 jar 包框架

    <spring.verison>4.3.8.RELEASE</spring.verison>
          <jackson.version>2.8.7</jackson.version>
      <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-core</artifactId>
          <version>${jackson.version}</version>
      </dependency>
      <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-annotations</artifactId>
          <version>${jackson.version}</version>
      </dependency>
      <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-databind</artifactId>
          <version>${jackson.version}</version>
      </dependency>
  • 目標操做方法添加註解(目標方法返回一個對象或集合post

    @ResponseBody
      @RequestMapping("/testJson")
      public Collection<Employee> testJson() {
          System.out.println("Succ");
          Collection<Employee> values = employeeDao.getEmployeeMap().values();
      return values;
      }
  • 目標頁面發送 Ajax 請求以及處理返回值學習

    $(function () {
          $("#testJson").click(function () {
              var url = this.href;
              var args = {};
    
              $.post(url, args, function(data) {
                  for (var i = 0; i < data.length; i++) {
                      var lastName = data[i].lastName;
                      var email = data[i].email;
    
                      alert(lastName + ", " + email);
                  }
              })
              return false;
          })
      })

SpringMVC 運行流程(其中 爲請求靜態資源)

SpringMVC 和 Spring

  • 須要進行 Spring 整合 SpringMVC 嗎?
    • 須要,一般狀況下,將相似於數據源,事務,整合其餘框架都是放在 Spring 的配置文件中,而不是 SpringMVC 文件中,實際上放入 Spring 配置文件對應的 IOC 容器中的還有 Service 和 Dao
    • 不須要,都放在 SpringMVC 的配置文件中,也能夠分多個 Spring 的配置文件,而後使用 import 節點導入其餘的配置文件
  • 問題
    • 若 Spring 的 IOC 容器和 SpringMVC 的 IOC 容器掃描的包有重合的部分,就會致使 bean 被建立兩次
  • 解決
    • 使用 exclude-filterinclude-filter 子節點規定只掃描的註解,SpringMVC 的 IOC 容器只掃描 @Controller(Handler 類) 和 @ControllerAdvice(處理異常的類),Spring 不掃描這兩個註解註解的類
  • SpringMVC IOC 容器中的 bean 能夠引用 Spring IOC 容器中的 Bean,反之不行。

大牛們,以爲有任何問題和不足還但願指出,共同進步,謝謝!this

相關文章
相關標籤/搜索