最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringMVC @RequestMapping的使用演示和細(xì)節(jié)展示

 更新時(shí)間:2025年09月17日 10:31:05   作者:Cyan_RA9  
本文詳細(xì)介紹了SpringMVC中@RequestMapping注解的用法,包括其映射請(qǐng)求、參數(shù)配置、Ant風(fēng)格URL、與@PathVariable結(jié)合使用,以及如何通過@Controller實(shí)現(xiàn)POJO作為控制器,強(qiáng)調(diào)掌握該注解對(duì)SpringMVC開發(fā)的重要性,感興趣的朋友跟隨小編一起看看吧

一、@RequestMapping是什么?

(1) @RequestMapping注解 用于將瀏覽器發(fā)來的 HTTP 請(qǐng)求映射到具體的 Controller類 或者 某個(gè)方法上。
(2) @RequestMapping 定義了請(qǐng)求的 URL 路徑、請(qǐng)求使用的 HTTP 方法(GET, POST 等)、請(qǐng)求的參數(shù)、請(qǐng)求頭等匹配條件。
(3)@RequestMapping 既可以在類級(jí)別使用,定義指定類的所有方法共享的基礎(chǔ)路徑;也可以在方法級(jí)別使用,定義具體處理請(qǐng)求的路徑;還可以同時(shí)在類和方法級(jí)別上使用,并且,當(dāng)同時(shí)修飾類和方法時(shí),請(qǐng)求的 url 就是它們的組合—— /類請(qǐng)求值/方法請(qǐng)求值,具體應(yīng)該為——http://IP[域名]:port/WEB工程路徑/類請(qǐng)求值/方法請(qǐng)求值。

二、@RequestMapping 的使用演示

1.@RequestMapping在方法上的使用:

我們?cè)?“SpringMVC 執(zhí)行流程分析” 一文中已經(jīng)演示過 @RequestMapping 在方法上的使用了,具體請(qǐng)見鏈接文章的 “快速入門” 部分。如下圖所示:

2.@RequestMapping同時(shí)在類和方法上使用:

我們?cè)?“SpringMVC 執(zhí)行流程分析” 一文中已經(jīng)配置過 applicationContext-mvc.xml 和 web.xml。
這里以 “購(gòu)買商品并提示購(gòu)買成功” 的小demo進(jìn)行演示:先來準(zhǔn)備一個(gè) Controller 或者說是 Handler,OrderHandler代碼如下:

package com.cyan.web;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
/**
 * @author : Cyan_RA9
 * @version : 22.0
 */
@RequestMapping(value = "/order")
@Controller
public class OrderHandler {
    /**
     * 1. method=RequestMethod.POST: 表示請(qǐng)求 purchase 目標(biāo)方法的請(qǐng)求方式必須是 post
     * 2. SpringMVC 控制器默認(rèn)支持 GET 和 POST 兩種方式,(如果不指定默認(rèn)就是這兩個(gè))
     */
    @RequestMapping(value = "/purchase", method = RequestMethod.POST)
    public String purchase() {
        System.out.println("make a purchase of goods~~~");
        return "purchase_OK";
    }
}

可以看到,OrderHandlerpurchase() 方法上面都用了 @RequestMapping 進(jìn)行修飾,如果想訪問 purcahse方法,正確的 URL 就應(yīng)該是 http://localhost:8080/SpringMVC/order/purchase。
注意,此處我們將 @RequestMapping的method屬性指定為了 POST,其實(shí)一共有八種類型(常用的有GET,POST,PUT,DELETE,HEAD這些),如下圖所示:

通過一個(gè) form 表單來訪問這個(gè)URL,并且指定為 post 類型,testPurchase.jsp代碼如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>BUY_GOODS</title>
    <style>
        /* 給表格和所有單元格設(shè)置邊框 */
        table, th, td {
            border: 1px solid black;
        }
        table {
            border-collapse: collapse;
            padding: 2px;
        }
        th {
            font-weight: bold;
            border: 2px solid blue;
        }
    </style>
</head>
<body>
<form action="order/purchase" method="post">    <!-- order前面不帶/ -->
    <table class="my-table">
        <tr>
            <th colspan="2">Buy Goods</th>
        </tr>
        <tr>
            <td>buyerName: </td>
            <td><input type="text" name="buyerName"/></td>
        </tr>
        <tr>
            <td>amount: </td>
            <td><input type="text" name="amount"/></td>
        </tr>
        <tr>
            <td colspan="2"><input type="submit" value="Purchase"/></td>
        </tr>
    </table>
</form>
</body>
</html>

表單效果圖如下:

再來一個(gè) purchase_OK 頁(yè)面,對(duì)應(yīng) OrderHandler 的purchase()方法的 return "purchase_OK"。purchase_OK.jsp代碼如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Successfully</title>
</head>
<body>
    <h3>Purchase Successfully!</h3>
</body>
</html>

purchase_OK 頁(yè)面效果圖如下:

最后進(jìn)行運(yùn)行測(cè)試,運(yùn)行結(jié)果如下GIF圖所示:

注意,由于我們?cè)贠rderHandler中指定了請(qǐng)求方式為 POST類型,所以如果我們將 form表單 的method屬性改為 get,如下圖所示:

此時(shí)form表單的請(qǐng)求類型和要訪問的purchase()方法指定的請(qǐng)求類型不一致,將會(huì)報(bào)錯(cuò)405,如下圖所示:

3.@RequestMapping指定請(qǐng)求參數(shù):

@RequestMapping 中的 params 屬性可以用于指定請(qǐng)求參數(shù),如下圖所示:

params 具體的使用方式有下面幾種——
params = "param1_name" : 表示請(qǐng)求必須包含名稱是 "param1_name" 的請(qǐng)求參數(shù)。
params = "param1_name!=value1":表示請(qǐng)求必須包含名稱是 "param1_name" 的請(qǐng)求參數(shù) 并且 它的不可以是 value1(手動(dòng)指定)。
params = "!=param1_name":表示請(qǐng)求必須 不包含 參數(shù)名稱為 "param1_name" 的請(qǐng)求參數(shù)。
params = { "param1_name=value1", "param2_name" } :表示請(qǐng)求必須同時(shí)包含名稱為 "param1_name" 和 "param2_name" 的請(qǐng)求參數(shù) 并且 param1_name 參數(shù)的必須是指定的 value1。

以 “保存訂單” 的demo來測(cè)試 params 的具體用法。在OrderHandler中新增一個(gè)saveOrder 方法,OrderHandler類代碼如下:

package com.cyan.web;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
/**
 * @author : Cyan_RA9
 * @version : 22.0
 */
@RequestMapping(value = "/order")
@Controller
public class OrderHandler {
    /**
     * 1. method=RequestMethod.POST: 表示請(qǐng)求 purchase 目標(biāo)方法的請(qǐng)求方式必須是 post
     * 2. SpringMVC 控制器默認(rèn)支持 GET 和 POST 兩種方式,(如果不指定默認(rèn)就是這兩個(gè))
     */
    @RequestMapping(value = "/purchase", method = RequestMethod.POST)
    public String purchase() {
        System.out.println("make a purchase of goods~~~");
        return "purchase_OK";
    }
    @RequestMapping(value = "/save", params = "orderId!=0", method = RequestMethod.GET)
    public String saveOrder(String orderId) {
        // 傳入的參數(shù)會(huì)傳遞到方法的形參列表
        System.out.println("orderId = " + orderId);
        return "order_OK";
    }
}

對(duì)應(yīng)的order_OK.jsp代碼如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>SuccessfullyEX</title>
</head>
<body>
<h3 style="color: cornflowerblue">Order Successfully!</h3>
</body>
</html>

再來一個(gè)用于測(cè)試 /order/save 的form表單,testOrder.jsp代碼如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>SAVE_ORDERS</title>
    <style>
        /* 給表格和所有單元格設(shè)置邊框 */
        table, th, td {
            border: 1px solid black;
        }
        table {
            border-collapse: collapse;
            padding: 2px;
        }
        th {
            font-weight: bold;
            border: 2px solid blue;
        }
    </style>
</head>
<body>
<form action="order/save" method="get">
    <table class="my-table">
        <tr>
            <th colspan="2">Make an Order</th>
        </tr>
        <tr>
            <td>orderId: </td>
            <td><input type="text" name="orderId"/></td>
        </tr>
        <tr>
            <td>orderType: </td>
            <td><input type="text" name="orderType"/></td>
        </tr>
        <tr>
            <td colspan="2"><input type="submit" value="ORDER"/></td>
        </tr>
    </table>
</form>
</body>
</html>

頁(yè)面效果如下圖所示:

我們先輸入符合規(guī)則的orderId,測(cè)試效果如下GIF圖所示:

但是,如果我們將 orderId 改成 0,就會(huì)報(bào)錯(cuò)400,如下GIF圖所示:

4.@RequestMapping使用Ant風(fēng)格URL:

@RequestMapping 支持下面三種 Ant 風(fēng)格 URL——
"?" :匹配文件名中的任意一個(gè)字符;
"*" :匹配文件名中的任意1到多個(gè)字符(不能匹配空字符串);
"**":匹配多層路徑(0到多個(gè)路徑段)。

這里up在之前用過的UserSerlvet上做做手腳,來測(cè)試 Ant風(fēng)格 URL,UserServlet代碼如下:

package com.cyan.web;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller //@Controller注解,標(biāo)識(shí)當(dāng)前類是一個(gè)控制器,有時(shí)也稱為Handler(處理器)
public class UserServlet {
    @RequestMapping(value = "/user/?/login")   //此處的value可以省略
    public String login() {
        System.out.println("This is login!");
        return "login_OK";
    }
    @RequestMapping(value = "/user/*/sign")   //此處的value可以省略
    public String sign() {
        System.out.println("This is sign~~~");
        return "login_OK";
    }
    @RequestMapping(value = "/user/**/register")   //此處的value可以省略
    public String register() {
        System.out.println("This is register+++");
        return "login_OK";
    }
}

再來一個(gè) testAnt.jsp 用于測(cè)試URL的匹配情況,testAnt.jsp代碼如下——

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>testAnt</title>
</head>
<body>
    <a href="user/1/login" rel="external nofollow" >login_test1</a> 
    <a href="user/2/login" rel="external nofollow" >login_test2</a> 
    <a href="user/3/login" rel="external nofollow" >login_test3</a> 
    <a href="user/abc/sign" rel="external nofollow" >sign_test1</a> 
    <a href="user/fff/sign" rel="external nofollow" >sign_test2</a> 
    <a href="user/Cyan-RA9/sign" rel="external nofollow" >sign_test3</a> 
    <a href="user/register" rel="external nofollow" >register_test1</a> 
    <a href="user/Pro/register" rel="external nofollow" >register_test2</a> 
    <a href="user/Pro/Max/Ultra/Plus/register" rel="external nofollow" >register_test3</a>
</body>
</html>

最后進(jìn)行運(yùn)行測(cè)試,測(cè)試情況如下 GIF圖 所示:

IDEA 后臺(tái)的輸出結(jié)果如下圖所示:

正好對(duì)應(yīng)了 UserServlet 中三個(gè)方法的輸出語(yǔ)句,符合預(yù)期。

5.@RequestMapping 配合 @PathVariable映射:

一般情況下,URL的參數(shù)形式是——action 屬性[+?+請(qǐng)求參數(shù)]。其中,請(qǐng)求參數(shù)的格式是:name=value&name=value。
但是,借助 @PathVariable 可以省略參數(shù)名,簡(jiǎn)化URL.

新建一個(gè) UserHandler 用于演示,UserHandler類代碼如下:

package com.cyan.web;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
/**
 * @author : Cyan_RA9
 * @version : 22.0
 */
@Controller
@RequestMapping(value = "/user")
public class UserHandler {
    /*
        1. @RequestMapping 中定義的參數(shù)名和 @PathVariable 中指定的參數(shù)名 必須保持一致。
        2. 使用了 @PathVariable 的方法的形參名,可以與上面兩者不一致,形參名無(wú)所謂。
     */
    @RequestMapping(value = "/sign/up/{username}/{userid}")
    public String sign_up(@PathVariable("username") String name, @PathVariable("userid") String id) {
        System.out.println(("Parameters Received : " + "username = " + name + ", userid = " + id));
        return "login_OK";
    }
}

再來一個(gè) testPathVariable 頁(yè)面,用于測(cè)試 URL 的簡(jiǎn)化效果,testPathVariable.jsp 代碼如下——

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>@PathVariable Test</title>
</head>
<body>
    <h3>Click the reference to take a test</h3>
    <a href="user/sign/up/Cyan_RA9/141" rel="external nofollow" >點(diǎn)我就完事兒!</a>
</body>
</html>

測(cè)試結(jié)果如下GIF圖所示:

三、@RequestMapping的使用細(xì)節(jié)

1. @RequestMapping(及其派生注解)映射的 URL 不能重復(fù),即同一個(gè)項(xiàng)目中不能有兩個(gè)方法去匹配完全相同的 URL,這時(shí)候 Tomcat 啟動(dòng)時(shí)會(huì)報(bào)錯(cuò),如下圖所示:

2.@RequestMapping(value = "/xxx",method = RequestMethod.POST) 就等價(jià)于 @PostMapping(value = "/xxx")。類似的寫法還有: @GetMapping,@PutMapping,@DeleteMapping。

3.如果已經(jīng)確定 某個(gè)表單 或者 超鏈接 會(huì)提交字段數(shù)據(jù), 那么要求提交的參數(shù)名目標(biāo)方法的參數(shù)名保持一致.(也就是我們?cè)谏厦嫜菔? 和 演示5中做的那樣.)

四、@RequestMapping延伸——SpringMVC中,如何通過注解實(shí)現(xiàn)POJO類直接作為Controller,而不依賴Servlet或接口?

我們可以使用 @Controller 來把一個(gè) POJO類 標(biāo)記為SpringMVC的 控制器,@Controller 本身可以看作是 @Component 的一個(gè)特例,所以被 @Controller 標(biāo)記的類也會(huì)被 Spring 容器作為組件進(jìn)行管理。除了 @Controller 之外,我們還需要另一個(gè)核心注解——@RequestMapping(或者它的派生注解),這個(gè)注解可以把瀏覽器發(fā)來的 HTTP 請(qǐng)求映射到具體的 Controller 類 或者 某個(gè)方法上面;@RequestMapping 直接定義了 HTTP 請(qǐng)求的一些屬性,例如請(qǐng)求的URL,請(qǐng)求的方法類型,請(qǐng)求的參數(shù)等等。

那么上面說的這兩個(gè)注解,就是我們自己 能操作的部分,但是真正要想實(shí)現(xiàn)對(duì) Servlet API 的解耦,背后靠的是 前端控制器(DispatcherServlet),處理器映射器(HandlerMapping),處理器適配器(HandlerAdapter) 這三大組件的協(xié)同工作,尤其是 HandlerAdapter(因?yàn)樗苯訉?shí)現(xiàn)了 適配器模式)。DispatcherServlet 拿到 HandlerMapping 找到的處理器(即 我們標(biāo)記的 POJO Controller)后,并不會(huì)直接調(diào)用它。而是將處理器交給 HandlerAdapter,讓它去調(diào)用。HandlerAdapter 會(huì)從 HttpServletRequest 中提取信息(即參數(shù)解析),然后把提取到的有用信息 適配為 POJO 方法的參數(shù),那么我們標(biāo)記為控制器的 POJO,根本就不需要直接接觸 HttpServletRequest 或 HttpServletResponse。而且 HandlerAdapter 通過反射直接檢查 POJO 方法簽名,只要方法簽名符合 Spring MVC 的約定,就可以被調(diào)用,所以也不需要依賴接口。

SpringMVC的執(zhí)行流程回顧——如下圖所示:

五、總結(jié)

??,以上就是 SpringMVC --- @RequestMapping 的全部?jī)?nèi)容了??。

這篇文章沒什么難度,主要就是演示了一下 @RequestMapping 的各種使用方式和技巧,大家只要知道 @RequestMapping 在整個(gè) Spring MVC 中很重要并且把它用熟練就可以了。

到此這篇關(guān)于SpringMVC @RequestMapping的使用演示和細(xì)節(jié)展示的文章就介紹到這了,更多相關(guān)SpringMVC @RequestMapping使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Hibernate連接三種數(shù)據(jù)庫(kù)的配置文件

    Hibernate連接三種數(shù)據(jù)庫(kù)的配置文件

    今天小編就為大家分享一篇關(guān)于Hibernate連接三種數(shù)據(jù)庫(kù)的配置文件,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • 認(rèn)識(shí)Java底層操作系統(tǒng)與并發(fā)基礎(chǔ)

    認(rèn)識(shí)Java底層操作系統(tǒng)與并發(fā)基礎(chǔ)

    這篇文章主要介紹了認(rèn)識(shí)Java底層操作系統(tǒng)與并發(fā)基礎(chǔ),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-07-07
  • 帶你了解Java數(shù)據(jù)結(jié)構(gòu)和算法之棧

    帶你了解Java數(shù)據(jù)結(jié)構(gòu)和算法之棧

    這篇文章主要為大家介紹了Java數(shù)據(jù)結(jié)構(gòu)和算法之棧 ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • springboot獲取profile的操作

    springboot獲取profile的操作

    這篇文章主要介紹了springboot獲取profile的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Logback在SpringBoot中的詳細(xì)配置教程

    Logback在SpringBoot中的詳細(xì)配置教程

    Spring Boot 默認(rèn)會(huì)加載 classpath 下的 logback-spring.xml(推薦)或 logback.xml 作為 Logback 的配置文件,下面我們來看看具體的配置教程吧
    2025-05-05
  • Java 處理圖片與base64 編碼的相互轉(zhuǎn)換的示例

    Java 處理圖片與base64 編碼的相互轉(zhuǎn)換的示例

    本篇文章主要介紹了Java 處理圖片與base64 編碼的相互轉(zhuǎn)換的示例,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-08-08
  • spring boot使用i18n時(shí)properties文件中文亂碼問題的解決方法

    spring boot使用i18n時(shí)properties文件中文亂碼問題的解決方法

    這篇文章主要介紹了spring boot使用i18n時(shí)properties文件中文亂碼問題的解決方法,需要的朋友可以參考下
    2017-11-11
  • Java中啟動(dòng)jar包的方式匯總

    Java中啟動(dòng)jar包的方式匯總

    Java 命令執(zhí)行 JAR 包是一種常見的應(yīng)用場(chǎng)景,在實(shí)際開發(fā)中,我們經(jīng)常需要執(zhí)行 JAR 包文件,那么,如何使用 Java 命令執(zhí)行 JAR 包呢?本文將為大家介紹八種不同的方法,需要的朋友可以參考下
    2025-09-09
  • Java面向?qū)ο笾^承、構(gòu)造方法、重寫、重載

    Java面向?qū)ο笾^承、構(gòu)造方法、重寫、重載

    本章具體介紹了什么是構(gòu)造方法、繼承、重寫、重載以及創(chuàng)建方法,整篇文章用老司機(jī)和人類來舉例,圖解穿插代碼案例,需要的朋友可以參考下
    2023-03-03
  • 淺談Java設(shè)計(jì)模式之七大設(shè)計(jì)原則

    淺談Java設(shè)計(jì)模式之七大設(shè)計(jì)原則

    在此之前,我已經(jīng)寫過很多篇關(guān)于設(shè)計(jì)模式的文章.但都比較草草的理解和簡(jiǎn)單的實(shí)現(xiàn),并未深入理解.為了更加深入感受Java設(shè)計(jì)的魅力,編程的藝術(shù),今天進(jìn)行了七大設(shè)計(jì)原則的學(xué)習(xí)理解,后續(xù)進(jìn)行23種設(shè)計(jì)模式的深入學(xué)習(xí)探究,需要的朋友可以參考下
    2021-05-05

最新評(píng)論

东海县| 启东市| 东方市| 贺兰县| 大化| 莱西市| 珠海市| 佛山市| 米林县| 东莞市| 日照市| 寻乌县| 桦川县| 满洲里市| 金坛市| 榆林市| 布拖县| 望江县| 太保市| 上思县| 沁水县| 望城县| 永善县| 开化县| 镇原县| 兴国县| 华阴市| 平度市| 勐海县| 陈巴尔虎旗| 茌平县| 临城县| 信阳市| 新津县| 宜兰市| 兴山县| 纳雍县| 芜湖市| 淮滨县| 遂平县| 阿克苏市|