@ResponseBody 和@Controller 的区别

                           @ResponseBody @Controller 的区别

知识点:@RestController注解相当于@ResponseBody + @Controller合在一起的作用。

1) 如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面,或者html,配置的视图解析器 InternalResourceViewResolver不起作用,返回的内容就是Return 里的内容。

2) 如果需要返回到指定页面,则需要用 @Controller配合视图解析器InternalResourceViewResolver才行。
    如果需要返回JSON,XML或自定义mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解。

 

例如:

1.使用@Controller 注解,在对应的方法上,视图解析器可以解析return 的jsp,html页面,并且跳转到相应页面

返回json内容到页面,则需要加@ResponseBody注解

 

@CrossOrigin
@Controller
public class FileUploadController {
//跳转到上传文件的页面
@RequestMapping(value="/gouploadimg", method = RequestMethod.GET)
public String goUploadImg() {
//跳转到 templates 目录下的 uploadimg.html
return "uploadimg";
}

//处理文件上传
@RequestMapping(value="/testuploadimg", method = RequestMethod.POST)
public @ResponseBody String uploadImg(@RequestParam("file") MultipartFile file,
HttpServletRequest request) {
System.out.println("调用文件上传方法");
String contentType = file.getContentType();
String fileName = file.getOriginalFilename();

 

  1. @RestController注解,相当于@Controller+@ResponseBody两个注解的结合,返回json数据不需要在方法前面加@ResponseBody注解了,但使用

@RestController这个注解,就不能返回jsp,html页面,视图解析器无法解析jsp,html页面

 

@CrossOrigin
@RestController /* @Controller + @ResponseBody*/
public class HospitalController {

    //注入Service服务对象
    @Autowired
    private HospitalService hospitalService;

    /**
     * 查询所有医院信息(未分页)
     */

    @RequestMapping(value = "findAllHospital",method = RequestMethod.GET)
    public  List<Hospital> findAllHospital(){
        List<Hospital> hospitalList= hospitalService.findAllHospital();
        return hospitalList;
    }

 

`@ResponseBody`, `@RestController`, `@Controller` 都是在Spring框架中用于处理HTTP请求并返回响应结果的注解,它们之间的主要区别在于如何管理返回数据的方式。 ### @ResponseBody `@ResponseBody`是一个用于标注类或方法的注解,表示这个类或方法将返回值直接作为HTTP响应体发送给客户端,而不会将其放入HTTP状态行后的实体内容部分。通常,当需要从控制器方法中返回JSON、XML或其他非HTML格式的数据时会使用它。这是因为传统的JSP或HTML视图(如通过转发到一个JSP页面)不适合处理非HTML格式的数据。 ### @RestController `@RestController` 是一个组合注解,它同时包含了 `@Controller` `@ResponseBody` 的功能。这意味着它不仅能够处理HTTP请求并将响应发回客户端,而且所有的返回值都将被视为HTTP响应体,无需额外配置。这简化了RESTful服务的创建过程,因为开发者只需关注业务逻辑返回数据,而不需要考虑视图模板或模型绑定等细节。 ### @Controller `@Controller` 注解主要用于声明控制器类,即负责处理HTTP请求并与业务逻辑交互的类。它的主要作用是映射HTTP请求路径,并调用适当的方法来处理这些请求。`@Controller` 类可以包含多个处理请求的方法,每个方法可以根据需要使用其他注解来指定返回的内容类型、是否接受特定的HTTP方法(GET、POST等),以及处理响应的方式。 --- ## 相关问题: 1. 在什么场景下应该优先选择使用 `@ResponseBody` 还是 `@RestController`? 当你需要直接返回非HTML格式的数据(如JSON、XML)时,通常会选择使用 `@ResponseBody`;而如果项目倾向于RESTful API风格,希望减少对视图的依赖,并且所有返回结果均为非HTML格式,则可以选择 `@RestController` 来简化API开发。 2. `@RestController` 是否意味着它可以完全替代 `@Controller`? 虽然 `@RestController` 提供了更简洁的方式来构建RESTful API,但它并不适用于所有情况。例如,在有大量依赖于复杂UI组件或需要深度集成的前端应用时,使用单独的 `@Controller` 可能更为合适。 3. 使用 `@RestController` 或 `@ResponseBody` 的注意事项有哪些? - 确保所有返回的非HTML格式数据都适合以纯文本形式发送给客户端,避免使用这类注解生成不必要的HTML结构。 - 在设计RESTful API时,考虑到一致性原则,统一使用 `@RestController` 或 `@ResponseBody` 的使用习惯可以帮助保持代码的一致性易于理解性。 - 对于涉及到视图渲染的情况(如使用JSP、Thymeleaf等模板引擎渲染HTML),应使用 `@Controller` 并配合对应的视图解析器,而不是试图使用 `@ResponseBody` 返回视图字符串。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值