Spring 中 @Controller 和 @RestController

本文介绍了Spring框架中@Controller和@RestController的区别及用法。@RestController结合了@Controller和@ResponseBody的功能,主要用于RESTful Web服务开发,简化了响应体的处理。
  1. @Controller, @RestController的共同点

    都是用来表示Spring某个类的是否可以接收HTTP请求

  2. Controller, RestController的不同点

    @Controller标识一个Spring类是Spring MVC controller处理器

    @RestController: @RestController是@Controller和@ResponseBody的结合体,两个标注合并起来的作用。

示例如下:

@Controller  
@ResponseBody  
public class MyController { }  
@RestController  
public class MyRestController { }  

Spring 4.0 重要的一个新的改进是@RestController注解,它继承自@Controller注解。4.0之前的版本,Spring MVC的组件都使用@Controller来标识当前类是一个控制器servlet。

使用这个特性,我们可以开发REST服务的时候不需要使用@Controller而专门的@RestController。

当你实现一个RESTful web services的时候,response将一直通过response body发送。为了简化开发,Spring 4.0提供了一个专门版本的controller。下面我们来看看@RestController实现的定义:

 @Target(value=TYPE)  
 @Retention(value=RUNTIME)  
 @Documented  
 @Controller  
 @ResponseBody  
 public @interface RestController 

Demo :

import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.http.HttpStatus;  
import org.springframework.web.bind.annotation.RequestMapping;  
import org.springframework.web.bind.annotation.RequestMethod;  
import org.springframework.web.bind.annotation.ResponseStatus;  
import org.springframework.web.bind.annotation.RestController;  

@RestController  
public class SpringRestControllerDemo {  
    @Autowired UserDetails userDetails;  
    @RequestMapping(value="/springcontent", method=RequestMethod.GET, produces={"application/xml", "application/json"})  
    @ResponseStatus(HttpStatus.OK)  
    public UserDetails getUser() {  
        UserDetails userDetails = new UserDetails();  
        userDetails.setUserName("Krishna");  
        userDetails.setEmailId("krishna@gmail.com");  
        return userDetails;  
    }  

    @RequestMapping(value="/springcontent.htm", method=RequestMethod.GET)  
    @ResponseStatus(HttpStatus.OK)  
    public String getUserHtml() {  
        //Test HTML view  
        return "example";  
    }  
}  

XML 里面的配置:

<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:mvc="http://www.springframework.org/schema/mvc"  
    xmlns:context="http://www.springframework.org/schema/context"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd  
http://www.springframework.org/schema/mvc   
http://www.springframework.org/schema/mvc/spring-mvc.xsd  
http://www.springframework.org/schema/context  
http://www.springframework.org/schema/context/spring-context-4.0.xsd">  

    <context:component-scan base-package="XXXXX" />
    <bean id="userDetails" class="XXXXXXX"/>  
    <mvc:annotation-driven content-negotiation-manager="contentManager"/>  
    <bean id="contentManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">  
         <property name="favorPathExtension" value="true"/>  
          <property name="ignoreAcceptHeader" value="true" />  
          <property name="defaultContentType" value="text/html" />  
          <property name="useJaf" value="false"/>  
          <property name="mediaTypes">  
              <map>  
                  <entry key="json" value="application/json" />  
                  <entry key="html" value="text/html" />  
                  <entry key="xml" value="application/xml" />  
                  <entry key="do" value="application/x-download"/>
              </map>  
          </property>  
    </bean>  
    <bean id="jspViewResolver"  
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
        <property name="prefix" value="/WEB-INF/jsp/" />  
        <property name="suffix" value=".jsp" />  
    </bean>  

</beans>  
<think>首先,用户的问题是:“我想查找@Controller@RestController区别 请问@Controller@RestController区别”。这是基于引用的内容,我需要参考提供的引用来回答。 系统级指令要求: - 所有行内数学表达式用$...$格式,但问题是关于Spring Boot的,不是数学相关,所以可能不需要数学表达式。 - 独立公式用$$...$$,同样可能不适用。 - LaTeX语法正确:确保任何公式正确。 - 使用中文回答:整个回答要用中文。 - 生成相关问题:在回答末尾生成相关问题。 - 引用的段落末尾添加引用标识:如[^1]。 回顾提供的引用: - 引用[1]:介绍基本概念,@Controller。 - 引用[2]:解释@RestController专注于返回数据(如JSON、XML),而@Controller返回视图页面(如HTML、JSP),并给出代码示例。 - 引用[3]:个人经验,@RestController返回return的内容,而不是页面;@Controller配合视图解析器返回页面;@RestController相当于@Controller + @ResponseBody。 - 引用[4]:@RestController@Controller + @ResponseBody,不能返回JSP/HTML页面。 关键区别: 1. **返回类型**: - @Controller:主要用于返回视图页面(如HTML、JSP)。需要配合视图解析器(InternalResourceViewResolver)。 - @RestController:用于返回数据(如JSON、XML),不需要额外注解。相当于@Controller + @ResponseBody。 2. **用途**: - @Controller:适合传统Web应用,返回页面。 - @RestController:适合RESTful API,返回JSON数据。 3. **内部机制**: - 使用@Controller时,方法返回字符串会被视图解析器解释为视图路径。 - 使用@RestController时,方法返回值直接写入HTTP响应体作为数据。 4. **注解关系**: - @RestController = @Controller + @ResponseBody。这意味着在@RestController中,所有方法都自动有@ResponseBody效果。 5. **视图解析器的影响**: - @Controller:视图解析器起作用。 - @RestController:视图解析器不起作用。 回答结构应该清晰: - 逐步解释区别。 - 使用中文。 - 末尾添加相关问题。 生成相关问题: - 基于主题,如如何选择、性能差异等。 - 例如:如何在使用@Controller时返回JSON?@RestController的优缺点?等。 最终回答框架: 1. 介绍基本概念。 2. 详细解释区别。 3. 举例子或引用代码(如果适用)。 4. 结尾生成相关问题。 </think>### @Controller @RestController区别详解 在 Spring Boot 开发中,`@Controller` `@RestController` 都是 Spring MVC 的核心注解,用于定义控制器类处理 HTTP 请求。它们的核心区别在于**返回值类型用途**。以下是基于引用内容的详细对比: 1. **主要功能区别**: - **`@Controller`**: - 主要用于返回视图页面(如 HTML、JSP 等)。当方法返回一个字符串时(如 `return "home";`),Spring Boot 会通过视图解析器(如 `InternalResourceViewResolver`)将其解析为对应的页面路径。 - 如果需要返回 JSON 或 XML 数据,必须在方法上额外添加 `@ResponseBody` 注解,否则返回值会被视为视图名称。 - 适合传统 Web 应用,如渲染页面。 - **`@RestController`**: - 专门用于返回数据(如 JSON、XML),而**不是视图页面**。它相当于 `@Controller` + `@ResponseBody` 的组合。 - 方法返回值直接写入 HTTP 响应体作为数据,视图解析器对其无效。 - 适合构建 RESTful API,专注于后端数据交互。 总结:`@Controller` 返回页面,`@RestController` 返回数据;前者需手动添加 `@ResponseBody` 处理数据,后者自动处理[^3][^4]。 2. **内部机制与行为**: - **视图解析器的影响**: - `@Controller` 依赖视图解析器将字符串映射到页面(如 `return "index.html";` 会跳转到对应页面)。 - `@RestController` 忽略视图解析器,返回值直接作为响应内容(如 `return "{name: 'Alice'}";` 会直接输出 JSON)。 - **注解等价关系**: - `@RestController` = `@Controller` + `@ResponseBody`。这意味着在 `@RestController` 类中,所有方法默认带有 `@ResponseBody` 效果。 - **使用场景**: - 使用 `@Controller` 时,返回页面需依赖视图技术(如 Thymeleaf);返回数据需添加 `@ResponseBody`。 - 使用 `@RestController` 时,无法返回页面(如尝试 `return "page.html";` 会直接输出字符串 "page.html",而非渲染页面)[^2][^3]。 3. **代码示例对比**: - **`@Controller` 示例**: ```java import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class MyController { // 返回视图页面(需视图解析器) @GetMapping("/home") public String homePage() { return "home"; // 解析为 home.html } // 返回 JSON 数据(必须有 @ResponseBody) @GetMapping("/data") @ResponseBody public String getData() { return "{\"key\":\"value\"}"; // 直接输出 JSON } } ``` - **`@RestController` 示例**: ```java import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/api") public class ApiController { // 自动返回 JSON 数据(无需 @ResponseBody) @GetMapping("/user/{id}") public String getUser(@PathVariable Long id) { return "User ID: " + id; // 直接输出字符串(如作为 JSON) } } ``` 注意:在 `@RestController` 中,`return "home";` 会输出 "home",而非页面跳转[^2][^4]。 4. **实际开发建议**: - 选择 `@Controller`:当应用需要前后端混合(如服务器渲染页面)。 - 选择 `@RestController`:当构建纯后端 API(如移动端或前端框架对接)。 - 常见错误:使用 `@RestController` 但期望返回页面会导致视图无法渲染(参见引用[^3]中的案例)。 通过以上对比,您可以避免混淆并针对性选择注解。如需进一步优化(如结合 Thymeleaf 或自定义响应),可参考 Spring Boot 文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值