溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

SpringMVC @RequestMapping注解怎么使用

發(fā)布時間:2023-05-05 15:31:39 來源:億速云 閱讀:249 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“SpringMVC @RequestMapping注解怎么使用”,在日常操作中,相信很多人在SpringMVC @RequestMapping注解怎么使用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”SpringMVC @RequestMapping注解怎么使用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

    1、@RequestMapping注解的作用

    @RequestMapping注解的作用,就是將請求和處理請求的控制器方法關(guān)聯(lián)起來,建立映射關(guān)系。

    SpringMVC接收到一個請求,就會在映射關(guān)系中找到對應的控制器方法來處理這個請求。

    @RequestMapping有很多屬性,設(shè)置得越多,匹配的請求越精確。

    控制器中有多個方法對應同一個請求,怎么處理?

    編譯前正常,運行時報錯。說對于這個請求,已經(jīng)存在對應的控制器方法了

     多個控制器,對于同一個請求配置了不同的控制器方法,怎么處理?

    編譯前正常,運行時報錯。說對于這個請求,已經(jīng)存在對應的控制器方法了

    也就是說,請求和它的處理器方法必須是一一對應的關(guān)系。

    2、@RequestMapping注解的位置

    查看@RequestMapping注解的源碼

    @Target({ElementType.TYPE, ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Mapping
    public @interface RequestMapping {
        ...
    }

    從@Target可以看出

    • ElementType.TYPE:可以標記類

    • ElementType.METHOD:可以標記方法

    有兩種情況,標記在類上和標記在方法上

    @RequestMapping標識一個類:設(shè)置映射請求的請求路徑的初始信息

    @RequestMapping標識一個方法:設(shè)置映射請求請求路徑的具體信息

    @Controller
    @RequestMapping("/test")
    public class RequestMappingController {
        
        //此時請求映射所映射的請求的請求路徑為:/test/testRequestMapping
        @RequestMapping("/testRequestMapping")
        public String testRequestMapping(){
            return "success";
        }
    }

    使用場景

    常用于區(qū)分不同模塊的相同功能

    比如用戶模塊和訂單模塊都有展示數(shù)據(jù)功能,請求路徑都是/list。

    如果單純在兩個控制器中配置兩個針對/list的方法,則一個請求對應了兩個控制方法,運行時會報錯。

    而為了功能命名的統(tǒng)一,也不希望設(shè)置不同的名稱,比如/user_list 與 /order_list ,這樣雖然可以解決問題,但不合理。

    可以使用在類上配置@RequestMapping的方式,來區(qū)分用戶和訂單的 /list。

    比如

    @Controller
    @RequestMapping("/user")
    public class UserController {
        //此時請求映射所映射的請求的請求路徑為:/user/list
        @RequestMapping("/list")
        public String getUserList(){
            return "userList";
        }
    }
     
    @Controller
    @RequestMapping("/order")
    public class OrderController {
        //此時請求映射所映射的請求的請求路徑為:/order/list
        @RequestMapping("/list")
        public String getOrderList(){
            return "orderList";
        }
    }

    在訪問時,可以指定"/user/list" 和"/order/list"

    3、value屬性

    (1)基礎(chǔ)用法

    閱讀源碼

    public @interface RequestMapping {
        ...
            
        @AliasFor("path")
        String[] value() default {};
        
        ...
    }

    @RequestMapping中value屬性的作用

    value屬性必須配置!

    @RequestMapping注解的value屬性通過請求的請求地址匹配請求映射。

    它是一個字符串類型的數(shù)組,表示該請求映射能夠匹配多個請求地址所對應的請求

    @RequestMapping(value={"/text1", "/text2"})
    public String toTarget(){
        System.out.println("請求收到");
        //返回視圖名稱
        return "text";
    }

    通過/text1和/text2,都能匹配到這個控制器方法,跳轉(zhuǎn)到text對應的視圖頁面

    注意

    有些特殊字符不能被匹配,例如 ? 或 / 或 空格

    (2)路徑中的占位符(重點)

    SpringMVC支持路徑中的占位符,在restful風格中會用到

    什么是restful風格

    通過拼接請求路徑的方式,傳遞請求參數(shù)

    原始方式:/deleteUser?id=1

    rest方式:/deleteUser/1

    服務(wù)器如何知道哪個/是目錄,哪個/是參數(shù)?

    參數(shù)部分,用{}占位符來填充。

    例如 /test/{} 就可以匹配/test/1 ,而/test/test/1這樣的更深目錄,就不會被錯誤匹配到

    但要注意,此時 /test 請求不能被 /test/{}匹配到。 /test/ 也不行。

    如何使用restful風格傳參

    當請求路徑中,將某些數(shù)據(jù)通過路徑的方式傳輸?shù)椒?wù)器中后;

    就可以在相應的@RequestMapping注解的value屬性中,通過占位符{自定義名稱}表示傳輸?shù)臄?shù)據(jù);

    在控制器方法的參數(shù)部分添加@PathVariable注解,將占位符所表示的數(shù)據(jù)賦值給控制器方法的形參;

    這樣就實現(xiàn)了從前端頁面?zhèn)鲄⒔o后端控制器方法。

    總結(jié):

    占位符{}告訴控制方法,此處是一個rest風格的參數(shù);

    @PathVariable用于將這個參數(shù)與控制器方法的形參進行綁定,使之可以在方法中使用。

    示例

    單個參數(shù)

    模擬傳參

    <a th:href="@{/testPath/3}" rel="external nofollow" >rest風格</a>

    控制器方法

    @RequestMapping("/testPath/{id}")
    public String testPath(@PathVariable String id){
        System.out.println("id = " + id);
        return "target";
    }

    4、method屬性

    閱讀源碼

    public @interface RequestMapping {
    	...
     
        RequestMethod[] method() default {};
        
    	...
    }

    可以看出,method是一個RequestMethod類型的數(shù)組(RequestMethod就是請求方法)

    RequestMethod是一個枚舉類,包括:GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE

    @RequestMapping中method屬性的作用

    @RequestMapping注解的method屬性通過請求的請求方式(get或post)匹配請求映射。

    它是一個RequestMethod類型的數(shù)組,表示該請求映射能夠匹配多種請求方式的請求

    如果不設(shè)置method,默認是任何請求方式都能匹配(因為此時不以請求方式為條件)

    使用場景

    后續(xù)CRUD時,可以根據(jù)請求方式的不同,在同一個請求路徑下,匹配不同的控制方法,執(zhí)行不同的SQL語句。

    示例

    由于value屬性必須設(shè)置,所以設(shè)置method屬性后,意思是既要滿足請求地址,又要滿足請求方法

    @RequestMapping(value="/target", method = {RequestMethod.GET, RequestMethod.POST})
    public String toTarget(){
    System.out.println("請求收到");
    //返回視圖名稱
    return "target";
    }

    注意

    如果當前請求的請求地址滿足請求映射的value屬性,但是請求方式不滿足method屬性,則瀏覽器報錯405:Request Method 'POST' not supported,請求方式不被支持。

    派生注解

    1、對于處理指定請求方式的控制器方法,SpringMVC中提供了@RequestMapping的派生注解:

    處理get請求的映射 --> @GetMapping
    處理post請求的映射 --> @PostMapping
    處理put請求的映射 --> @PutMapping
    處理delete請求的映射 --> @DeleteMapping
    派生注解的作用

    使用這些派生注解,就不用去指定請求方法了。

    例如@GetMapping("/test")相當于@RequestMapping(value="/test", method=RequestMethod.GET)

    示例

    @GetMapping("/get")
    public String getMapping(){
        return "get";
    }

    意思是,匹配 請求名稱為get,請求方法為get的請求。

    2、常用的請求方式有g(shù)et、post、put、delete

    • get:查詢

    • post:修改

    • put:增加

    • delete:刪除

    但目前瀏覽器只支持get和post,如何發(fā)送其他類型的請求?

    若在form表單提交時,為method設(shè)置了其他請求方式的字符串(put或delete),則會按照默認的請求方式get處理。

    若要發(fā)送put和delete請求,需要通過Spring提供的過濾器HiddenHttpMethodFilter。是restful的內(nèi)容

    5、params屬性(了解)

    閱讀源碼

    String[] params() default {};

    params是一個字符串類型的數(shù)組

    params屬性的作用

    @RequestMapping注解的params屬性通過請求的請求參數(shù) 匹配請求映射

    它是一個字符串類型的數(shù)組,可以通過四種表達式設(shè)置請求參數(shù)和請求映射的匹配關(guān)系:

    • "param":要求請求映射所匹配的請求必須攜帶param請求參數(shù)

    • "!param":要求請求映射所匹配的請求必須不能攜帶param請求參數(shù)

    • "param=value":要求請求映射所匹配的請求必須攜帶param請求參數(shù)且param=value

    • "param!=value":要求請求映射所匹配的請求必須攜帶param請求參數(shù)但是param!=value

    如果設(shè)置了多個參數(shù)匹配,則必須同時滿足,請求才能映射到。

    示例

    @RequestMapping(
        value = "/test"
        ,params = {"username","password!=123456"}
    )
    public String testRequestMapping(){
        return "success";
    }

    意思是匹配 請求名稱為test,請求參數(shù)包括username,且請求參數(shù)中password不等于123456的請求

    注意

    若當前請求滿足@RequestMapping注解的value和method屬性,但是不滿足params屬性,此時頁面會報錯400:Parameter conditions "username, password!=123456" not met for actual request parameters: username={admin}, password={123456}

    6、headers屬性(了解)

    閱讀源碼

    String[] headers() default {};

    headers屬性的作用

    @RequestMapping注解的headers屬性通過請求的請求頭信息匹配請求映射

    性是一個字符串類型的數(shù)組,可以通過四種表達式設(shè)置請求頭信息和請求映射的匹配關(guān)系

    • "header":要求請求映射所匹配的請求必須攜帶header請求頭信息

    • "!header":要求請求映射所匹配的請求必須不能攜帶header請求頭信息

    • "header=value":要求請求映射所匹配的請求必須攜帶header請求頭信息且header=value

    • "header!=value":要求請求映射所匹配的請求必須攜帶header請求頭信息且header!=value

    注意

    若當前請求滿足@RequestMapping注解的value和method屬性,但是不滿足headers屬性,此時頁面 顯示404錯誤,即資源未找到

    到此,關(guān)于“SpringMVC @RequestMapping注解怎么使用”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

    向AI問一下細節(jié)

    免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI