如何使用spring4@RestController返回jsp页面?

如何使用spring4@RestController返回jsp页面?,spring,spring-mvc,Spring,Spring Mvc,当我像这样使用spring3@Controller时: @RequestMapping("/userCenter") @Controller public class LoginCtrl { @RequestMapping("/loginPage") public String login(HttpServletRequest request,HttpServletResponse response,Model model) throws Exception {

当我像这样使用spring3@Controller时:

@RequestMapping("/userCenter")

@Controller
public class LoginCtrl {
    @RequestMapping("/loginPage")
    public String login(HttpServletRequest request,HttpServletResponse response,Model model) throws Exception { 
        return "userCenter/loginPage";
    }
}
没关系,我在浏览器中获得了正确的loginPage.jsp内容

但当我将@Controller更改为@RestController时

localhost:8080//userCenter/loginPage返回一个带有字符串“userCenter/loginPage”的页面


那么,我如何使用@RestController获得像@Controller这样的jsp页面呢?

你不应该这样做。
@RestController
并不意味着通过
字符串
返回类型/值来返回视图名称。这意味着返回一些将直接写入响应体的内容

更具体地说(在一般配置情况下),Spring MVC在
RequestMappingHandlerAdapter\getDefaultReturnValueHandlers()
中配置其返回值处理程序。如果您查看该实现,
String
视图名称的处理程序
viewnamethodreturnvaluehandler
,在
@RestController
(实际上是
@ResponseBody
)和
RequestResponseBodyMethodProcessor
的处理程序之后注册


如果确实需要,可以声明方法的返回类型为
View
ModelAndView
(这些方法的处理程序
ViewMethodReturnValueHandler
ModelAndViewMethodReturnValueHandler
RequestResponseBodyMethodProcessor
之前注册)并返回具有标识视图名称的适当对象。

检查@RestController的API文档,它用@ResponseBody本身注释,这表明方法返回值应绑定到web响应主体。配置的视图对象永远不会起作用,因此无法映射到任何视图。
我的问题是,您为什么要使用RestController,它并不意味着要映射到任何视图?

实际上,
@RestController
也可以返回视图:

  • 将控制器方法的返回类型设置为
    ModelAndView

  • 按如下方式设置视图路径:

    @RequestMapping("/userCenter")
    
    @Controller
    public class LoginCtrl {
        @RequestMapping("/loginPage")
        public String login(HttpServletRequest request,HttpServletResponse response,Model model) throws Exception { 
            return "userCenter/loginPage";
        }
    }
    
    ModelAndView mav=newmodelandview(“用户中心/loginPage”)

  • 返回mav


  • 您将获得正确的JSO页面视图内容。

    @RestController
    为每个主体自动配置
    @ResponseBody
    ,这意味着它被设计为在输出上写入所有内容,而不是返回视图。如果要返回视图,请使用
    @Controller
    配置另一个类,并相应地返回该视图。

    对于@RestController创建重定向回退到REST Api仍然有用

    @GetMapping("/**")
    public ModelAndView Default()
    {
        ModelAndView mav = new ModelAndView("redirect:/actuator/health");
        return mav;
    }
    

    @RestController
    的具体要点是,您没有返回视图。
    @RestController
    直接返回响应体中的元素,而不是实际的视图。改用
    @Controller
    。是的,你可以这样做,但你不应该这样做。这里您缺少的是对REST API应该做什么和不应该做什么的基本理解。假设您需要在REST API上生成pdf,spring处理pdf生成的方式是通过视图,而不是消息转换器(使用响应体),因此我相信在某些特殊情况下,您需要将两者混合使用。(是的,rest api应该只与json或xml一起工作,客户端应该负责使用提供的数据呈现pdf,但同样,在一些特殊的用例中,即使在rest环境中,也应该由服务器生成报告)。请查看
    @RestController
    的源代码。它只是一个快捷方式(而不是同时拥有
    @Controller
    @ResponseBody
    ),并为您提供更好的可读性,仅此而已。不知道spring为什么引入
    @RestController
    的人假设您只想开发web服务。它不应该返回任何视图。比如说,你将为AndroID、ios、web或任何消费者公开该服务。任何人都可以仅使用API调用来使用该服务。这就是spring引入@RestController的原因。我认为
    @RestController
    不适用于经典的web应用程序,但imho text/html也是REST web服务的有效结果内容类型,视图可能有助于生成输出。我们在应用程序中对单个资源有不同的表示:json、xml或html,具体取决于
    Accept
    http头。@fishbone我不想争辩这一点。SpringMVC的编写方式是,由
    @RestController
    注释控制器中的方法返回的
    字符串
    视图名称将被解释为响应的内容,而不是视图名称。我将编辑我的答案,使之更清楚。