【死磕springboot2.0】@restcontroller与 @controller的 区别;

@restcontroller
*源码如下:其包含@Controller 、@ResponseBody *

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
    @AliasFor(
        annotation = Controller.class
    )
    String value() default "";
}

@controller 源码如下:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
    @AliasFor(
        annotation = Component.class
    )
    String value() default "";
}

区别:
@restcontroller 返回的为 json格式的数据;
@controller 返回的是字符串;使用 @controller要在前端页面展示数据需要配合html、jsp等视图渲染到前端, 如下controller层使用@controller注释方式;

/**
 * @auther SyntacticSugar
 * @data 2018/11/9 0009下午 10:50
 */
@Controller
@RequestMapping(method = RequestMethod.GET, value = "/")
    public String getuser(Model model) throws IOException {

        model.addAttribute("name",bob);
        model.addAttribute("sex",boy);
        return "user";//user是模板名
    }

返回的是user字符串;
数据需要配合jsp、或者html ,通过视图解析器 在前端展示;

只有在user.jsp 页面 进行展示,否则仅仅是 user字符串;但是,若是使用 @RestController 返回的是 user对象的 json 格式;如下图所示:

<html xmlns:th="http://www.thymeleaf.org">
<body>
    <div>
        <p>"${name}"</p>
        <p>"${sex}"</p>
    </div>
</body>
</html>

问题描述:
springboot 中在controller 层,添加@controller 注解, 请求无效; 跟换@RestController 注解,再次访问可以了,页面有显示 json格式的数据;

【死磕springboot2.0】@restcontroller与 @controller的 区别;

controller 层如下:

/**
 * @auther SyntacticSugar
 * @data 2018/11/10 0010上午 11:22
 */
//  @RequestMapping("user")  对外开放一个  user
//@Controller  和 @RestController

@RestController
@RequestMapping("user")
public class UserController {
    //
    @Autowired
    private UserService userservice;
    //@Bean    bug 一次  ,不需要@Bean注入
    // @getmapping    作用于某一个方法上
    @GetMapping("/{id}")
    public User queryById(@PathVariable("id") Long id) {
        return this.userservice.queryById(id);
    }
}

【死磕springboot2.0】@restcontroller与 @controller的 区别;
@PathVariable 注释,是从网址栏中获取数据,即从URL中获取数据;
上图中的 URL 为 localhost/user/{id} ;使用该注解获取到 Long id 的值作为参数传递;

查看下 @PathVariable的源码:
*就是给 path绑定 变量的; *
【死磕springboot2.0】@restcontroller与 @controller的 区别;

springMVC中获取浏览器的参数的注释有 3个:

@requestparm, @requestbody和@pathvariable ,只有@pathvariable是获取path的参数;@requestparm, @requestbody是由浏览器post提交参数;