1. 程式人生 > >【死磕springboot2.0】@restcontroller與 @controller的 區別;

【死磕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格式的資料;

sdf

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);
    }
}

sdf
@PathVariable 註釋,是從網址欄中獲取資料,即從URL中獲取資料;
上圖中的 URL 為 localhost/user/{id} ;使用該註解獲取到 Long id 的值作為引數傳遞;

檢視下 @PathVariable的原始碼:
*就是給 path繫結 變數的; *
dfd

springMVC中獲取瀏覽器的引數的註釋有 3個:

@requestparm, @requestbody和@pathvariable ,只有@pathvariable是獲取path的引數;@requestparm, @requestbody是由瀏覽器post提交引數;