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

时间:2016-03-19 09:51:12

标签: maven jsp spring-mvc 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>

我必须在这里遗漏一些非常明显的东西,所以如果有人可以指出这一点,那就太感激了!

8 个答案:

答案 0 :(得分:13)

解决方案

我通过反复试验找到了答案,结果令人讨厌。如果这个结论是错误的,我希望有人可以纠正我,但看起来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
  • 无需将包装类型从 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>

答案 1 :(得分:4)

没有任何配置,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

答案 2 :(得分:1)

首先想到你做的,就是在下面的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中的pakaging proeprties从jar变为战争如下

<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 startrer,如下所示

@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 :(得分:1)

我遇到了同样的问题,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> -->

我希望可以帮助遇到同样问题的任何人

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

答案 6 :(得分:-1)

根据@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

答案 7 :(得分:-2)

<!-- Tomcat for JSP rendering -->
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
        <scope>provided</scope>
    </dependency>

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