spring mvc之RequestMapping

1. 概述

spring mvc中使用@RequestMapping时,支持常用方法参数类型和返回类型。

常用的方法参数类型有:

  • 1 PathVariable
  • 2 RequestParam
  • 3 RequestBody
  • 4 HttpEntity
  • 5 CookieValue
  • 6 RequestHeader
  • 7 自动封装form表单请求到对象中
  • 8 HttpServletRequest HttpServletResponse
  • 9 RequestMapping 参数配置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支持的方法参数类型
3.1. RequestParameterController

以下代码都在RequestParameterController类中

@Controller: 表示此类对外提供url服务 @RequestMapping:此注解不仅可以作用在方法上,也可以作用在类上。如果作用在类上,则表示此值是类中的所有@RequestMapping方法的URL的前缀

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

下面用到jsp的页面如下,都在META-INF\resources\WEB-INF\page\reqparameter目录下:
showInput.jsp
打印内容

<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

返回结果:

{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

返回结果:

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

通过@RequestParam注入单个值
作用:可以从请求参数中获取参数值
代码:

@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

返回结果:

{ownerId=223}

通过@RequestParam注入多个值
作用: 可以从请求参数中获取多个参数值
代码:

    @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

返回结果:

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

@RequestParam: required、defaultValue
作用:设置@RequestParam自定义参数:如设置默认值(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值
返回结果:

{inputStr=myInput}

访问URL:
http://localhost:8100/request/requestParam3
此URL没有inputStr值,则其值为默认值,即noInput
返回结果:

{inputStr=noInput}
3.5. @RequestBody

作用:@RequestBody: 获取请求的内容。请求内容为JSON,因为本工程设置请求为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
内容为{“a”:1}
此请求为POST,需要使用postman等模拟POST请求
返回结果:

{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");
    // 获取内容:获取body的内容为空,暂时不知道原因
    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

返回结果: 输入上面URL,进入form表单,填写内容后,会转到新的页面如下

{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

返回结果:

{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
此请求刷新需求刷新多次

返回结果:

{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

返回结果:

{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表单,我们填写内容后,会提交到formPost方法,此时时会自动封装值到VO对象中,打印内容如下

返回结果:

{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

返回结果:

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 参数配置params、headers

@RequestMapping 参数配置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 参数配置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

下面用到jsp的页面如下,都在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. 返回一个页面的地址

默认情况下,返回一个字符串,表示转到一个指定页面,上面的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: 直接返回字符串内容
作用:此注解注解的方法返回字符串
代码:

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

访问URL:
http://localhost:8100/response/responseBody

返回结果:

"Hello World"

@ResponseBody:方法返回对象,系统自动转化为json
作用:方法返回对象,返回客户端时系统自动转化为json
代码:

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

访问URL:
http://localhost:8100/response/responseBodyMode

返回结果:

{ "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

返回结果:

"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

返回结果:

{petId=23, ownerId=1}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容