我正在尝试使用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>
我必须在这里遗漏一些非常明显的东西,所以如果有人能指出这一点,我会感激
解决方案
我通过反复试验找到答案,结果令人讨厌。如果这个结论是错误的,我希望有人可以纠正我,但看起来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
- 无需更改包装类型 罐 至 战争
- 无需修改主类
- 无需为其添加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>
没有任何配置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
首先想到你做的,就是在下面的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下,但这只是一个建议。
我希望这可以帮到你。
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文件放入其中。
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