SpringMVC最詳細筆記partⅠ

  • 2020 年 3 月 28 日
  • 筆記

一、springMVC-quickStar

  • 解決maven載入項目過慢
archetypeCatalog  internal  
  • 導入依賴
<!-- 版本鎖定 -->  <properties>      <spring.version>5.0.2.RELEASE</spring.version>  </properties>    <dependencies>      <dependency>          <groupId>org.springframework</groupId>          <artifactId>spring-context</artifactId>          <version>${spring.version}</version>      </dependency>        <dependency>          <groupId>org.springframework</groupId>          <artifactId>spring-web</artifactId>          <version>${spring.version}</version>      </dependency>        <dependency>          <groupId>org.springframework</groupId>          <artifactId>spring-webmvc</artifactId>          <version>${spring.version}</version>      </dependency>        <dependency>          <groupId>javax.servlet</groupId>          <artifactId>servlet-api</artifactId>          <version>2.5</version>          <scope>provided</scope>      </dependency>        <dependency>          <groupId>javax.servlet.jsp</groupId>          <artifactId>jsp-api</artifactId>          <version>2.0</version>          <scope>provided</scope>      </dependency>  </dependencies>  
  • web.xml配置
<!-- SpringMVC的核心控制器 -->  <servlet>      <servlet-name>dispatcherServlet</servlet-name>      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>      <!-- 配置Servlet的初始化參數,讀取springmvc的配置文件,創建spring容器 -->      <init-param>  		<param-name>contextConfigLocation</param-name>          <param-value>classpath:springmvc.xml</param-value>      </init-param>      <!-- 配置servlet啟動時載入對象 -->      <load-on-startup>1</load-on-startup>  </servlet>  <servlet-mapping>      <servlet-name>dispatcherServlet</servlet-name>      <url-pattern>/</url-pattern>  </servlet-mapping  
  • springMVC的配置文件
<beans xmlns="http://www.springframework.org/schema/beans"         xmlns:mvc="http://www.springframework.org/schema/mvc"         xmlns:context="http://www.springframework.org/schema/context"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation=" http://www.springframework.org/schema/beans                             http://www.springframework.org/schema/beans/spring-beans.xsd                             http://www.springframework.org/schema/mvc                             http://www.springframework.org/schema/mvc/spring-mvc.xsd                             http://www.springframework.org/schema/context                             http://www.springframework.org/schema/context/spring-context.xsd">      <!-- 配置spring創建容器時要掃描的包 -->      <context:component-scan base-package="club.leyvan"/>        <!-- 配置視圖解析器 -->      <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">          <property name="prefix" value="/WEB-INF/pages/"></property>          <property name="suffix" value=".jsp"></property>      </bean>        <!-- 配置spring開啟註解mvc的支援 -->      <mvc:annotation-driven></mvc:annotation-driven>  </beans>  

在 SpringMVC 的各個組件中,處理器映射器、處理器適配器、視圖解析器稱為 SpringMVC 的三大組件。 使 用 < mvc:annotation-driven> 自動載入 RequestMappingHandlerMapping (處理映射器) 和 RequestMappingHandlerAdapter ( 處 理 適 配 器 ) , 可 用 在 SpringMVC.xml 配 置 文 件 中 使 用 < mvc:annotation-driven>替代註解處理器和適配器的配置。

  • 創建控制器類
package club.leyvan.controller    //控制器類  @Controller  public class HelloController {    	@RequestMapping(path="/hello")  	public String sayHello(){      	System.out.println("Hello SpringMvc");      	return "success";  	}  }    

二、@RequestMapping註解

  1. RequestMapping註解的作用是建立請求URL和處理方法之間的對應關係

  2. RequestMapping註解可以作用在方法和類上

    1. 作用在類上:第一級的訪問目錄

    2. 作用在方法上:第二級的訪問目錄

    3. 細節:路徑可以不編寫 / 表示應用的根目錄開始

    4. 細節:${ pageContext.request.contextPath }也可以省略不寫,但是路徑上不能寫 /

  3. RequestMapping的屬性

    1. path 指定請求路徑的url
    2. value value屬性和path屬性是一樣的 源碼中聲明了:@AliasFor("path")
    3. mthod 指定該方法的請求方式 例:method={RequestMethod.POST}
    4. params 指定限制請求參數的條件 例:params={"username=123"} 請求中必須含有username參數且值必須為123,否則不接受此請求
    5. headers 發送的請求中必須包含的請求頭 例:設置一個防爬蟲的請求頭及值,如果不是用戶請求頭則不接受訪問

三、請求參數綁定

  1. 請求參數的綁定說明

    1. 綁定機制
      1. 表單提交的數據都是k=v格式的 username=haha&password=123
      2. SpringMVC的參數綁定過程是把表單提交的請求參數,作為控制器中方法的參數進行綁定的
      3. 要求:提交表單的name和方法參數的名稱是相同的
    2. 支援的數據類型
      1. 基本數據類型和字元串類型
      2. 實體類型(JavaBean)
      3. 集合數據類型(List、map集合等)
  2. 基本數據類型和字元串類型

    1. 提交表單的name和參數的名稱是相同的

    2. 區分大小寫

    3. 實體類型(JavaBean)

      1. 提交表單的name和JavaBean中的屬性名稱需要一致
      2. 如果一個JavaBean類中包含其他的引用類型,那麼表單的name屬性需要編寫成:對象.屬性 例如:address.name
    4. 給集合屬性數據封裝

      1. JSP頁面編寫方式:list[0].屬性
    5. 請求參數中文亂碼的解決 :在web.xml中配置Spring提供的過濾器類

      <!-- 配置過濾器,解決中文亂碼的問題 -->  <filter>      <filter-name>characterEncodingFilter</filter-name>      <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>      <!-- 指定字符集 -->      <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  
  • 不同類型參數綁定的舉例:

    /**   * 1.基本類型和字元串的參數綁定   * 請求的連接:testParam?username=hehe&password=123   * 輸出結果:username:hehe   *         password: 123   */    @RequestMapping("/testParam")  public String testParam(String username,String password) {      System.out.println("username:"+username);      System.out.println("password:"+password);      return "success";  }    /**   * 2.JavaBean的參數綁定   * account:Account->username:String;password:String;money:Double   * 請求的連接:通過form提交post請求   *			<form action="param/saveAccount" metohd="post">   *				<input type="text" name="username"/>   * 				<input type="password" name="password"/>   * 				<input type="text" name="money"/>   * 				<input type="submit" value="提交"/>   *			</form>   */    @RequestMapping("/saveAccount")  public String saveAccount(Account account) {      System.out.println(account.toString());      return "success";  }    /**   * 3.JavaBean中含有User類型的參數的參數綁定   * account:Account->username:String;password:String;money:Double;user:User   * user:User->uname:String;age:String   * 請求的連接:通過form提交post請求   *			<form action="param/saveAccount" metohd="post">   *				<input type="text" name="username"/>   * 				<input type="password" name="password"/>   * 				<input type="text" name="money"/>   * 				<input type="text" name="user.uname"/>   * 				<input type="text" name="user.age"/>   * 				<input type="submit" value="提交"/>   *			</form>   */    @RequestMapping("/saveAccount")  public String saveAccount(Account account) {      System.out.println(account.toString());      return "success";  }    /**   * 4.集合數組的參數綁定   * account:Account->username:String;password:String;money:Double;user:User   *				list:List<User>;map:Map<String,User>   * 請求的連接:通過form提交post請求   *			<form action="param/saveAccount" metohd="post">   *				<input type="text" name="username"/>   * 				<input type="password" name="password"/>   * 				<input type="text" name="money"/>   * 				<input type="text" name="list[0].uname"/>   * 				<input type="text" name="list[0].age"/>   * 				<input type="text" name="map['隨便'].uname"/>   * 				<input type="text" name="map['隨便']user.age"/>   * 				<input type="submit" value="提交"/>   *			</form>   */    

四、自定義類型轉換器解決日期格式轉換的錯誤

由於頁面提交的數據全都是字元串的形式但SpringMVC內部自動的將字元串類型的數據進行了轉換,大多數的類型都幫助轉換好了,但還有可能存在問題:

默認轉換的日期格式:2020/3/28 但你想要的是2020-3-28這個時候就需要自定義類型轉換器

1.定義一個類、實現介面Converter<S,T> S:源類型 T:目標類型

/**   * 把字元串轉換成日期的轉換器   */  public class StringToDateConverter implements Converter<String, Date>{      /**       * String source 傳入進來的字元串       */      public Date convert(String source) {          // 判斷          if(source == null) {              throw new RuntimeException("參數不能為空");          }          try {              DateFormat df = new SimpleDateFormat("yyyy-MM-dd");              // 解析字元串              Date date = df.parse(source);              return date;          } catch (Exception e) {              throw new RuntimeException("類型轉換錯誤");          }      }  }  

2.在springMVC的配置文件中配置自定義類型轉換器

<!-- 註冊自定義類型轉換器 -->  <bean id="conversionService"class="org.springframework.context.support.ConversionServiceFactoryBean">      <property name="converters">          <set>              <bean class="cn.itcast.utils.StringToDateConverter"/>          </set>      </property>  </bean>  

3.讓自定義的類型轉換器生效

<!-- 開啟Spring對MVC註解的支援 -->  <mvc:annotation-driven conversion-service="conversionService"/>  

五、@RequestParam

1.作用:把請求中指定名稱的參數給控制器中的形參賦值(當形參於參數名不同時使用)。

2.位置:在方法的參數類型前

3.參數:

  1. value:請求參數中的名稱。
  2. required:請求參數中是否必須提供此參數。默認值:true。表示必須提供,如果不提供將報錯。

六、@RequestBody

1.作用:用於獲取請求體內容。直接使用得到是 key=value&key=value…結構的數據,get 請求方式不適用。 用於非同步請求的json數據獲取

2.位置:在方法的參數類型前

3.參數:

  1. required:是否必須有請求體。默認值是:true。當取值為 true 時,get 請求方式會報錯。如果取值為 false,get 請求得到是 null。

七、@PathVariable和RESTful風格

  • @PathVariable

    1.作用:於@RequestMapping("/test/{id}")聯合使用,用於獲取RequestMapping中的sid的值;用於綁定 url 中的佔位符。例如:請求 url 中 /delete/{id},這個{id}就是 url 佔位符。 @PathVariable(name="id")

    url:test/10

    2.位置:在方法的參數類型前

    3.參數:

    1. value:用於指定 url 中佔位符名稱。
    2. required:是否必須提供佔位符。
  • 什麼是 rest:

    REST(英文:Representational State Transfer,簡稱 REST)描述了一個架構樣式的網路系統,比如 web 應用程式。它首次出現在 2000 年 Roy Fielding 的博士論文中,他是 HTTP 規範的主要編寫者之 一。在目前主流的三種 Web 服務交互方案中,REST 相比於 SOAP(Simple Object Access protocol,簡單 對象訪問協議)以及 XML-RPC 更加簡單明了,無論是對 URL 的處理還是對 Payload 的編碼,REST 都傾向於用更加簡單輕量的方法設計和實現。值得注意的是 REST 並沒有一個明確的標準,而更像是一種設計的風格。它本身並沒有什麼實用性,其核心價值在於如何設計出符合 REST 風格的網路介面。

  • restful 的優點

    它結構清晰、符合標準、易於理解、擴展方便,所以正得到越來越多網站的採用。

  • restful 的特性:

    資源Resources):網路上的一個實體,或者說是網路上的一個具體資訊。

    ​ 它可以是一段文本、一張圖片、一首歌曲、一種服務,總之就是一個具體的存在。可以用一個 URI(統一 資源定位符)指向它,每種資源對應一個特定的 URI 。要 獲取這個資源,訪問它的 URI 就可以,因此 URI 即為每一個資源的獨一無二的識別符。

    表現層Representation):把資源具體呈現出來的形式,叫做它的表現層。

    ​ 比如,文本可以用 txt 格式表現,也可以用 HTML 格式、XML 格式、JSON 格式表現,甚至可以採用二進位格式。

    狀態轉化State Transfer):每 發出一個請求,就代表了客戶端和伺服器的一次交互過程。 HTTP 協議,是一個無狀態協議,即所有的狀態都保存在伺服器端。因此,如果客戶端想要操作伺服器,必須通過某種手段,讓伺服器端發生狀態轉化State Transfer)。而這種轉化是建立在表現層之上的,所以 就是 表現層狀態轉化。具體說,就是 HTTP 協議裡面,四個表示操作方式的動詞:GETPOSTPUTDELETE。它們分別對應四種基本操作:GET 用來獲取資源,POST 用來新建資源,PUT 用來更新資源,DELETE 用來 刪除資源。

  • restful 的示例:

    /account/1 HTTP GET : 得到 id = 1 的 account

    /account/1 HTTP DELETE: 刪除 id = 1 的 account

    /account/1 HTTP PUT: 更新 id = 1 的 account

八、@RequestHeader

1.作用:用於獲取請求消息頭。

2.位置:在方法的參數類型前

3.參數:

  1. value:獲取消息頭名稱
  2. required:是否必須有此消息頭

九、@CookieValue

1.作用:用於把指定 cookie 名稱的值傳入控制器方法參數。

2.位置:在方法的參數類型前

3.參數:

  1. value:指定 cookie 的名稱。
  2. required:是否必須有此 cookie。

十、@ModelAttribute

1.作用:它可以用於修飾方法和參數。出現在方法上,表示當前方法會在控制器的方法執行之前,先執行。它可以修飾沒有返回值的方法,也可以修飾有具體返回值的方法。出現在參數上,獲取指定的數據給參數賦值。

3.參數:

  1. value:用於獲取數據的 key。key 可以是 POJO 的屬性名稱,也可以是 map 結構的 key

十一、@SessionAttribute

1.作用:用於將值存入session域中。

2.位置:在類上

3.參數:

  1. value:用於指定存入的屬性名稱
  2. type:用於指定存入的數據類型。

4.其他:

  1. Model類,將值存入request域中
  2. ModelMap類,可以從域中取值,包括session
  3. sessionStatus.setComplete();用於刪除session中的內容