Spring MVC 如何决定 homecontroller 和 jsp 之间的冲突?

How does Spring MVC decide on conflict between homecontroller and jsp?

我正在将 Spring MVC app 转换为 Spring Boot。 Spring 应用有一个家庭控制器:

@RestController
public class HomeController {...
    ...
@RequestMapping("/login")
public String login(Principal p) {
    return "login";
    }
}

应该只显示单词 'login'。然而,这似乎被忽略了,因为它在 src/webapp/WEB-INF/views 下还有一个 login.jsp,它做的更多,这是 运行.

时显示的内容

当我将 simple-web-app 剪切并粘贴到 Boot 应用程序时,我只得到 'login' 这个词。

对于更复杂的 jsp 输出,Spring 如何神奇地忽略单词 'login'?我如何在 Boot 中模仿它?

PS 我试过添加:

<dependency> 
    <groupId>org.apache.tomcat.embed</groupId> 
    <artifactId>tomcat-embed-jasper</artifactId> 
    <scope>provided</scope> 
</dependency>

spring.mvc.view.prefix=/views/ 
spring.mvc.view.suffix=.jsp

在Spring 框架中,如果要将字符串写入响应主体,则需要使用关键字@ResponseBody。来自 documentation

@ResponseBody annotation and, therefore, writes directly to the response body versus view resolution and rendering with an HTML template.

或者,在您的情况下,@RestController 注释是

A convenience annotation that is itself annotated with @Controller and @ResponseBody.

如果您不使用此关键字,则 Spring 将搜索具有给定路径的文件。为此,它使用 viewResolver。参见 16.5 Views and resolving them

这是一个示例,您可以在其中看到 属性 允许 Spring 解析文件的真实路径:

<bean id="viewResolver"
      class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <property name="suffix" value=".jsp"/>
</bean>

@RestController 不用于返回呈现的 JSPs。这就是 Spring Boot 只响应字符串 login 的原因。尝试将其更改为以下内容:

@Controller
public class HomeController {

    @RequestMapping("/login")
    public String login(Principal p) {
        //do something with your Principal if you want...
        return "login";
    }
}

如果其他所有配置都正确,Spring 将查找名为 login(您的 JSP)的模板并将其用作视图。

@RestController 是一个 Spring 注释,用于构建 RESTful Web Service(在控制器中定义的 Rest-API 端点)。

顺便说一句,here 您可以找到更多关于如何进行的信息,不幸的是,还有一些不将 JSP 与 Spring 引导容器和嵌入式容器一起使用的原因,而是使用不同的模板引擎。

希望对您有所帮助!

编辑:这个问题的另一个答案提到了视图解析器——这确实不重要!但它是 Spring Boot 和 JSP 的特例。为了正确起见,this article 我刚刚发现可能会有所帮助!