【问题标题】:how to use spring4 @RestController to return a jsp page?如何使用spring4 @RestController 返回一个jsp页面?
【发布时间】:2014-09-25 05:32:17
【问题描述】:

当我像这样使用 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 的具体是您没有返回视图。
  • @RestController 直接在响应正文中返回一个元素,而不是实际的视图。请改用@Controller

标签: spring spring-mvc


【解决方案1】:

你不应该。 @RestController 并不意味着通过 String 返回类型/值返回视图名称。它旨在返回将直接写入响应正文的内容。

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

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

【讨论】:

  • 有人不知道spring为什么介绍@RestController
  • 假设您只想开发 Web 服务。它不应该返回任何视图。假设您要为 andorid、ios、web 或任何消费者公开该服务。任何人都可以仅使用 API 调用来使用该服务。这将是春天引入@RestController 的原因。
  • 我同意 @RestController 不适用于经典 Web 应用程序,但 imho text/html 也是 REST Web 服务的有效结果内容类型,并且 View 可能有助于生成输出。我们的应用程序中的单个资源有不同的表示形式:json、xml 或 html,具体取决于 Accept http-header。
  • @fishbone 我并不是要争辩。 Spring MVC 的编写方式,@RestController 注释控制器中的方法返回的String 视图名称将被解释为响应的内容而不是视图名称。我将编辑我的答案以使其更清楚。
【解决方案2】:

其实@RestController也可以返回视图:

  1. 设置控制器方法的返回类型为ModelAndView

  2. 像这样设置你的视图路径:

    ModelAndView mav = new ModelAndView("userCenter/loginPage");

  3. return mav;

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

【讨论】:

  • 是的,你可以这样做,但你不应该这样做。您在这里缺少的是对 REST API 应该做什么和不应该做什么的基本理解。
  • 假设你需要在你的rest api上生成pdf,spring处理pdf生成的方式是通过视图,而不是消息转换器(使用响应体),所以我相信有一些特殊情况你需要混合两者。 (是的,rest api 应该只与 json 或 xml 一起使用,并且客户端应该负责使用提供的数据呈现 pdf,但是同样,有一些特殊的用例应该由服务器生成报告,即使在休息环境)。
  • 查看@RestController的来源。它只是一个捷径(而不是同时拥有@Controller@ResponseBody),并为您提供更好的可读性,仅此而已。
【解决方案3】:

查看 @RestController 的 API 文档,它本身带有 @ResponseBody 注释,这表明方法返回值应该绑定到 Web 响应正文。配置的视图对象永远不会发挥作用,因此它不能映射到任何视图。 我的问题是你为什么要使用 RestController,它不是要映射到任何视图?

【讨论】:

    【解决方案4】:

    @RestController 仍然可以用于创建重定向回退到您的 REST Api

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        @RestController 实际上仅将 HTTP 响应返回为 JSON 或 XML。

        1. @RestController 在内部使用@ResponseBody 进行注释。
        2. @ResponseBody 注解告诉控制器返回的对象自动序列化为 JSON 并传回 HttpResponse 对象。

        但是如果你想以 JSP 的形式返回,你可以像下面这样使用 ModelAndView。

        示例:

        @RestController 公共类 HomeController {

        @RequestMapping("/")
        public ModelAndView getHome() {
            ModelAndView mav = new ModelAndView("home.jsp");
            return mav;
        }
        

        }

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-13
          • 2013-02-18
          • 1970-01-01
          • 2012-08-04
          • 2017-06-05
          • 2012-01-30
          • 1970-01-01
          相关资源
          最近更新 更多