【问题标题】:By default, where does Spring Boot expect views to be stored?默认情况下,Spring Boot 期望视图存储在哪里?
【发布时间】:2016-07-06 03:24:49
【问题描述】:

我正在尝试使用 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>

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

【问题讨论】:

  • 我在您的/WEB-INF/ 目录下看不到任何.jsp 文件。我只看到home.html 文件,这是一个jsp 文件和有问题的拼写错误吗?
  • @JBNizet 谢谢。不知道 JSP 的限制。
  • @SanjayRawat 是的,这是一个错字。感谢您指出。
  • 旧的,但这可能仍然相关:WEB_INF 目录不应该只保存 隐藏 视图吗?

标签: maven jsp spring-mvc spring-boot


【解决方案1】:

解决方案

我通过反复试验找到了答案,结果很烦人。如果这个结论是错误的,我希望有人能纠正我,但似乎 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>

【讨论】:

  • The ThymeLeaf 部分是这个答案的第二部分。第一段回答了原来的问题。除非你能证明 WEB-INF 配置对你有用?我对视图目录进行了简单的重命名,并且配置以某种方式起作用。您提出的所有“解决方案”均无效,并且当它是解决问题的唯一答案时,通过标记我的答案而感到痛苦。在这个社区里,你是一项非常糟糕的运动。
  • 嗯......我的作品我在应用程序属性中使用 spring.mvc.view.prefix=/WEB-INF/jsp/spring.mvc.view.suffix=.jsp
  • 在我看来,今天在 web 环境中使用 spring 的最佳方式是使用 ThymeLeaf,但如果你为 jsp 寻求帮助,我会为 jsp 提供帮助
  • 我刚刚尝试过,但它不起作用。我使用的是一个完全空的结构,所以应该没有其他因素。这是错误: Whitelabel 错误页面 此应用程序没有显式映射 /error,因此您将其视为后备。 Sun Mar 20 18:05:56 SGT 2016 出现意外错误(类型=未找到,状态=404)。没有可用的消息
  • 如果你想我在我的 github 上发帖,我的 poceeven 如果与官方指南非常相似:github.com/spring-projects/spring-boot/tree/master/…
【解决方案2】:

没有任何配置 Spring Boot 期望视图存储在 /webapp 中,视图页面可以是任何格式,取决于 application.properties 设置(如 html 或 jsp) 将 .jsp 设置为 /views/ 文件夹中的视图页面

spring.mvc.view.prefix=/views/
spring.mvc.view.suffix=.jsp //for .html change it to .html

你必须使用 tomcat jaspher ,如果你不包含它,页面将不会被解析,而是作为文件下载

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

【讨论】:

    【解决方案3】:

    如果您找到了这篇文章并且您正在返回

    return "home.jsp";
    

    而不仅仅是“家”。然后你必须删除

    spring.mvc.view.suffix=.jsp
    

    否则从家中删除 .jsp 并保留后缀!

    【讨论】:

      【解决方案4】:

      我遇到了同样的问题,JSP 页面放置得很好,并且在 application.properties 中正确设置了所需的配置

      查了很久,终于发现问题是pom.xml中应该去掉的依赖“spring-boot-starter-thymeleaf”引起的。事实上,这个依赖支持 Web 应用程序中的 XHML/HTML 文件,而我们使用的是 JSP 页面

      因此,如果我们在 Spring MVC 中使用 JSP 页面,则应移除以下任何类型的依赖项

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

      【讨论】:

        【解决方案5】:

        您首先想到的是,像下面这样在 pour 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 下,但这只是一个建议。

        希望对你有帮助。

        【讨论】:

        • 所有 3 个步骤都没有帮助
        • 很奇怪,您能详细说明您的错误吗?
        • 错误是未找到原版 404。我找到了根本原因并发布了我自己的答案。随意测试和批评!
        • 好的,我阅读了您的答案,这是真的,spring boot 期望您在模板中默认查看您的视图。但是在您的问题中,您似乎希望保留您的遗留结构 whit jsp 和在独立 werver 上运行的 webapp 的 maven 项目样式。如果您准备将用 jsp 编写的遗留应用程序迁移到具有嵌入式 Web 服务器的新 Web 应用程序(因此您不需要从 jar 更改为 war),请不要在独立的 Web 服务器中使用 jsp(对于这个原因你不需要我的其他改变)
        • 好的,我的答案不正确,但实际上您的问题不正确。如果你说请帮助我运行这种结构,我会尽力帮助你,但如果你可以改变你的应用程序结构,情况就完全不同了。无论如何,我很高兴你发现了问题
        【解决方案6】:

        根据@Jasbin karki 给出的答案,我尝试发现将您的 html 或 jsp 文件放在 main->webapp->views 文件夹中(您应该创建 webapp & views 文件夹)并在 application.properties 文件中添加以下行做任务。 在 application.properties 中添加以下内容:

        spring.mvc.view.prefix=/views/
        
        spring.mvc.view.suffix=.html //or .jsp- if its a jsp file
        

        【讨论】:

        • 您的回答并未提供对此问题的任何额外见解。这个问题在 5 年前已经有一个公认的答案,并且已经添加了多个其他答案,所以我不确定你为什么要添加另一个重复项。如果您想澄清一点,请改用 cmets。
        【解决方案7】:

        tys,请尝试添加依赖:

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

        参考:https://github.com/lenicliu/examples/tree/master/examples-spring-boot/examples-spring-boot-jsp

        spring.mvc.view.prefix是webapp文件夹的相对路径,可以放入jsp文件。

        【讨论】:

        • 这不是必需的。
        【解决方案8】:

        application.properties

        删除:

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

        添加:

        spring.thymeleaf.prefix= /WEB-INF/views/
        spring.thymeleaf.suffix= .html
        

        pom.xml

        移除 jasper 依赖:

        <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-thymeleaf</artifactId>
        </dependency>
        

        详情:Using thymeleaf instead of jsp

        【讨论】:

          【解决方案9】:
          <!-- Tomcat for JSP rendering -->
              <dependency>
                  <groupId>org.apache.tomcat.embed</groupId>
                  <artifactId>tomcat-embed-jasper</artifactId>
                  <scope>provided</scope>
              </dependency>
          

          将范围更改为“默认”解决了我的问题

          【讨论】:

          • 这与提出的问题无关,这里已经有很多确定的答案。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-12-19
          • 1970-01-01
          • 2019-08-15
          • 2017-01-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多