@RestController 注解是从 Spring 4.0 版本开始添加进来的,主要用于更加方便的构建 RESTful Web 服务。
@RestController注解相当于@ResponseBody + @Controller合在一起的作用。
@Controller用于将类标记为 Spring MVC 控制器
若使用@Controller 注解,在对应的方法上,视图解析器可以解析return 的jsp,html页面,并且跳转到相应页面
若返回json等内容到页面,则需要加@ResponseBody注解
在 RESTful 的服务中,我们大部分情况是使用 JSON 为返回数据的,所以你可以直接使用 @RestController 替换掉 @Controller 和 @ResponseBody。
@RestController @RequestMapping("users") public class HomeController { @GetMapping(produces = "application/json") public Book getAllUsers() { return findAllUsers(); } }
控制器类的每个请求处理方法都会自动将返回对象序列化为 HttpResponse。
@RequestMapping
@RequestMapping注解是用来映射请求的,即指明处理器可以处理哪些URL请求,该注解既可以用在类上,也可以用在方法上。
当使用@RequestMapping标记控制器类时,方法的请求地址是相对类的请求地址而言的;当没有使用@RequestMapping标记类时,方法的请求地址是绝对路径。
1 @Controller 2 @RequestMapping("/user") 3 public class UserController{ 4 5 @RequestMapping("/users") 6 public String users() { 7 return "users"; 8 } 9 }
此时请求users方法的url路径就是:.../user/users,users方法的返回值是字符串类型的,这个就是处理器在处理完任务后将要跳转的页面。如果想要方法直接返回结果,而不是跳转页面,这就要用到@ResponseBody注解了。
@RequestMapping的地址可以是uri变量,并且通过@PathVariable注解获取作为方法的参数。也可以是通配符来筛选请求地址。
@ResponseBody
@ResponseBody 注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
@ResponseBody注解的作用是将控制器的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到Response对象的body区,通常用来返回JSON数据或者是XML数据。需要注意,在使用此注解之后不会再走视图处理器,而是直接将数据写入到输出流中,他的效果等同于通过Response对象输出指定格式的数据。
@ResponseBody表示方法的返回值直接以指定的格式写入Http response body中,而不是解析为跳转路径
格式的转换是通过HttpMessageConverter中的方法实现的,因为它是一个接口,因此由其实现类完成转换。
如果要求方法返回的是json格式数据,而不是跳转页面,可以直接在类上标注@RestController,而不用在每个方法中标注@ResponseBody,简化了开发过程。
package com.huangx.springboot.springboot_restcontroller_demo1; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import java.text.SimpleDateFormat; import java.util.Date; @Controller @RequestMapping("/demo1") public class Demo1Controller { /** * 获取当前日期 * @return */ @RequestMapping("/getDate") @ResponseBody public String getDate() { String pattern = "yyyy-MM-dd HH:mm:ss.SSS"; SimpleDateFormat dateFormat = new SimpleDateFormat(pattern); return dateFormat.format(new Date()); } }
package com.huangx.springboot.springboot_restcontroller_demo1; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.text.SimpleDateFormat; import java.util.Date; @RestController @RequestMapping("/demo2") public class Demo2Controller { /** * 获取当前日期 * @return */ @RequestMapping("/getDate") public String getDate() { String pattern = "yyyy-MM-dd HH:mm:ss.SSS"; SimpleDateFormat dateFormat = new SimpleDateFormat(pattern); return dateFormat.format(new Date()); } }
@RestController
public class FieldTemplateController {
@Autowired
private FieldTemplateService fieldTemplateService;
@GetMapping(value = "/qoeQueryFieldTemplate", produces = MediaType.APPLICATION_JSON_VALUE)
public Map<String, Object> queryFieldTemplate(FieldTemplateParamQuery fieldQuery) {
PageInfo pageInfo = fieldTemplateService.queryByCond(fieldQuery);
return ImmutableMap.of("totalCount", pageInfo.getTotal(), "data", pageInfo.getResults());
}
}
public void queryFieldTemplate() {
FieldTemplateParamQuery fieldQuery = new FieldTemplateParamQuery();
fieldQuery.setStart(start);
fieldQuery.setLimit(limit);
fieldQuery.setXdrId(xdrId);
fieldQuery.setFieldTemplateName(fieldTemplateName);
fieldQuery.setBusType(busType);
PageInfo pageInfo = fieldTemplateCommon.queryByCond(fieldQuery);
Map<String, Object> bean = new HashMap<>();
bean.put("totalCount", pageInfo.getTotal());
bean.put("data", pageInfo.getResults());
responseResult(SaUtil.bean2Json(bean));
}