默认情况下,Spring Boot 期望视图存储在哪里?

新手上路,请多包涵

我正在尝试使用 Spring Boot 重写我的配置繁重的普通 Spring MVC 项目。我使用 Spring Boot Initiaizer 在 IntelliJ 中启动了一个全新的 Spring Boot 项目,并且我将采用基于 Java 的最小配置的路线。许多教程指出,生成的默认主类就足够了,而且 @SpringBootApplication 包含所有内容。我得到了一个示例 REST 控制器来工作并将一个序列化对象作为 JSON 返回,但似乎要显示一个视图是很困难的。我的结构如下,除了我创建的 webapps 目录之外的所有内容都是默认的。

 src
`-main
   `-java
   `-resources
     `-static
     `-templates
   `-webapp
     `-WEB-INF
        `-home.jsp

控制器很简单。

 @Controller
public class ViewMaster {
    @RequestMapping("/home")
    public String home() {
        return "home";
    }
}

没有任何配置,我想知道 Spring Boot 期望视图存储在哪里以及使用什么扩展名(html?)。我还尝试在 application.properties 中包含以下内容,但仍然出现 404 错误。移动 WEB-INF 目录或仅移动资源中的 html 文件也无济于事。

 spring.mvc.view.prefix=/WEB-INF/
spring.mvc.view.suffix=.jsp

我也尝试在我的 pom.xml 中包含这些依赖项,但没有任何效果。

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

我一定在这里遗漏了一些非常明显的东西,如果有人能指出这一点,我将不胜感激!

原文由 ystan- 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 517
2 个回答

解决方案

我通过反复试验找到了答案,结果很烦人。如果这个结论是错误的,我希望有人能纠正我,但似乎 Spring Boot 不喜欢字符串 WEB-INF 。我将 WEB-INF 目录重命名为 view 并将 --- application.properties --- 更改为以下内容并成功加载视图。

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

其他发现

本练习的目的是创建一个基于 Java 的 最小 配置的工作示例,因此我继续最小化设置。然后我发现在多个 SO 线程和论坛上提出的许多建议并没有帮助。 @JBNizet 在他对 Spring Boot 文档的评论中提供了一个链接,该链接列出了一个没有人提到的非常突出的点: JSP 根本不能很好地与 Spring Boot 配合使用,因为它有一些限制,具体取决于所选的嵌入式容器。考虑到这一点,我决定尝试用 ThymeLeaf 模板替换 JSP。

我的新工作配置消除了对这些的需求:

  • 无需添加 application.properties : spring.mvc.view.prefix + spring.mvc.view.suffix
  • 无需将包装类型从 jar 更改为 war
  • 无需修改主类
  • 无需添加 pom.xml 依赖项
    • org.springframework.boot / spring-boot-starter-tomcat
    • org.springframework.boot / tomcat-embed-jasper
    • javax.servlet / jstl

因此,只需将默认的 Spring Boot 模板和 2 个 ThymeLeaf 依赖项与视图命名为 ViewName.html 放在 src/main/resources/templates 中。

 <dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf</artifactId>
</dependency>

<dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf-spring4</artifactId>
</dependency>

原文由 ystan- 发布,翻译遵循 CC BY-SA 3.0 许可协议

第一个认为你要做的是将依赖项插入到 pump pom 中,如下所示

<dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

有了这个依赖项,您在 spring boot 中说提供了嵌入式 tomcat 依赖项,这会导致您的 spring 应用程序在 jar 中没有 tomcat 依赖项。

第二个想法是你要做的是将你的pon中的包装属性从jar更改为war,如下所示

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
...
    <packaging>war</packaging>
    ....
</project>

您要做的第三个也是最后一个想法是重构标准的应用程序启动启动器,如下所示

@SpringBootApplication
public class Application extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }
}

因为您在应用程序属性中的配置可能很好,但我建议您将您的 jsp 放在特定文件夹下,然后重构您的配置以指向新路径,而不仅仅是在 WEB-INF 下,但这只是一个建议。

我希望这可以帮助你。

原文由 Valerio Vaudi 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进