Spring MVC溫故而知新 – 請求映射RequestMapping


RequestMapping注解說明

@RequestMapping注解的作用將Web請求映射到特定處理程序類和/或處理程序方法,這個注解可以用於類或者方法上,並通過屬性value指定請求路徑。用在Controller類上表示提供初步的URL請求映射信息,相對於Web應用的根目錄,這是一個前置請求路徑。用在Controller中方法上,表示提供詳細的URL映射。如果Controller類上沒有加RequestMapping注解,則方法上注解標記的URL則是相對於Web應用的根目錄。

@RequestMapping注解提供以下幾個屬性:

         name:用於指定映射器名稱

         value:用於指定映射路徑,同path

         path:用於指定映射路徑,同value

         method:用於指定請求類型:GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE

         params:指定請求的參數

         headers:指定請求頭部,源碼示例:RequestMapping(value = "/something", headers = "content-type=text/*")

         consumes:指定處理請求提交的內容類型(Content-Type),例如application/json, text/html,只有在Content-Type匹配這些媒體類型之一時才會映射請求

         produces:指定請求返回的內容類型 例如:produces = "application/json; charset=UTF-8"

通過value屬性指定映射路徑

Controller類上使用RequestMapping注解

@Controller
@RequestMapping("order")  
public class OrderInfoController {    
    //示例1
    @RequestMapping("orderinfo")   
    public ModelAndView OrderInfo1() {
        return new ModelAndView("order/info", "message", "OrderInfo");
    }
}

在OrderController類上添加了注解RequestMapping("order"),表示所有對的請求必須是以“根目錄/order” 開始

示例1的請求路徑為:http://localhost:8080/springMvcNext/order/orderinfo

示例1 如果注釋掉Controller上的@RequestMapping("order"),則對應的請求路徑為:http://localhost:8080/springMvcNext /orderinfo

Controller方法上使用RequestMapping注解

 1.常用基礎用法

@Controller
@RequestMapping("order")  
public class OrderInfoController {
    
    //示例1
    @RequestMapping("orderinfo")   
    public ModelAndView OrderInfo1() {
        return new ModelAndView("order/info", "message", "OrderInfo");
    }
    //示例2 :處理多個url映射
    @RequestMapping({"info","index"})  //或者@RequestMapping(value={"info","index"})
    public ModelAndView OrderInfo2() {
        return new ModelAndView("order/info","message", "OrderInfo2");
    }                              
    
    //示例3
    @RequestMapping
    public ModelAndView OrderInfo3() {    
        return new ModelAndView("order/info","message", "OrderInfo3");
    }
}

RequestMapping只配置value屬性,不顯示配置其他屬性的情況下,value省略,直接填寫URL映射信息即可,指定其他屬性的情況下value屬性必須明確填寫

上例示例1的訪問路徑為: http://localhost:8080/springMvcNext/order/orderinfo

示例2:RequestMapping接口中value屬性是一個數組,所有也支持傳一個數組 示例2的訪問路徑:http://localhost:8080/springMvcNext/order/index  或者 http://localhost:8080/springMvcNext/order/info

示例3:當value為空時,表示該方法為類下默認的Action,示例3的訪問路徑為:http://localhost:8080/springMvcNext/order

 2.URL模板映射

在RequestMapping注解中聲明URI變量,並通過@PathVariable注解的方式訪從實際請求URL中獲取值,示例如下:

@Controller
public class OrderInfoController {
     // 示例10  帶占位符的URL
     @RequestMapping(value = "user/{userId}/order/{orderNumber}", method = RequestMethod.GET)
     public ModelAndView OrderInfo4(@PathVariable int userId,@PathVariable String orderNumber) {
           return new ModelAndView("order/info", "message", "userid:"+userId+" orderNumber:"+orderNumber);
     }
}

 示例10請求URL:  http://localhost:8080/springMvcNext/user/12/order/333 當通過此URL發起請求時,SpringMVC將通過@PathVariable可以提取URL模板中的{×××}中的×××變量, URL變量會自動轉換為對應的類型,無法轉換的則返回錯誤,比如嘗試用以下url訪問:http://localhost:8080/springMvcNext/user/xxx/order/333  其中參數Userid=xxx,則發生錯誤:

3.Ant風格的URL路徑映射

 Ant風格通配符如下:

  •  匹配一個字符
  • *    匹配路徑段中的零個或多個字符
  • **  匹配零個或多個路徑段

 示例:

@Controller
public class OrderInfoController {
       // 示例11  帶占位符的URL
       @RequestMapping(value = "order*", method = RequestMethod.GET)
       //@RequestMapping(value = "order?", method = RequestMethod.GET)
       //@RequestMapping(value = "order/**", method = RequestMethod.GET)
        public ModelAndView OrderInfo5(String orderNumber) {
              return new ModelAndView("order/info", "message", "OrderInfo5");
        }
}

示例11請求URL:  http://localhost:8080/springMvcNext/order/orderdexx?orderNumber=12 可以匹配http://localhost:8080/springMvcNext/order/orderXXXXX?orderNumber=yyyy的所有請求

 @RequestMapping(value = "order?", method = RequestMethod.GET)可以匹配諸如 “…/ordera?orderNumber….” “…/orders?orderNumber….”

 @RequestMapping(value = "order/**", method = RequestMethod.GET)可以匹配諸如 “…/order/aaa?orderNumber….” “…/order/bbb/ccc?orderNumber….”

 

另外 RequestMapping還支持正則表達式風格的URL路徑映射,此處略過

通過method屬性指定請求類型

RequestMapping提供的method屬性請求謂詞的類型,如下示例示例只接受GET請求

    // 示例4
    @RequestMapping(value="detail",method=RequestMethod.GET) //也可直接使用 @GetMapping("detail")
    public ModelAndView Info() {
        return new ModelAndView("order/info", "message", "Info");
    }

對於每種請求類型,SpringMVC還提供了專用的注解:

@GetMapping

@PostMapping

@PutMapping

@DeleteMapping

@PatchMapping

通過params指定參數名或參數值約束

params屬性可以限定請求參數包含特定的參數,也可限定參數值的約束,如下代碼所示:

    // 示例5 params 限定參數包含orderNumber
    @RequestMapping(value = "detail2", params = "orderNumber")
    public ModelAndView Detail2(String orderNumber) {
        return new ModelAndView("order/info", "message", orderNumber);
    }

    // 示例6 params 限定參數值
    @RequestMapping(value = "detail3", params = "orderNumber!=1222")
    public ModelAndView Detail3(String orderNumber) {
        return new ModelAndView("order/info", "message", orderNumber);
    }

示例5限定請求參數必須包含參數orderNumber,如果不包含名為orderNumber的參數,則拒絕訪問:訪問路徑:http://localhost:8080/springMvcNext/order/detail2?orderNumber=12

示例6限定請求參數必須包含參數orderNumber並且參數值不能為1222 訪問路徑:http://localhost:8080/springMvcNext/order/detail3?orderNumber=1222 時報錯

通過headers指定參數名或參數值約束

 RequestMapping提供的method屬性可以指定請求頭類型,只有請求數據頭部類型符合指定的值時,才能正常訪問

        // 示例7 params 限定參數值
        @RequestMapping(value = "headtest",headers = "apikey=23131313") 
        //@RequestMapping(value = "headtest",headers= {"Accept=application/json"}) 
        public ModelAndView Header() {
            return new ModelAndView("order/info", "message", "Header");
        }

示例7限定請求頭必須包含apikey:23131313才可以正常返回,直接訪問,返回錯誤:

添加添加header信息apikey:23131313訪問成功:

通過consumes指定請求提交的內容類型(Content-Type)

    // 示例8 consumes 
    @RequestMapping(value = "consumes", method = RequestMethod.POST, consumes = "application/json")
    public ModelAndView Consumes(String orderNumber) {
        return new ModelAndView("order/info", "message", orderNumber);
    }

示例限定請求參數類型為application/json,表示該方法只處理請求Content-Type為application/json的請求:

下面通過拋postman測試:

設置請求參數格式為application/json,可以正常訪問:

 

設置參數格式為x-form-urlencoded,返回錯誤,Http Status 415

 

通過produces指定返回的內容類型(Content-Type)

 produces屬性用於設定返回內容類型,並且滿足以下條件:接受請求header中包含Accept的值與produces設定的值相同,或者接受的請求使用不顯示設置accept值

        // 示例8 produces 限定返回數據application/json
        @RequestMapping(value = "produces", method = RequestMethod.GET, produces = "application/json")
        public ModelAndView Produces(String orderNumber) {
            return new ModelAndView("order/info", "message", orderNumber);
        }

示例8 表示返回內容格式application/json ,當客戶端設置的accept格式為text/json時,運行報錯,Http status 406

當客戶端設置的accept格式為application/json或者不設置accept值時,可以正常運行

 


免責聲明!

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



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