spring mvc之RequestMapping

1. 概述

spring mvc中使用@RequestMapping時凡傅,支持常用方法參數(shù)類型和返回類型捻激。

常用的方法參數(shù)類型有:

  • 1 PathVariable
  • 2 RequestParam
  • 3 RequestBody
  • 4 HttpEntity
  • 5 CookieValue
  • 6 RequestHeader
  • 7 自動封裝form表單請求到對象中
  • 8 HttpServletRequest HttpServletResponse
  • 9 RequestMapping 參數(shù)配置params headers

常用的返回類型有:

1 返回一個頁面的地址
2 ResponseBody
3 ResponseEntity
4 ModelAndView

2. 前提條件

代碼工程名稱:mvc

測試PO類
ModelAttributeVO

public class ModelAttributeVO {
    private String name;
    private String value;
    private Date date;
    // set/get方法略
}

VO

public class VO {
    private String name;
    private String value;
    private Date date;
    // set/get方法略
}
3. @RequestMapping支持的方法參數(shù)類型
3.1. RequestParameterController

以下代碼都在RequestParameterController類中

@Controller: 表示此類對外提供url服務(wù) @RequestMapping:此注解不僅可以作用在方法上,也可以作用在類上坛缕。如果作用在類上秋茫,則表示此值是類中的所有@RequestMapping方法的URL的前綴

@Controller
@RequestMapping(value = "/request") // 全局URL
public class RequestParameterController {
    ....
}
3.2. 使用的jsp

下面用到j(luò)sp的頁面如下工猜,都在META-INF\resources\WEB-INF\page\reqparameter目錄下:
showInput.jsp
打印內(nèi)容

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Request Parameter</title>
</head>
<body>
    ${map}
</body>
</html>
formModel.jsp 
測試form表單

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

    <form  name="myform" method="post" action="formModel">
        <table>
            <tr>
                <td>First Name:</td>
                <td><input type="text" name="name" value="fisr name" /></td>
            </tr>
            <tr>
                <td>Last Name:</td>
                <td><input type="text" name="value" value="lastName" /></td>
            </tr>
            <tr>
                <td colspan="2">
                    <input type="submit" value="Save Changes" />
                </td>
            </tr>
        </table>
    </form>
</body>
</html>

httpEntityForm.jsp
測試form表單

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

    <form  name="myform" method="post"  action="httpEntity">
        <table>
            <tr>
                <td>First Name:</td>
                <td><input type="text" value="name" /></td>
            </tr>
            <tr>
                <td>Last Name:</td>
                <td><input type="text" value="lastName" /></td>
            </tr>
            <tr>
                <td colspan="2">
                    <input type="submit" value="Save Changes" />
                </td>
            </tr>
        </table>
    </form>
</body>
</html>
3.3. @PathVariable

作用:可以注入URL中的變量值,可以注入一個或者多個

單個 @PathVariable值
代碼:

@RequestMapping(value="/path/{ownerId}")
public String pathVariable(@PathVariable String ownerId, Model model){
    Map<String,Object> map = new HashMap<String,Object>();
    map.put("ownerId", ownerId);
    model.addAttribute("map", map);
    return "reqparameter/showInput";
}

訪問URL:
http://localhost:8100/request/path/1

返回結(jié)果:

{ownerId=1}

多個 @PathVariable值
作用: 可以注入URL中的變量值币狠,可以注入一個或者多個
代碼:

    @RequestMapping(value="/path/{ownerId}/pet/{petId}")
    public String pathVariable2(@PathVariable String ownerId, @PathVariable String petId, Model model){
        Map<String,Object> map = new HashMap<String,Object>();
        map.put("ownerId", ownerId);
        map.put("petId", petId);
        model.addAttribute("map", map);
        return "reqparameter/showInput";
    }

訪問URL:
http://localhost:8100/request/path/1/pet/1234

返回結(jié)果:

{petId=1234, ownerId=1}
3.4. @RequestParam

通過@RequestParam注入單個值
作用:可以從請求參數(shù)中獲取參數(shù)值
代碼:

@RequestMapping(value="/requestParam", method = RequestMethod.GET)
   public String requestParam(@RequestParam("ownerId") int ownerId, ModelMap model) {
    Map<String,Object> map = new HashMap<String,Object>();
    map.put("ownerId", ownerId);

    model.addAttribute("map", map);
    return "reqparameter/showInput";
   }

訪問URL:
http://localhost:8100/request/requestParam?ownerId=223

返回結(jié)果:

{ownerId=223}

通過@RequestParam注入多個值
作用: 可以從請求參數(shù)中獲取多個參數(shù)值
代碼:

    @RequestMapping(value="/requestParam2", method = RequestMethod.GET)
    public String requestParam2(@RequestParam Map<String,Object> map, ModelMap model) {
//      Map<String,Object> map = new HashMap<String,Object>();
//      map.put("ownerId", ownerId);

        model.addAttribute("map", map);
        return "reqparameter/showInput";
    }

訪問URL:
http://localhost:8100/request/requestParam2?ownerId=223&a=4&c=5

返回結(jié)果:

{ownerId=223, a=4, c=5}

@RequestParam: required游两、defaultValue
作用:設(shè)置@RequestParam自定義參數(shù):如設(shè)置默認(rèn)值(defaultValue),是否必須(required)等等
代碼:

@RequestMapping("/requestParam3")
public String requestParam3(@RequestParam(value="inputStr", required=true, defaultValue="noInput") String inputStr,
                            ModelMap model) {
    Map<String,Object> map = new HashMap<String,Object>();
    map.put("inputStr",inputStr );
    model.addAttribute("map",map);
    return "reqparameter/showInput";
}

訪問URL:
http://localhost:8100/request/requestParam3?inputStr=myInput
此URL有inputStr值漩绵,則其值為myInput值
返回結(jié)果:

{inputStr=myInput}

訪問URL:
http://localhost:8100/request/requestParam3
此URL沒有inputStr值贱案,則其值為默認(rèn)值,即noInput
返回結(jié)果:

{inputStr=noInput}
3.5. @RequestBody

作用:@RequestBody: 獲取請求的內(nèi)容止吐。請求內(nèi)容為JSON宝踪,因為本工程設(shè)置請求為json,所以demo為:{“a”:1} 代碼:

@RequestMapping(value = "/requestBody", method = RequestMethod.POST)
public String requestBody(@RequestBody String body, ModelMap model){
    Map<String,Object> map = new HashMap<String,Object>();
    map.put("body",body );
    model.addAttribute("map",map);
    return "reqparameter/showInput";
}

訪問URL:
http://localhost:8100/request/requestBody
內(nèi)容為{“a”:1}
此請求為POST碍扔,需要使用postman等模擬POST請求
返回結(jié)果:

{body={"a":1}}
3.6. HttpEntity

作用:HttpEntity瘩燥,可以操作更原始的請求方法 代碼:

@RequestMapping(value="/httpEntity", method = RequestMethod.GET)
public String httpEntity(ModelMap model){
    return "reqparameter/httpEntityForm";
}

@RequestMapping("/httpEntity")
public String httpEntity2(HttpEntity<byte[]> requestEntity, ModelMap model){
    // 獲取header
    String acceptLanguage = requestEntity.getHeaders().getFirst("Accept-Language");
    // 獲取內(nèi)容:獲取body的內(nèi)容為空,暫時不知道原因
    byte[] requestBody = requestEntity.getBody();     

    Map<String,Object> map = new HashMap<String,Object>();
    map.put("acceptLanguage", acceptLanguage);
//      map.put("content", new String(requestBody));

    model.addAttribute("map", map);
    return "reqparameter/showInput";
}

訪問URL:
http://localhost:8100/request/httpEntity

返回結(jié)果: 輸入上面URL不同,進入form表單颤芬,填寫內(nèi)容后,會轉(zhuǎn)到新的頁面如下

{acceptLanguage=zh-CN,zh;q=0.9,zh-TW;q=0.8}
3.7. @CookieValue

作用:獲取cookie里的值 代碼:

@RequestMapping("/cookieValue")
public String cookieValue(@CookieValue("JSESSIONID") String cookie,ModelMap model) {
    Map<String,Object> map = new HashMap<String,Object>();
    map.put("cookie", cookie);
    model.addAttribute("map", map);
    return "reqparameter/showInput";
}

訪問URL:
http://localhost:8100/request/cookieValue

返回結(jié)果:

{cookie=38EDB55B71BB4CCA6EF1A2CDA7F1BCC0}
3.8. @RequestHeader

作用:操作http header的值
獲取指定header里的值
代碼:

@RequestMapping("/requestHeader")
public String requestHeader (
        @RequestHeader ("User-Agent") String userAgent,
        @RequestHeader ("Host") String host,
        @RequestHeader ("Cache-Control") String cacheControl,
        ModelMap model) {
    Map<String,Object> map = new HashMap<String,Object>();
    map.put("User-Agent", userAgent);
    map.put("Host", host);
    map.put("Cache-Control", cacheControl);

    model.addAttribute("map", map);
    return "reqparameter/showInput";
}

訪問URL:
http://localhost:8100/request/requestHeader
此請求刷新需求刷新多次

返回結(jié)果:

{Cache-Control=max-age=0, User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36, Host=127.0.0.1:8080}

獲取所有header封裝到Map

代碼:

    @RequestMapping("/requestHeaderMap")
    public String requestHeaderMap (@RequestHeader Map<String,String> map,
            ModelMap model) {       
        model.addAttribute("map", map);
        return "reqparameter/showInput";
    }

訪問URL:
http://localhost:8100/request/requestHeaderMap

返回結(jié)果:

{host=127.0.0.1:8080, connection=keep-alive, user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36, upgrade-insecure-requests=1, accept=text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8, accept-encoding=gzip, deflate, br, accept-language=zh-CN,zh;q=0.9,zh-TW;q=0.8, cookie=JSESSIONID=38EDB55B71BB4CCA6EF1A2CDA7F1BCC0}
3.9. 自動封裝form表單請求到對象中

作用: 代碼:

@RequestMapping(value="/formModel", method = RequestMethod.GET)
public String form(){
    return "reqparameter/formModel";
}

@RequestMapping("/formModel")
public String formPost(VO vo, ModelMap model){
    Map<String,Object> map = new HashMap<String,Object>();
    map.put("name", vo.getName());
    map.put("value", vo.getValue());
    map.put("date", vo.getDate());

    model.addAttribute("map", map);
    return "reqparameter/showInput";
}

訪問URL:
http://localhost:8100/request/formModel
此URL進入form表單套鹅,我們填寫內(nèi)容后站蝠,會提交到formPost方法,此時時會自動封裝值到VO對象中卓鹿,打印內(nèi)容如下

返回結(jié)果:

{date=Sun Nov 12 22:11:22 CST 2017, name=fisr name, value=lastName}
3.10. HttpServletRequest + HttpServletResponse

作用:直接操作原始的HttpServletRequest 和 HttpServletResponse 代碼:

@RequestMapping("/httpServlet")
public void formPost(HttpServletRequest request, HttpServletResponse response) throws IOException{      
    String userAgent = request.getHeader("User-Agent");
    String host = request.getHeader("Host");
    String cacheControl = request.getHeader("Cache-Control");

    PrintWriter pw = response.getWriter();
    pw.println("User-Agent :"+ userAgent);
    pw.println("Host :" + host);
    pw.println("Cache-Control :" + cacheControl);

}

訪問URL:
http://localhost:8100/request/httpServlet

返回結(jié)果:

User-Agent :Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36
Host :127.0.0.1:8080
Cache-Control :null
3.11. @RequestMapping 參數(shù)配置params菱魔、headers

@RequestMapping 參數(shù)配置params
作用:通過params過濾請求,如下面的代碼吟孙,只有URL帶上myParam=myValue才能進入
代碼:

@RequestMapping(value="/reqparameters/{ownerId}", method = RequestMethod.GET, params="myParam=myValue")
public String reqParameters(@PathVariable String ownerId, Model model){
    Map<String,Object> map = new HashMap<String,Object>();
    map.put("ownerId", ownerId);
    model.addAttribute("map", map);
    return "reqparameter/showInput";
t";
    }

訪問URL:http://localhost:8100/request/reqparameters/1?myParam=myValue 可以進入到這個方法澜倦,
但是以下URL無法進入這個方法:http://localhost:8100/request/reqparameters/1

備注: 其他條件聚蝶,也可以這樣: “myParam”, “!myParam”, or “myParam=myValue”

@RequestMapping 參數(shù)配置headers
作用:通過headers過濾請求,請求頭里必須帶上myParam藻治,且值為myValue
代碼:

@RequestMapping(value="/reqparameters/{ownerId}", method = RequestMethod.GET, headers="myParam=myValue")
public String headerParameters(@PathVariable String ownerId, Model model){
    Map<String,Object> map = new HashMap<String,Object>();
    map.put("ownerId", ownerId);
    model.addAttribute("map", map);
    return "reqparameter/showInput";
}

訪問URL:
http://localhost:8100/reqparameters/1
如果使用POST請求碘勉,請使用postman,并在請求頭里必須帶上myParam桩卵,且值為myValue

4. @RequestMapping支持的返回類型
4.1. ResponseParameterController

以下代碼都在此類中

@Controller
@RequestMapping(value = "/response")
public class ResponseParameterController {
...
}
4.2. 使用到JSP

下面用到j(luò)sp的頁面如下验靡,都在META-INF\resources\WEB-INF\page\resparameter目錄下:

showInput.jsp

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Request Parameter</title>
</head>
<body>
    ${map}
</body>
</html>
4.3. 返回一個頁面的地址

默認(rèn)情況下,返回一個字符串雏节,表示轉(zhuǎn)到一個指定頁面胜嗓,上面的demo都是這個模式

@RequestMapping(value="/path/{ownerId}")
public String pathVariable(@PathVariable String ownerId, Model model){
    Map<String,Object> map = new HashMap<String,Object>();
    map.put("ownerId", ownerId);
    model.addAttribute("map", map);
    return "reqparameter/showInput";
}
4.4. @ResponseBody

@ResponseBody: 直接返回字符串內(nèi)容
作用:此注解注解的方法返回字符串
代碼:

@RequestMapping(value = "/responseBody", method = RequestMethod.GET)
@ResponseBody
public String responseBodyString() {
    return "Hello World";
}

訪問URL:
http://localhost:8100/response/responseBody

返回結(jié)果:

"Hello World"

@ResponseBody:方法返回對象,系統(tǒng)自動轉(zhuǎn)化為json
作用:方法返回對象钩乍,返回客戶端時系統(tǒng)自動轉(zhuǎn)化為json
代碼:

@RequestMapping(value = "/responseBodyMode", method = RequestMethod.GET)
@ResponseBody
public VO responseBodyMode() {
    return new VO();
}

訪問URL:
http://localhost:8100/response/responseBodyMode

返回結(jié)果:

{ "date":1510497345620, "name":"name", "value":"value" }
4.5. ResponseEntity

作用:返回一個ResponseEntity 代碼:

@RequestMapping("/responseEntity")
public ResponseEntity<String> responseEntity(){
    // do something with request header and body
    HttpHeaders responseHeaders = new HttpHeaders();
    responseHeaders.set("MyResponseHeader", "MyValue");
    return new ResponseEntity<String>("Hello World", responseHeaders, HttpStatus.CREATED);
}

訪問URL:
http://localhost:8100/response/responseEntity

返回結(jié)果:

"Hello World"
4.6. ModelAndView

作用:返回ModelAndView 代碼:

public ModelAndView modelAndView(){

    Map<String,Object> map = new HashMap<String,Object>();
    map.put("ownerId", "1");
    map.put("petId", "23");

    ModelAndView modelAndView = new ModelAndView();
    modelAndView.setViewName("resparameter/showInput");
    modelAndView.addObject("map", map);

    return modelAndView;
}

訪問URL:
http://localhost:8100/response/modelAndView

返回結(jié)果:

{petId=23, ownerId=1}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末辞州,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子寥粹,更是在濱河造成了極大的恐慌变过,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涝涤,死亡現(xiàn)場離奇詭異媚狰,居然都是意外死亡,警方通過查閱死者的電腦和手機妄痪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門哈雏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人衫生,你說我怎么就攤上這事裳瘪。” “怎么了罪针?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵彭羹,是天一觀的道長。 經(jīng)常有香客問我泪酱,道長派殷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任墓阀,我火速辦了婚禮毡惜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘斯撮。我一直安慰自己经伙,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布勿锅。 她就那樣靜靜地躺著帕膜,像睡著了一般枣氧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上垮刹,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天达吞,我揣著相機與錄音,去河邊找鬼荒典。 笑死酪劫,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的种蝶。 我是一名探鬼主播契耿,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼瞒大,長吁一口氣:“原來是場噩夢啊……” “哼螃征!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起透敌,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤盯滚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后酗电,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體魄藕,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年撵术,在試婚紗的時候發(fā)現(xiàn)自己被綠了背率。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡嫩与,死狀恐怖寝姿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情划滋,我是刑警寧澤饵筑,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站处坪,受9級特大地震影響根资,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜同窘,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一玄帕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧想邦,春花似錦裤纹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钱雷。三九已至,卻和暖如春吹零,著一層夾襖步出監(jiān)牢的瞬間罩抗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工灿椅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留套蒂,地道東北人。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓茫蛹,卻偏偏與公主長得像操刀,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子婴洼,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容

  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架骨坑,建立于...
    Hsinwong閱讀 22,366評論 1 92
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)柬采,斷路器欢唾,智...
    卡卡羅2017閱讀 134,638評論 18 139
  • 引言: 項目中用到了REST風(fēng)格來開發(fā)程序,因此對參數(shù)綁定(@RequestParam粉捻、 @RequestBod...
    OzanShareing閱讀 1,033評論 0 0
  • 走過歲月 才知道 你與我的到來 只不過是為了圓滿一個故事 走過歲月 才知道 你與我的相聚 只不過是為了一次分離 走...
    因為愛所以執(zhí)著閱讀 215評論 0 1