ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] ## 1. @responseBody 将java对象转换为josn或者xml返回 1. @responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据,需要注意的呢,在使用此注解之后不会再走试图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。 2. ~~~ @RequestMapping("/login") @ResponseBody public User login(User user){ return user; } User字段:userName pwd 那么在前台接收到的数据为:'{"userName":"xxx","pwd":"xxx"}' 效果等同于如下代码: @RequestMapping("/login") public void login(User user, HttpServletResponse response){ response.getWriter.write(JSONObject.fromObject(user).toString()); } ~~~ 3. 例如 ~~~ @Controller @EnableAutoConfiguration public class Example { @Autowired private UserMapper UserMapper; @ResponseBody @RequestMapping("/getUser/{id}") String getUser(@PathVariable Long id) { return UserMapper.getById(id).toString(); } } ~~~ 不加@ResponseBody ![](https://box.kancloud.cn/b2c1a88557fdf0dd36e279e2b41d34b5_1897x433.png) 加@ResponseBody ![](https://box.kancloud.cn/418f73ef63c44260f030d42e3bfe4119_627x219.png) ## 2. @RestController @Controller和@RestController的区别? 官方文档: @RestController is a stereotype annotation that combines @ResponseBody and @Controller. 意思是: @RestController注解相当于@ResponseBody + @Controller合在一起的作用。 1)如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面,配置的视图解析器InternalResourceViewResolver不起作用,返回的内容就是Return 里的内容。 例如:本来应该到success.jsp页面的,则其显示success. 2)如果需要返回到指定页面,则需要用 @Controller配合视图解析器InternalResourceViewResolver才行。 3)如果需要返回JSON,XML或自定义mediaType内容到页面,则需要在@Controller对应的方法上加上@ResponseBody注解。 ## 3. @RequestBody 作用与responseBody相反,将request中的JSON格式或者XML格式,转换为java对象 两个作用: 1. 该注解用于读取Request请求的**body部分数据**,使用系统默认配置的**HttpMessageConverter进行解析**,然后把相应的数据绑定到要返回的对象上。 2. 再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。 3. 因为GET请求通常将请求参数携带在url上,没有放在请求体中,所以GET一般不与@RequestBody搭配 **4. @RequestBody一般与POST搭配,绑定javabean** ~~~ @RequestMapping(value = {"/add/{sort}","/add",},method = RequestMethod.POST) @ResponseBody public AjaxCommonObject add(@RequestBody MoocDocClassify moocDocClassify, @PathVariable(required = false) String sort, HttpSession session) { MoocUser user = (MoocUser)session.getAttribute(AuthConstants.CURRENT_USER); AjaxCommonObject ajaxCommonObject = new AjaxCommonObject(); try { int docId = personalService.add(moocDocClassify,user,sort); ajaxCommonObject.setData(docId); } catch (BizCommonException e) { return new AjaxCommonObject(e); } ~~~ ## 4. PathVariable ### 4.1 如果参数为空怎么办 1. 可以指定多个匹配路径,将空值的路径也加进去 ~~~ @RequestMapping(value = {"/get/{userId}", "/get/{id}/{userId}"}, method = RequestMethod.GET) ~~~ 2. 然后设置参数非必须 ~~~ @PathVariable(required = false) String id ~~~ 例如: ~~~ @RequestMapping(value = {"/add/{sort}","/add",},method = RequestMethod.POST) @ResponseBody public AjaxCommonObject add(@RequestBody MoocDocClassify moocDocClassify, @PathVariable(required = false) String sort, HttpSession session) { MoocUser user = (MoocUser)session.getAttribute(AuthConstants.CURRENT_USER); AjaxCommonObject ajaxCommonObject = new AjaxCommonObject(); try { int docId = personalService.add(moocDocClassify,user,sort); ajaxCommonObject.setData(docId); } catch (BizCommonException e) { return new AjaxCommonObject(e); } ~~~ ## 5. @RequestParam 1. 用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容。(Http协议中,如果不指定Content-Type,则默认传递的参数就是application/x-www-form-urlencoded类型) 2. **常用来处理简单类型的绑定** 实质是将Request.getParameter() 中的Key-Value参数Map利用Spring的转化机制ConversionService配置,转化成参数接收对象或字段。 3. 在Content-Type: application/x-www-form-urlencoded的请求中,get 方式中queryString的值,和post方式中 body data的值都会被Servlet接受到并转化到Request.getParameter()参数集中,所以@RequestParam可以获取的到。