使用场景
今天在学习SpringBoot集成jsp时,发现一个问题就是使用@RestController注解,jsp页面是直接返回return的值,且无视配置的视图解析器前缀和后缀。
package com.example.springbootjsp.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
//@RestController
@Controller
public class IndexController {
@RequestMapping(value = "/index")
public String Index(Model model){
model.addAttribute("data","springboot集成jsp页面!!");
return "index";
}
}
@RestController源码:
package org.springframework.web.bind.annotation;
@java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE})
@java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@java.lang.annotation.Documented
@org.springframework.stereotype.Controller
@org.springframework.web.bind.annotation.ResponseBody
public @interface RestController {
@org.springframework.core.annotation.AliasFor(annotation = org.springframework.stereotype.Controller.class)
java.lang.String value() default "";
}
@Controller源码:
package org.springframework.stereotype;
@java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE})
@java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@java.lang.annotation.Documented
@org.springframework.stereotype.Component
public @interface Controller {
@org.springframework.core.annotation.AliasFor(annotation = org.springframework.stereotype.Component.class)
java.lang.String value() default "";
}
分析
由此可以看出:
RestController注解比Controller多出一个注解@ResponseBody。
通过查询@ResponseBody注解是将java对象转换成json格式的数据。而在controller类中使用其注解后,是不走视图解析器,而是直接返回return中的值到前端。
结论
- 使用RestController注解,Controller类中的方法无法返回jsp页面或者HTML,而且配置视图解析器也不生效,在前端直接返回其return中的值。
- 使用Controller注解,想返回jsp页面则需要配置其视图解析器,如需要返回其json格式数据,需方法上加@ResponseBody即可。