一尘不染

如果我们添加适当的jar引用,为什么Spring Boot不支持jsp却可以呈现页面,为什么它不支持jsp

spring-boot

到处都写有Spring Boot不支持jsp视图。在其正式文件中有三个原因

  • 对于Jetty和Tomcat,如果使用战争包装,它应该可以工作。与java
    -jar一起启动时,可执行的war将起作用,并且还将可部署到任何标准容器中。使用可执行jar时,不支持JSP。
  • Undertow不支持JSP。
  • 创建定制的error.jsp页面不会覆盖默认视图以进行错误处理。应改用自定义错误页面。

对于第一项,“使用可执行jar时不支持JSP”。但是,当我添加对tomcat-embed-
jasper的引用并在application.properties中设置正确的资源路径时,jsp文件也可以很好地呈现。

我想这可能意味着如果不调用其他参考库(例如tomcat-embed-jasper),Spring Boot将不支持jsp。

但是对于百里香,我们还必须导入spring-boot-starter-thymeleaf。为什么我们可以说Spring
Boot通过附加的库来支持thymleaf。

那么我如何理解文档中的第一项呢?


阅读 396

收藏
2020-05-30

共1个答案

一尘不染

默认情况下,嵌入式Tomcat软件包(在springboot中用于创建可执行jar)不包含JSP,因此我们还必须添加该模块“org.apache.tomcat.embed:tomcat- embed-jasper”,这就是我们tomcat-embed-jasper在springboot
中添加为依赖项的原因,以便可以使用jstl标记在jsp中。

当将springboot *jar用作打包时,springboot无法与jsp作为视图解析器一起正常工作的主要原因是由于 Tomcat 中使用
了硬编码的文件模式 。问题是,当您java -*.jar用于部署springboot应用程序时,jsp文件不会出现在嵌入式tomcat中,并且在尝试满足请求时,您将获得 404 PAGE NOT
FOUND
。这是因为jar打包,所以不会从WEB-INF文件夹中复制jsp文件。如果META- INF/resources使用jar打包时将jsp文件保留在文件夹下,则应该可以。

Thymeleaf允许将模板用作原型,这意味着可以将它们视为静态文件并放在resources/templates文件夹中以供spring使用。但是jsp文件将具有jstl标记等,在呈现之前需要jasper对其进行编译,因此无法将其设置为据我所知静态文件。

使用 WAR (Web应用程序归档文件)时,打包将自动从以下项目结构中获取资源:

 |-- pom.xml
 `-- src
     `-- main
         |-- java
         |   `-- com
         |       `-- example
         |           `-- projects
         |               `-- SampleAction.java
         |-- resources
         |   `-- images
         |       `-- sampleimage.jpg
         `-- webapp
             |-- WEB-INF
             |   `-- web.xml
             |-- index.jsp
             `-- jsp
                 `-- websource.jsp

在jsp中使用springboot的指南和官方样本:Guide示例仓库

WAR打包结构坚持将jsp文件保存在webapp/文件夹下,并且它将按预期工作。maven war目标会将文件从webapp文件夹复制到WEB- INF,所有资源文件(如jsp)将位于war包装的根目录。从此处开始,maven-repackage目标或spring boot重新包装将负责制作jar
/ war可执行文件,因此,如果这些文件存在于原始war中,它也将位于可执行文件中。springboot 可执行war结构 如下所示:

example.war
 |
 +-META-INF
 |  +-MANIFEST.MF
 +-org
 |  +-springframework
 |     +-boot
 |        +-loader
 |           +-<spring boot loader classes>
 +-WEB-INF
    +-classes
    |  +-com
    |     +-mycompany
    |        +-project
    |           +-YourClasses.class
    +-lib
    |  +-dependency1.jar
    |  +-dependency2.jar
    +-lib-provided
       +-servlet-api.jar
       +-dependency3.jar

因此,对于评论:

如果将jsp文件放在文件夹中src/main/resources,则WEB-INF/classes根据 WAR
文档,该目录中的所有内容都将自动复制到。

因此,如果将jsp文件保存在src / main /
resources下并在yml或属性文件中配置以下内容,则该文件应可用于WAR存档。我还没有尝试过,所以不确定。

spring.mvc.view.prefix = /WEB-INF/classes/templates
spring.mvc.view.suffix = .jsp
2020-05-30