SpringMVC RequestMapping & 請求參數


SpringMVC 概述

  Spring 為展現層提供的基於 MVC 設計理念的優秀的Web 框架,是目前最主流的 MVC 框架之一
  Spring3.0 后全面超越 Struts2,成為最優秀的 MVC 框架
  Spring MVC 通過一套 MVC 注解,讓 POJO 成為處理請求的控制器,而無須實現任何接口。
  支持 REST 風格 URL 請求
  采用了松散耦合可插拔組件結構,比其他 MVC 框架更具擴展性和靈活性

HelloWorld

步驟:
  –加入 jar 包
  –在 web.xml 中配置 DispatcherServlet

		<!-- 
			實際上也可以不通過 contextConfigLocation 來配置 SpringMVC 的配置文件, 而使用默認的.
			默認的配置文件為: /WEB-INF/<servlet-name>-servlet.xml
		-->

  –加入 Spring MVC 的配置文件

	<!-- 配置自定掃描的包 -->
	<context:component-scan base-package="com.atguigu.springmvc"></context:component-scan>

	<!-- 配置視圖解析器: 如何把 handler 方法返回值解析為實際的物理視圖 -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/views/"></property>
		<property name="suffix" value=".jsp"></property>
	</bean>

  –編寫處理請求的處理器,並標識為處理器

 1 @Controller
 2 public class HelloWorld {
 3     /**
 4      * 1. 使用 @RequestMapping 注解來映射請求的 URL
 5      * 2. 返回值會通過視圖解析器解析為實際的物理視圖, 對於 InternalResourceViewResolver 視圖解析器, 會做如下的解析:
 6      * 通過 prefix + returnVal + 后綴 這樣的方式得到實際的物理視圖, 然會做轉發操作
 7      * /WEB-INF/views/success.jsp
 8      */
 9     @RequestMapping("/helloworld")
10     public String hello(){
11         System.out.println("hello world");
12         return "success";
13     }
14 }
helloworld.java

  –編寫視圖

@RequestMapping 映射請求

Spring MVC 使用 @RequestMapping 注解為控制器指定可以處理哪些 URL 請求

1. @RequestMapping 除了修飾方法, 還可來修飾類

  1). 類定義處: 提供初步的請求映射信息。相對於 WEB 應用的根目錄
     2). 方法處: 提供進一步的細分映射信息。 相對於類定義處的 URL。若類定義處未標注 @RequestMapping,則方法處標記的 URL相對於 WEB 應用的根目錄

2. 映射請求參數、請求方法或請求頭

  @RequestMapping 的 value、method、params 及 heads 分別表示請求 URL、請求方法、請求參數及請求頭的映射條件,他們之間是與的關系,聯合使用多個條件可讓請求映射
更加精確化。

  params 和 headers支持簡單的表達式:
    param1: 表示請求必須包含名為 param1 的請求參數
    !param1: 表示請求不能包含名為 param1 的請求參數
    param1 != value1: 表示請求包含名為 param1 的請求參數,但其值不能為 value1
    {“param1=value1”, “param2”}: 請求必須包含名為 param1 和param2 的兩個請求參數,且 param1 參數的值必須為 value1

  method取值有 RequestMethod.POST, RequestMethod.GET 等。

3. Ant 風格資源地址支持 3 種匹配符:

  ?:匹配文件名中的一個字符
   *:匹配文件名中的任意字符
   **: 匹配多層路徑

4. @PathVariable 可以來映射 URL 中的占位符到目標方法的參數中.

  URL 中的 {xxx} 占位符可以通過@PathVariable("xxx") 綁定到操作方法的入參中。

	@RequestMapping("/testPathVariable/{id}")
	public String testPathVariable(@PathVariable("id") Integer id) {
		System.out.println("testPathVariable: " + id);
		return SUCCESS;
	}

 5. REST

REST:即 Representational State Transfer。(資源)表現層狀態轉化。是目前最流行的一種互聯網軟件架構。它結構清晰、符合標准、易於理解、擴展方便,所以正得到越來越多網站的采用

資源(Resources):網絡上的一個實體,或者說是網絡上的一個具體信息。URI 即為每一個資源的獨一無二的識別符。

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

狀態轉化(State Transfer):每發出一個請求,就代表了客戶端和服務器的一次交互過程。

具體說,就是 HTTP 協議里面,四個表示操作方式的動詞:GET、POST、PUT、DELETE。它們分別對應四種基本操作:GET 用來獲取資源,POST 用來新建資源,PUT 用來更新資源,DELETE 用來刪除資源。

  示例:
  /order/1 HTTP GET :得到 id = 1 的 order –
  /order/1 HTTP DELETE:刪除 id = 1的 order –
  /order/1 HTTP PUT:更新id = 1的 order –
  /order HTTP POST:新增 order –
HiddenHttpMethodFilter:瀏覽器 form 表單只支持 GET與 POST 請求,而DELETE、PUT 等 method 並不支持,Spring3.0 添加了一個過濾器,可以將這些請求轉換為標准的 http 方法,使得支持 GET、POST、PUT 與DELETE 請求。

 1     <!-- 
 2     配置 org.springframework.web.filter.HiddenHttpMethodFilter: 可以把 POST 請求轉為 DELETE 或 POST 請求 
 3     -->
 4     <filter>
 5         <filter-name>HiddenHttpMethodFilter</filter-name>
 6         <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
 7     </filter>
 8     
 9     <filter-mapping>
10         <filter-name>HiddenHttpMethodFilter</filter-name>
11         <url-pattern>/*</url-pattern>
12     </filter-mapping>
web.xml
 1     <form action="springmvc/testRest/1" method="post">
 2         <input type="hidden" name="_method" value="PUT"/>
 3         <input type="submit" value="TestRest PUT"/>
 4     </form>
 5     <br><br>
 6     
 7     <form action="springmvc/testRest/1" method="post">
 8         <input type="hidden" name="_method" value="DELETE"/>
 9         <input type="submit" value="TestRest DELETE"/>
10     </form>
11     <br><br>
12 
13     /** 
14      * 如何發送 PUT 請求和 DELETE 請求呢 ? 1. 需要配置 HiddenHttpMethodFilter 2. 需要發送 POST 請求
15      * 3. 需要在發送 POST 請求時攜帶一個 name="_method" 的隱藏域, 值為 DELETE 或 PUT
16      * 
17      * 在 SpringMVC 的目標方法中如何得到 id 呢? 使用 @PathVariable 注解
18      * 
19      */
20     @RequestMapping(value = "/testRest/{id}", method = RequestMethod.PUT)
21     public String testRestPut(@PathVariable Integer id) {
22         System.out.println("testRest Put: " + id);
23         return SUCCESS;
24     }
25 
26     @RequestMapping(value = "/testRest/{id}", method = RequestMethod.DELETE)
27     public String testRestDelete(@PathVariable Integer id) {
28         System.out.println("testRest Delete: " + id);
29         return SUCCESS;
30     }
example

映射請求參數 & 請求參數

1. 使用 @RequestParam 綁定請求參數值

 @RequestParam 來映射請求參數. value 值即請求參數的參數名, required 該參數是否必須. 默認為 true. defaultValue 請求參數的默認值

	@RequestMapping(value = "/testRequestParam")
	public String testRequestParam(
			@RequestParam(value = "username") String un,
			@RequestParam(value = "age", required = false, defaultValue = "0") int age) {
		System.out.println("testRequestParam, username: " + un + ", age: " + age);
		return SUCCESS;
	}

2. 使用 @RequestHeader 綁定請求報頭的屬性值

1     /**
2      * 了解: 映射請求頭信息 用法同 @RequestParam
3      */
4     @RequestMapping("/testRequestHeader")
5     public String testRequestHeader(
6             @RequestHeader(value = "Accept-Language") String al) {
7         System.out.println("testRequestHeader, Accept-Language: " + al);
8         return SUCCESS;
9     }
View Code

3. 使用 @CookieValue 綁定請求中的 Cookie 值

 1     /**
 2      * 了解:
 3      * 
 4      * @CookieValue: 映射一個 Cookie 值. 屬性同 @RequestParam
 5      */
 6     @RequestMapping("/testCookieValue")
 7     public String testCookieValue(@CookieValue("JSESSIONID") String sessionId) {
 8         System.out.println("testCookieValue: sessionId: " + sessionId);
 9         return SUCCESS;
10     }
View Code

4. 使用 POJO 對象綁定請求參數值

Spring MVC 會按請求參數名和 POJO 屬性名進行自動匹配,自動為該對象填充屬性值支持級聯屬性

5. 使用 Servlet API 作為入參

具體支持以下類型: HttpServletRequest ; HttpServletResponse ;HttpSession; java.security.Principal  ; Locale InputStream ;OutputStream ;Reader ;Writer


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM