@ResponseBody 和 @RequestBody 和@RequestParam的作用

本文详细介绍了Spring MVC框架中常用注解的功能与用法,包括@ResponseBody、@RequestBody、@RequestParam、@PathVariable等,并通过实例说明如何正确应用这些注解。

@ResponseBody是作用在方法上的,@ResponseBody 表示该方法的返回结果直接写入 HTTP response body 中,一般在异步获取数据时使用【也就是AJAX】,在使用 @RequestMapping后,返回值通常解析为跳转路径,但是加上 @ResponseBody 后返回结果不会被解析为跳转路径,而是直接写入 HTTP response body 中。 比如异步获取 json 数据,加上 @ResponseBody 后,会直接返回 json 数据。@RequestBody 将 HTTP 请求正文插入方法中,使用适合的 HttpMessageConverter 将请求体写入某个对象。

   @RequestBody是作用在形参列表上,用于将前台发送过来固定格式的数据【xml 格式或者 json等】封装为对应的 JavaBean 对象,封装时使用到的一个对象是系统默认配置的 HttpMessageConverter进行解析,然后封装到形参上。


@RequestParam是传递参数的.

@RequestParam用于将请求参数区数据映射到功能处理方法的参数上。

public String queryUserName(@RequestParam String userName)

在url中输入:localhost:8080/**/?userName=zhangsan

请求中包含username参数,,则自动传入。

接下来我们看一下@RequestParam注解主要有哪些参数:

value:参数名字,即入参的请求参数名字,如username表示请求的参数区中的名字为username的参数的值将传入;

required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报404错误码;

defaultValue:默认值,表示如果请求中没有同名参数时的默认值,默认值可以是SpEL表达式,如“#{systemProperties['java.vm.version']}”。

 

表示请求中可以没有名字为username的参数,如果没有默认为null,此处需要注意如下几点:

 

public String queryUserName(@RequestParam(value="userName" ,required =false ) String userName)

 

     原子类型:必须有值,否则抛出异常,如果允许空值请使用包装类代替。

     Boolean包装类型类型:默认Boolean.FALSE,其他引用类型默认为null。

public String requestparam5(  
@RequestParam(value="username", required=true, defaultValue="zhang") String username)   
          

如果没有传入参数,则默认是"zhangsan".

但是在传递参数的时候如果是url?userName=zhangsan&userName=wangwu时怎么办呢?

其实在实际roleList参数入参的数据为“zhangsan,wangwu”,即多个数据之间使用“,”分割;我们应该使用如下方式来接收多个请求参数:

 

复制代码
public String requestparam8(@RequestParam(value="userName") String []  userNames)     
或者是:
public String requestparam8(@RequestParam(value="list") List<String> list)     

 

 

 
复制代码
@PathVariable绑定URI模板变量值

 

@RequestMapping(value="/users/{userId}/topics/{topicId}")  
public String test(   @PathVariable(value="userId") int userId,    @PathVariable(value="topicId") int topicId)  

 如请求的URL为“控制器URL/users/123/topics/456”,则自动将URL中模板变量{userId}和{topicId}绑定到通过@PathVariable注解的同名参数上,即入参后userId=123、topicId=456。代码在PathVariableTypeController中


### 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(); } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值