1. 程式人生 > >【SpringMVC】2. 註解@RequestMapping的使用

【SpringMVC】2. 註解@RequestMapping的使用

注意!!! 此文章需要配置了SpringDispatcherServletInternalResourceViewResolver才能夠使用,如果不會配置,請翻看我【SpringMVC】系列的第一篇文章《【SpringMVC】1. SpringMVC的第一個程式——HelloWorld》 ##一、關於RequestMapping

###(1)@RequestMapping的作用 Spring MVC 使用 @RequestMapping 註解為控制器指定可 以處理哪些 URL 請求,作用和Servlet的@WebServlet相同。DispatcherServlet截獲請求後,就通過控制器上@RequestMapping

提供的對映資訊確定請求所對應的處理 方法。

###(2)@RequestMapping註解在不同地方標註的含義

位置 解釋
類定義處 提供初步的請求對映資訊。相對於 WEB 應用的根目錄。
方法處 提供進一步的細分對映資訊。相對於類定義處的 URL。若 類定義處未標註 @RequestMapping,則方法處標記的 URL 相對於 WEB 應用的根目錄。
###(3)`@RequestMapping`相對應的屬性
位置 解釋
value 指定請求的URL地址
method 請求方法,一般有getpost
params 請求引數的對映條件,指定請求的URL地址需要帶那些引數
heads 請求頭的對映條件,指定請求頭需要帶來什麼引數
###(4)`@RequestMapping`對映請求支援Ant萬用字元 |符號|解釋| |:-|:-| |?|匹配檔名中的一個字元| |*|匹配檔名中的任意字元| |**|匹配多層路徑| **例如**
  • /user/*/createUser: 匹配 /user/aaa/createUser、/user/bbb/createUser 等URL
  • /user/**/createUser: 匹配/user/createUser、/user/aaa/bbb/createUser 等 URL
  • /user/createUser??: 匹配/user/createUseraa、/user/createUserbb
    等 URL

##二、相關程式碼及解釋

###(1)在com.springmvc.handlers下建立一個名為SpringMVCTest的類

package com.springmvc.handlers;

import java.io.IOException;
import java.io.Writer;
import java.util.Arrays;
import java.util.Date;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.servlet.ModelAndView;

import com.springmvc.entities.User;

@RequestMapping("/springmvc")
@Controller
public class SpringMVCTest {

	private static final String SUCCESS = "success";

	/*
	 * [email protected] 除了修飾方法,還能能修飾類 2. 1)類定義處:提供初步的的請求對映資訊,相對於WEB應用根目錄
	 * 2)方法處:提供進一步西風的對映資訊,相對於類定義處的URL,若類定義出未標註@RequestMapping,
	 * 則方法處標記的URL相對於WEB應用的根目錄
	 */
	@RequestMapping("/testRequestMapping")
	public String testRequestMapping() {
		System.out.println("testRequestMapping");
		return SUCCESS;
	}

	/*
	 * 使用method屬性來指定請求方式
	 */
	@RequestMapping(value = "/testMethod", method = RequestMethod.POST)
	public String testMethod() {
		System.out.println("Test Method");
		return SUCCESS;
	}

	/*
	 * 瞭解:可以使用params屬性和headers屬性來更加精確的對映要求,params和headers支援簡單的表示式 ,ant格式的萬用字元
	 */
	@RequestMapping(value = "testParamsAndHeaders", params = { "username", "age!=10" }, headers = {})
	public String testParamsAndHeaders() {
		System.out.println("testParamsAndHeaders");
		return SUCCESS;
	}
}

params和headers支援簡單的表示式:

  • param1: 表示請求必須包含名為 param1 的請求引數
  • !param1: 表示請求不能包含名為 param1 的請求引數
  • param1 != value1: 表示請求包含名為 param1 的請求引數,但其值不能為value1
  • {“param1=value1”, “param2”}: 請求必須包含名為 param1和param2的兩個請求引數,且param1引數的值必須為value1。
###(2)在WebRoot根目錄下建立`index.jsp`
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

<title>My JSP 'index.jsp' starting page</title>
</head>

<body>
	<a href="helloworld">Hello World</a>
	<br>
	<br>
	<a href="springmvc/testRequestMapping">Test testRequestMapping</a>
	<br>
	<br>
	<form action="springmvc/testMethod" method="post">
		<input type="submit">
	</form>
	<br>
	<br>
	<a href="springmvc/testParamsAndHeaders?username=ben&age=10">testParamsAndHeaders</a>
	</body>

</html>

注意請求地址,由於我在SpringMVCTest.java中類名上寫了一個@RequestMapping("/springmvc"),然後在各個方法名中又寫了一次@RequestMapping(),所以請求地址是springmvc開頭的。 ##三、結果

###(1)啟動Tomcat伺服器 在瀏覽器輸入以下地址來訪問訪問index.jsphttp://localhost:8080/springmvc-1/index.jsp 這裡寫圖片描述 ###(2)首先測試Post提交表單 點選提交按鈕 這裡寫圖片描述

**能夠訪問Success頁面**
###(3)測試請求引數對映 在index.jsp頁面點選`testParamsAndHeaders `超連結 ![這裡寫圖片描述](https://img-blog.csdn.net/20180821102451299?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzNTk2OTc4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) 發現出現了狀態碼404,即找不到頁面。這是因為我在連線後面添加了一個引數`age=10`,而在hangdle類`SpringMVCTest`中的`testParamsAndHeaders()`方法,我在使用`@RequestMapping()`註解時寫了`age!=10`,表明age這個引數不能等於10,導致請求地址匹配不上所以出現404。 ![這裡寫圖片描述](https://img-blog.csdn.net/20180821103008170?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzNTk2OTc4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) 如果不想出現狀態碼404,可以把位址列`age`的屬性值改為其他數字或者`testParamsAndHeaders()`的`@RequestMapping`註解修改下`age!=10`即可。