@Controller、@RestController注解区别详解

下面是关于“@Controller、@RestController注解区别详解”的完整攻略。

下面是关于“@Controller、@RestController注解区别详解”的完整攻略。

一、@Controller注解

@Controller是SpringMVC中常用的控制器注解,用于标记此类为控制器,能够处理用户的请求并返回相应的数据。

1.1 示例代码

@Controller
@RequestMapping("/hello")
public class HelloController {
    @RequestMapping("/world")
    public String sayHello() {
        return "hello world";
    }
}

上述代码定义了一个HelloController控制器处理/hello/world的请求,返回字符串"hello world"。

需要说明的是,@RequestMapping注解用来匹配请求路径。

1.2 返回值类型

@Controller控制器方法的返回值类型可以是字符串、ModelAndView或void类型。

如果是字符串类型,则对应视图名称;如果是ModelAndView类型,则可以传递视图名称和模型数据;如果是void类型,则需要配合@RequestMapping的produces属性使用,指定返回数据类型。

1.3 视图解析器

@Controller控制器返回字符串类型时,需要配合视图解析器处理视图。

在SpringMVC配置文件中,可以配置多个视图解析器,优先级按照配置的顺序逐个匹配。

示例配置:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/"/>
    <property name="suffix" value=".jsp"/>
</bean>

二、@RestController注解

@RestController是Spring4.0版本新增的注解,主要用于构建RESTful风格的API接口,一般情况下将返回数据直接作为响应体返回。

相比于使用@Controller注解,使用@RestController注解的控制器返回值不会被视图解析器解析,而是以JSON、XML等格式直接返回数据给客户端。

使用这个注解可以大大简化开发,并提高数据传输效率,常用于前后端分离的开发模式。

2.1 示例代码

@RestController
@RequestMapping("/api")
public class ApiController {
    @GetMapping("/user/{id}")
    public User getUser(@PathVariable Long id) {
        User user = new User(id, "Tom", 18);
        return user;
    }
}

上述代码定义了一个ApiController控制器处理/api/user/{id}的GET请求,返回一个User对象。

需要说明的是,@PathVariable注解用于RESTful风格的URL路径参数获取。

2.2 返回值类型

@RestController控制器方法的返回值类型可以是任意Java类,SpringMVC会自动将该对象转化为JSON或XML格式返回给客户端。

同时,也可以使用@ResponseBody注解,将数据转化为JSON或XML格式返回。

2.3 内容协商 Content Negotiation

当使用@RestController注解时,在返回值类型为HttpEntity<T>时,可以通过controller方法中设置响应头来控制输出格式:

@GetMapping(value = "/{id}", produces = { MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_VALUE })
public HttpEntity<User> getUser(@PathVariable Long id) {
    User user = new User(id, "Tom", 18);
    return new ResponseEntity<User>(user, HttpStatus.OK);
}

由于Spring MVC使用了内容协商 Content Negotiation 来输出数据,我们还可以设置在请求头中 Accept 来控制输出数据的格式。

总结

@RestController相对于@Controller,主要是增加了对RESTful API的支持,也就是直接将返回结果作为json/xml输出给客户端,而不需要使用@ResponseBody来配合。

当我们需要返回数据时,如果是直接输出json/xml数据格式,那么应该使用 @RestController ;如果需要跳转页面,则应该使用 @Controller

以上是关于“@Controller、@RestController注解区别详解”的攻略,希望能对你有所帮助。

本文标题为:@Controller、@RestController注解区别详解

基础教程推荐