@RequestMapping @ResponseBody @RequestBody

本文详细介绍了Spring MVC中@RequestMapping、@PathVariable、@ResponseBody、@RequestBody等注解的功能、用法及原理,涵盖了请求地址映射、动态参数获取、返回结果处理等内容,并通过示例代码进行了详细解释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

.@RequestMapping

国际惯例先介绍什么是@RequestMapping,@RequestMapping 是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径;用于方法上,表示在类的父路径下追加方法上注解中的地址将会访问到该方法,此处需注意@RequestMapping用在类上可以没用,但是用在方法上必须有

例如:

@Controller
//设置想要跳转的父路径
@RequestMapping(value = "/Controllers")
public class StatisticUserCtrl {
    //如需注入,则写入需要注入的类
    //@Autowired

            // 设置方法下的子路经
            @RequestMapping(value = "/method")
            public String helloworld() {

                return "helloWorld";

            }
}
  •  

其原理也非常好了解,其对应的 action 就是“ (父路径) controller/(父路径下方法路经)method ”。因此,在本地服务器上访问方法 http://localhost:8080/controller/method 就会返回(跳转)到“ helloWorld.jsp ”页面。

说到这了,顺便说一下 @PathVariable 注解,其用来获取请求路径(url )中的动态参数。

页面发出请求:

function login() {
    var url = "${pageContext.request.contextPath}/person/login/";
    var query = $('#id').val() + '/' + $('#name').val() + '/' + $('#status').val();
    url += query;
    $.get(url, function(data) {
        alert("id: " + data.id + "name: " + data.name + "status: "
                + data.status);
    });
}
  •  

例如:

/**
* @RequestMapping(value = "user/login/{id}/{name}/{status}") 中的 {id}/{name}/{status}
* 与 @PathVariable int id、@PathVariable String name、@PathVariable boolean status
* 一一对应,按名匹配。
*/

@RequestMapping(value = "user/login/{id}/{name}/{status}")
@ResponseBody
//@PathVariable注解下的数据类型均可用
public User login(@PathVariable int id, @PathVariable String name, @PathVariable boolean status) {
//返回一个User对象响应ajax的请求
    return new User(id, name, status);
}
  • 1

@ResponseBody

@Responsebody 注解表示该方法的返回的结果直接写入 HTTP 响应正文(ResponseBody)中,一般在异步获取数据时使用,通常是在使用 @RequestMapping 后,返回值通常解析为跳转路径,加上 @Responsebody 后返回结果不会被解析为跳转路径,而是直接写入HTTP 响应正文中。 
作用: 
该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。 
使用时机: 
返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;

当页面发出异步请求:

function login() {
    var datas = '{"username":"' + $('#username').val() + '","userid":"' + $('#userid').val() + '","status":"' + $('#status').val() + '"}';
    $.ajax({
        type : 'POST',
        contentType : 'application/json',
        url : "${pageContext.request.contextPath}/user/login",
        processData : false,
        dataType : 'json',
        data : datas,
        success : function(data) {
            alert("userid: " + data.userid + "username: " + data.username + "status: "+ data.status);
        },
        error : function(XMLHttpRequest, textStatus, errorThrown) {
            alert("出现异常,异常信息:"+textStatus,"error");
        }
    });
};
  •  

例如:

@RequestMapping(value = "user/login")
@ResponseBody
// 将ajax(datas)发出的请求写入 User 对象中,返回json对象响应回去
public User login(User user) {   
    User user = new User();
    user .setUserid(1);
    user .setUsername("MrF");
    user .setStatus("1");
    return user ;
}
  •  

异步获取 json 数据,加上 @Responsebody 注解后,就会直接返回 json 数据。

@RequestBody

@RequestBody 注解则是将 HTTP 请求正文插入方法中,使用适合的 HttpMessageConverter 将请求体写入某个对象。

作用:

1) 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上; 
2) 再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。

使用时机:

A) GET、POST方式提时, 根据request header Content-Type的值来判断:

application/x-www-form-urlencoded, 可选(即非必须,因为这种情况的数据@RequestParam, @ModelAttribute也可以处理,当然@RequestBody也能处理); 
multipart/form-data, 不能处理(即使用@RequestBody不能处理这种格式的数据); 
其他格式, 必须(其他格式包括application/json, application/xml等。这些格式的数据,必须使用@RequestBody来处理);

B) PUT方式提交时, 根据request header Content-Type的值来判断:

application/x-www-form-urlencoded, 必须;multipart/form-data, 不能处理;其他格式, 必须;

说明:request的body部分的数据编码格式由header部分的Content-Type指定;

例如:

@RequestMapping(value = "user/login")
@ResponseBody
// 将ajax(datas)发出的请求写入 User 对象中
public User login(@RequestBody User user) {   
// 这样就不会再被解析为跳转路径,而是直接将user对象写入 HTTP 响应正文中
    return user;    
}

后台代码示范

@RequestMapping("/")
public String Demo1(@RequestParam String lid){

    System.out.println("----"+lid);
    return null;
}
前台页面

<input type="text" name="lid" />  <!-- 这时输出为10 -->

Console输出界面

----10
  •  

springmvc会自动根据参数名字来注入,所以要名字一致,不然不会注入

参数名字不一致

@RequestMapping("/")
public String Demo1(@RequestParam(name="lid") String id){

    System.out.println("----"+id);
    return null;
}
前台页面

<input type="text" name="lid" />  <!-- 这时输出为10 -->

Console输出界面

----10
  •  

参数名字不一致的话,需要在@RequestParam后面指定参数名字,才能为后面的参数进行赋值。

设置默认值

@RequestMapping("/")
public String Demo1(@RequestParam(name="lid",defaultValue="ste") String id){

    System.out.println("----"+id);
    return null;
}
前台页面



Console输出界面

----ste
  •  

注意事项

@RequestMapping("/")
public String Demo1(@RequestParam(name="lid") int id){

    System.out.println("----"+id);
    return null;
}
前台页面

<input type="text" name="lid" />  <!-- 这时输出为10 -->

Console输出界面

----10
  •  

如果要@RequestParam为一个int型的数据传值,假如前端并未输入,那么将会为int型的数据赋值为null。显然,这是不允许的,直接报错。 
可以通过required=false或者true来要求@RequestParam配置的前端参数是否一定要传

// required=true,则参数必须要传
@RequestMapping("/")
public String Demo1(@RequestParam(name="lid",required=true) int id){

    System.out.println("----"+id);
    return null;
}`
  •  

如果required为false,那么默认为参数赋值为null

1.  Content-Type

  MediaType,即是Internet Media Type,互联网媒体类型;也叫做MIME类型,在Http协议消息头中,使用Content-Type来表示具体请求中的媒体类型信息。

 

 

 常见的媒体格式类型如下:

  •     text/html : HTML格式

  •     text/plain :纯文本格式      

  •     text/xml :  XML格式

  •     image/gif :gif图片格式    

  •     image/jpeg :jpg图片格式 

  •     image/png:png图片格式

  •  

   以application开头的媒体格式类型:

  •    application/xhtml+xml :XHTML格式

  •    application/xml     : XML数据格式

  •    application/atom+xml  :Atom XML聚合格式    

  •    application/json    : JSON数据格式

  •    application/pdf       :pdf格式  

  •    application/msword  : Word文档格式

  •    application/octet-stream : 二进制流数据(如常见的文件下载)

  •    application/x-www-form-urlencoded :

  •    <form encType=””>中默认的encType,form表单数据被编码为key/value格式发    送到服务器(表单默认的提交数据的格式)

  •  

  •  

  •  

   另外一种常见的媒体格式是上传文件之时使用的:

  •     multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式

  •  

       以上就是我们在日常的开发中,经常会用到的若干content-type的内容格式。

 

 

 

 

2.   Spring MVC中关于关于Content-Type类型信息的使用

 

        首先我们来看看RequestMapping中的Class定义

 

 

  1. @Target({ElementType.METHOD, ElementType.TYPE})  

  2. @Retention(RetentionPolicy.RUNTIME)  

  3. @Documented  

  4. @Mapping  

  5. public @interface RequestMapping {  

  6.       String[] value() default {};  

  7.       RequestMethod[] method() default {};  

  8.       String[] params() default {};  

  9.       String[] headers() default {};  

  10.       String[] consumes() default {};  

  11.       String[] produces() default {};  

  12. }

     

 

 

各参数含义:

        value:  指定请求的实际地址, 比如 /action/info之类。
        method:  指定请求的method类型, GET、POST、PUT、DELETE等
        consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
        produces:    指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回
        params: 指定request中必须包含某些参数值是,才让该方法处理
        headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求

 

其中,consumes, produces使用content-typ信息进行过滤信息;headers中可以使用content-type进行过滤和判断。

 

3. 使用示例

 

  3.1 headers

  1. @RequestMapping(value = "/test", method = RequestMethod.GET, headers="Referer=http://www.ifeng.com/")    

  2. public void testHeaders(@PathVariable String ownerId, @PathVariable String petId) {        

  3.   // implementation omitted    

  4. }   

这里的Headers里面可以匹配所有Header里面可以出现的信息,不局限在Referer信息。

 

3.2 params的示例

 

  1. @RequestMapping(value = "/test/{userId}", method = RequestMethod.GET, params="myParam=myValue")    

  2. public void findUser(@PathVariable String userId) {        

  3.   // implementation omitted    

  4. }    

    仅处理请求中包含了名为“myParam”,值为“myValue”的请求,起到了一个过滤的作用。

 

 

3.3 consumes/produces

 

  1. @Controller    

  2. @RequestMapping(value = "/users", method = RequestMethod.POST, consumes="application/json", produces="application/json")    

  3. @ResponseBody  

  4. public List<User> addUser(@RequestBody User userl) {        

  5.     // implementation omitted    

  6.     return List<User> users;  

  7. }  

     

     

 

  方法仅处理request Content-Type为“application/json”类型的请求. produces标识==>处理request请求中Accept头中包含了"application/json"的请求,同时暗示了返回的内容类型为application/json; 

 

4.应用场景

 

GET、POST方式提交的请求:

 Content-type: 1、application/x-www-form-urlencoded:@RequestBody不是必须加的

 2、mutipart/form-data:@RequestBody不能处理这种格式 

3、其他格式,比如application/json,application/xml等,必须使用@RequestBody来处理 

@ResquestBody注解可以使http消息转换器会根据content-type对请求体进行解析

 

 PUT方式提交的请求:

以上1和3的场景都是必须使用@RequestBody来处理的,2场景也是不支持的

 

实例:

如: $.ajax({    

         url:"/login",     

        type:"post",     

        contentType:"application/json;charset=UTF-8",     

        data:JSON.stringify({"name":"test","pass":"123456"}) 

});  

 

后台接收代码示例:

 @RequestMapping(value="/login")

 @ResponseBody 

public ModelAndView loadForm(@RequestBody Login login){ 

    // implementation omitted  

 }

### Spring MVC 注解详解 #### @RequestMapping 的使用场景及特点 `@RequestMapping` 是一个基础性的注解,可用于类级别方法级别。当应用于类时,它定义了一个公共的基础路径,该路径会与方法级别的路径组合形成最终访问地址[^1]。 对于具体的 HTTP 请求方式支持,虽然 `@RequestMapping` 能够接收所有的 HTTP 方法(GET, POST 等),但在实际开发中更推荐使用其衍生出来的专门用于某一种请求类型的子注解,比如 `@GetMapping`, `@PostMapping` 等,因为这些子注解具有更高的语义清晰度并能减少代码量[^2]。 ```java // 类级注解设置全局前缀 @RequestMapping("/api") public class MyController { // GET /api/resource @RequestMapping(value="/resource", method=RequestMethod.GET) public String getResource(){ return "Resource"; } } ``` #### @RequestParam @PathVariable 对比 两者都用来传递参数给控制器的方法,但是它们的工作机制有所不同: - **@RequestParam**: 主要用于获取查询字符串中的键值对形式的数据,即 URL 后面跟问号后面的部分(`?key=value`)。如果希望从表单提交或者链接后面的参数里取数据就用这个注解[^4]。 ```java // http://localhost:8080/api/user?id=123&name=testUser @GetMapping("/user") public User getUser(@RequestParam Long id, @RequestParam String name){ return userService.findUserByIdAndName(id,name); } ``` - **@PathVariable**: 则是用来捕获 URI 模板中的动态部分,也就是 URL 中的占位符 `{}` 。这种方式使得 RESTful 风格 API 更加直观易读[^5]. ```java // http://localhost:8080/api/users/123 @GetMapping("/users/{id}") public User getUserById(@PathVariable("id") long userId){ return userService.findById(userId); } ``` #### @RequestBody @ResponseBody 解析 这两个注解主要用于处理 JSON 或 XML 形式的实体内容传输: - **@RequestBody**: 接收客户端发送过来的内容体,并将其转换成 Java 对象实例化传入控制层函数内作为参数. ```java @PostMapping("/addUser") public ResponseEntity<String> addUser(@RequestBody User user){ userService.save(user); return new ResponseEntity<>("success", HttpStatus.CREATED); } ``` - **@ResponseBody**: 将返回的对象序列化为 JSON/XML 字符串响应给前端浏览器显示. 它通常配合 `@RestController` 来简化视图解析过程. ```java @RestController public class UserController{ @GetMapping("/getUserJson") public User getUserJson(){ return userService.findOne(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值