1. 程式人生 > >D44-SpringMVC(01)

D44-SpringMVC(01)

一、SpringMvc的概述

  1. Web層
    a. 接受瀏覽器的請求引數servelet
    b. 封裝引數到物件JavaBean
    c. 響應資料到頁面jsp
    d. 涉及mvc思想(將控制,邏輯,展示相分離的思想)
    e. web層框架又稱為mvc框架
  2. Service:各種業務需求,事務
    • spring(類,開啟事務,提交事務,釋放資源)
  1. Dao層:
    • JdbcTemplate
    • Mybatis
    • JPA:
      • 規範(一套介面)
      • 所有的orm框架都實現了這個介面
  1. MVC
    a. MVC是一種設計思想
    b. 作用: 將邏輯,業務,檢視相分離的一種思想,各自專注於做自己的事情。
    c. M:model(模型) JavaBean
    d. V(view):jsp
    e. C(controller):控制器 servlet(SpringMvc)
  2. spring提供一個子框架, 為web層提供一個框架
    a. 前端控制器:
    dispatcherServlet
    b. springmvc提供好了
    c .webxml做配置

二、入門案例

  1. springmvc的訪問方式
    • 匯入spring的座標
    • 在web.xml中配置前端控制器,還得讓前端控制器載入- - spring配置檔案
    • 編寫spring配置檔案,做瀏覽器的訪問路徑和類方法的對映
    • 編寫類和方法
    • 瀏覽器編寫路徑訪問
  1. 環境的依賴座標:
    • ioc座標
    • Mvc相關的座標(Spring-web,Spring-webmvc)

2.2 搭建環境

  1. 建立maven-web工程,引入座標
  2. 建立類和方法
  3. 配置前端控制器
  4. 配置springmvc的配置檔案

2.3 SpringMVC的執行過程

在這裡插入圖片描述

2.4 SpringMVC中涉及的元件

  1. DispatcherServlet :前端控制器
    • 使用者請求到達前端控制器,它就相當於MVC模式中的C,dispatcherServlet是整個流程控制的中心,由它呼叫其他元件處理使用者的請求,dispatcherServlet 的存在降低了元件之間 的 耦合性
  • web.xml中

<!--配置dispatcherServlet-->
<servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--初始化就載入spirng配置檔案-->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
    <!--<load-on-startup>:將servlet由第一次訪問才建立變成伺服器啟動就建立-->
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <!--
      /*: 攔截所有 包含html和jsp
      /:  攔截所有 不包含html和jsp
    -->
   <url-pattern>/</url-pattern>
</servlet-mapping>
  1. < mvc:annotation-driven> 介面卡
    • 整合處理對映器,處理器介面卡。

spring-mvc中

<!--對映器和介面卡-->
<mvc:annotation-driven></mvc:annotation-driven>
  1. 檢視解析器
    • 頁面地址的拼接
      • prefix
      • suffix

spring-mvc中

<!--檢視解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/jsp/"></property>
    <property name="suffix" value=".jsp"></property>
</bean>
  1. @RequestMapping註解
  • 配置請求路徑

    • 可以配置到類上(用於區分模組)也可以配置到方法上
    • Value(path):配置請求路徑
  • -Method:接受請求方式(post,get)預設接受所有請求

    • Params:請求的引數,要求頁面必須攜帶的引數。
  • @Controller:

  • UserController類中

@Controller
public class UserController {
    @RequestMapping(value = "/params1")
    // 頁面請求引數資料封裝:引數式封裝
    // 頁面簡單資料的封裝: 引數名必須和頁面的name屬性名一致
    public String params1(String username,Double age){
        System.out.println(username);
        System.out.println(age);
        return "success"; //檢視解析器  字首+頁面名+字尾
    }
}

三、引數封裝

引數封裝:將頁面請求的引數封裝到物件中。

3.1 簡單資料的封裝

請求的引數名 = 方法名

  1. 頁數請求引數資料封裝:引數式封裝
    • 要求:引數名必須和頁面的name屬性名一致
  • UserController類

@RequestMapping(value = "/params1")
    // 頁面請求引數資料封裝:引數式封裝
    // 頁面簡單資料的封裝: 引數名必須和頁面的name屬性名一致
    public String params1(String username,Double age,Date date){
        System.out.println(username);
        System.out.println(age);
        System.out.println(date);
        return "success"; //檢視解析器  字首+頁面名+字尾
    }

3.2 頁面物件資料的封裝

  • **要求:**保證頁面的name屬性名和物件的屬性名一致即可。

    • 頁面物件list
  • UserController類

 @RequestMapping(value = "/params2")
    public String params2(User user){
        System.out.println(user);
        return "success";
    }

3.3 封裝複雜型別的資料(集合list和map)

  1. List和map是物件中的屬性
  2. 請求引數名 = 集合屬性名[索引 | key].屬性。
  • list集合封裝:
  1. 保證頁面的name屬性名是物件的集合屬性名[角標].屬性名 例如:accounts[0].name
// 頁面物件list集合資料的封裝:
    @RequestMapping(value = "/params3")
    public String params3(User user){
        System.out.println(user);
        return "success";
    }
  • map集合封裝
  1. 保證頁面的name屬性名是物件的map集合屬性名[key].屬性名 例如:maps[aaa].name
// 頁面物件map集合資料的封裝: 
    @RequestMapping(value = "/params4")
    public String params4(User user){
        System.out.println(user);
        return "success";
    }

3.4 處理中文亂碼的過濾器

  1. 細節處理:提供中文亂碼的過濾器
<!--springmvc提供的中文亂碼的過濾器(CharaterEncodingFilter)-->
  <filter>
    <filter-name>characterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <!--告訴filter要使用哪個編碼-->
    <init-param>
      <param-name>encoding</param-name>
      <param-value>utf-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

3.5 自定義型別轉化器

  1. 註冊型別轉化器
 <!--告訴springmvc使用自己的String=Date型別轉換器 不在用預設的String=Date型別轉換器-->
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters"> <!--這個集合中需要裝型別轉換器物件-->
            <array> <!--把自己的型別轉換器給放入資料  -->
                <bean class="cn.utils.StringToDateConverter"></bean>
            </array>
        </property>
    </bean>
  1. 配置使用型別轉化器
<!--配置使用型別轉化器-->
<mvc:annotation-driven conversion-service="conversionService">
</mvc:annotation-driven>

四、註解

  1. @RequestHeader:獲取請求頭的資訊
  2. @CookieValue:獲取cookie的資訊
  3. 屬性:
    • Value:根據請求資訊key獲取值
    • Required:是否必須要傳遞該頭資訊
      • false:不是必須的
      • true:必須要傳遞的。
@RequestMapping(value = "/params6")
    public String params6(@RequestHeader(value = "Host") String header1, @RequestHeader(value = "Connection")String header2,
                          @CookieValue(value = "JSESSIONID")String jsid){
        System.out.println(header1);
        System.out.println(header2);
        System.out.println(jsid);
        return "success";

五、總結

  1. springmvc的環境搭建
    -----1 依靠前端控制器(web.xml)
    ----配置servlet(dispatcherServlet)
    ----伺服器啟動就載入(load-on-startup)
    ----已建立就載入配置檔案(init-param)
    ----設定路徑 / (除了jsp和html以外的所有資源)
  2. 建立spirng-mvc.xml配置檔案
    ----- ioc掃描器
    -----對映器和介面卡 (mvc:anntation-driver)
    -----檢視解析器 (字首和字尾)
    -----自定義的型別轉換器的配置
  3. 建立類和方法
    -----封裝簡單資料
    -----封裝物件資料
    -----封裝物件的list/map資料
    ----獲取servlet的api(request response session)
  • 封裝過程中產生的細節:
    • 使用了springmvc提供的解決中文亂碼的filter(charaterEncodingFilter)
    • 自定義了String轉日期型別的型別轉換器(配置)
    • 使用了springmvc提供的2個註解
      • @RequestHeader:獲取請求的頭資訊
      • @cookieValue:獲取cookie的jsid