当前位置: 首页 > 知识库问答 >
问题:

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

邓俊材
2023-03-14

到处都写着Spring boot不支持jsp视图。在其官方文件中有三个原因

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

对于第一项,“使用可执行jar时不支持JSP”。但当我添加对tomcat的引用时,嵌入jasper并在应用程序中设置正确的资源路径。属性,也可以很好地呈现jsp文件。

我想这可能意味着SpringBoot在不涉及其他引用库(如TomcatEmbedJasper)的情况下不支持jsp。

但对于百里香,我们还必须进口Spring启动百里香。为什么我们可以说Spring boot支持包含额外LIB的Lif。

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

共有3个答案

鄂琛
2023-03-14

如果您选择使用JSP。事实证明,Java servlet容器(包括嵌入式Tomcat和Jetty容器)通常在/WEB-INF下的某个位置查找JSP。但如果您将应用程序构建为可执行JAR文件,则无法满足该要求。因此,只有将应用程序构建为WAR文件并将其部署在传统servlet容器中时,JSP才是一个选项。如果您正在构建一个可执行的JAR文件,那么必须选择Thymeleaf、FreeMarker或其他选项之一

沈飞跃
2023-03-14

谢谢罗宾·孙,

我加入了pomorg。阿帕奇。公猫嵌入:tomcat嵌入jasper编译。war和我的docker图像可以识别我的JSP

凌征
2023-03-14

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

当使用*jar作为打包时,springboot不能正确使用jsp作为视图解析器的主要原因是Tomcat中的硬编码文件模式。问题是,当您使用java-*。jar部署springboot应用程序,jsp文件将不会出现在嵌入式tomcat中,并且在尝试为请求提供服务时,您将得到一个找不到的404页面。这是因为jar打包,jsp文件没有从WEB-INF文件夹中复制。如果在使用jar作为打包时将jsp文件保存在META-INF/resources文件夹下,它应该可以工作。

Thymeleaf允许使用模板作为原型,这意味着它们可以作为静态文件查看,并放入resources/templates文件夹中供spring拾取。但是jsp文件将具有jstl标记等,需要在呈现之前由jasper进行传输,因此据我所知,它们不能设置为静态文件。

当使用WAR(WebApplication归档)时,打包将自动从以下项目结构中获取资源:

 |-- 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的指南和官方示例:指南,示例Repo

WAR打包结构坚持将jsp文件保存在webapp/文件夹下,它将按预期工作。maven war目标将文件从webapp文件夹复制到WEB-INF,所有资源文件(如jsp)都将位于war打包的根目录下。从这里开始,maven重新打包目标或spring boot重新打包负责使jar/war可执行。因此,如果文件出现在原始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,则放入此目录的任何内容都将根据WAR文档自动复制到WEB-INF/classes

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

spring.mvc.view.prefix = /WEB-INF/classes/templates
spring.mvc.view.suffix = .jsp
 类似资料:
  • 我已经为Android开发了几个月了,这个问题一次又一次地出现:在没有标准SDK中提供的情况下,添加全新特性(API)来支持库的动机是什么? 示例: FragmentTabHost API仅可通过使用。大多数情况下都很好,但是如果您想同时使用碎片嵌套和PreferenceFragment,您就会陷入困境--嵌套需要您切换到(用于支持4.2以下的版本),但是在这个支持库中没有PreferenceFr

  • 本文向大家介绍Mybatis 是否支持延迟加载?如果支持,它的实现原理是什么?相关面试题,主要包含被问及Mybatis 是否支持延迟加载?如果支持,它的实现原理是什么?时的应答技巧和注意事项,需要的朋友参考一下 Mybatis 仅支持 association 关联对象和 collection 关联集合对象的延迟加 载,association 指的就是一对一,collection 指的就是一对多查询

  • Python中的字符串是不可变的,这意味着该值不能更改。但是,在以下示例中,当附加到字符串时,由于id保持不变,看起来原始字符串内存被修改了: 相反,在以下示例中,id更改:

  • 我要求在JSF2.2页面上输入2个输入值。我们正在使用Primefaces控件。然后通过h:command按钮将这些值提交给托管bean方法。 然后,基于这些值,我想将同一JSF页面上的一个单独的输出字段设置为一个特定的值。 因此,我目前的问题是尝试连接一个托管bean,以便它将一个值返回到我的JSF页面上的字段,在本例中,字段名是mgrs。主要的问题是,我要处理的是生成返回值的第三方库,我不确定

  • 本文向大家介绍topic的分区数可不可以增加?如果可以怎么增加?如果不可以,那又是为什么?相关面试题,主要包含被问及topic的分区数可不可以增加?如果可以怎么增加?如果不可以,那又是为什么?时的应答技巧和注意事项,需要的朋友参考一下 可以增加 bin/kafka-topics.sh --zookeeper localhost:2181/kafka --alter --topic topic-co