问题 默认情况下,Spring Boot期望存储哪些视图?


我正在尝试使用Spring Boot重新编写我的配置繁重的vanilla 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>

我必须在这里遗漏一些非常明显的东西,所以如果有人能指出这一点,我会感激


12820
2018-03-19 09:51


起源

你读过这个吗? docs.spring.io/spring-boot/docs/current/reference/htmlsingle/... - JB Nizet
我没有看到任何 .jsp 你的文件 /WEB-INF/ 目录。我只看到了 home.html 文件,是一个jsp文件和错误的错误? - Sanjay Rawat
@JBNizet谢谢。不了解JSP的局限性。 - tys
@SanjayRawat是的,这是一个错字。谢谢你指出来。 - tys


答案:


解决方案

我通过反复试验找到答案,结果令人讨厌。如果这个结论是错误的,我希望有人可以纠正我,但看起来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.propertiesspring.mvc.view.prefix + spring.mvc.view.suffix
  • 无需更改包装类型  至 战争
  • 无需修改主类
  • 无需为其添加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>

8
2018-03-20 09:35



ThymeLeaf部分是这个答案的第二部分。第一段回答了原来的问题。除非你能证明WEB-INF配置在某种程度上适合你吗?我做了一个简单的视图目录重命名和配置以某种方式工作。你提出的所有“解决方案”都不起作用,当你解决这个问题的唯一答案是标记我的答案时,你会感到痛苦。你在这个社区是一项非常糟糕的运动。 - tys
嗯......我为我工作我在应用程序proeprties中使用spring.mvc.view.prefix = / WEB-INF / jsp / spring.mvc.view.suffix = .jsp - Valerio Vaudi
在我看来,今天在网络环境中使用spring的最好方法是使用ThymeLeaf但是如果你要求帮助jsp我用于jsp的answare - Valerio Vaudi
我刚刚尝试过,它不起作用。我使用的是完全空的结构,所以不应该有其他因素。这是错误:Whitelabel错误页面此应用程序没有/ error的显式映射,因此您将此视为回退。 Sun Mar 20 18:05:56 SGT 2016出现意外错误(type = Not Found,status = 404)。没有消息可用 - tys
如果你想要我在我的github上发布我的poceven如果与官方指南非常相似: github.com/spring-projects/spring-boot/tree/master/... - Valerio Vaudi


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

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

并且你必须使用tomcat jaspher如果你不包含它,页面将不会被显示而是被下载为文件

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

2
2017-07-01 08:57





首先想到你做的,就是在下面的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启动时说过提供了嵌入式tomcat依赖项,这会导致spring应用程序在jar中没有tomcat依赖项。

第二个想你已经做过,就是将你的pon中的pakaging proeprties从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>

第三个也是最后一个认为你做的是重构标准的Application Boot启动器,如下所示

@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下,但这只是一个建议。

我希望这可以帮到你。


1
2018-03-19 13:29



所有3个步骤都没有帮助 - tys
你能否详细了解你的错误,这很奇怪? - Valerio Vaudi
错误是找不到香草404。我找到了根本原因并发布了我自己的答案。随意测试和批评! - tys
好的,我引用了你的answare,这是真的,spring boot期望你的视图在模板中是deffault。但是在您的问题中,您希望保留您的遗留结构whit jsp以及在独立的服务器上运行的webapp的maven项目样式。如果您准备将使用jsp编写的旧应用程序迁移到具有嵌入式Web服务器的新Web应用程序(因此您无需从jar更改为war),请不要在独立Web服务器中使用jsp(对于这个原因你不需要我的其他改变) - Valerio Vaudi
好吧我的answare不正确,但实际上你的问题是不正确的。如果你说请帮助我运行这种结构我试着帮助你,但如果你可以改变你的应用程序结构,情况就完全不同了。无论如何,我很高兴你发现了这个问题 - Valerio Vaudi


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文件放入其中。


0
2018-03-19 13:17



这不是必需的。 - tys


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>

细节: 使用百里香叶而不是jsp


-1
2018-01-17 01:56