目录
  1. 1. 结论
  2. 2. 分析过程
    1. 2.1. jsp依赖
    2. 2.2. 配置文件属性
    3. 2.3. 编码
    4. 2.4. 结构图如下
  3. 3. 打包阶段
  4. 4. 启动并调试Fat-jar
    1. 4.1. Jar包物理图:
    2. 4.2. 源码分析
SpringBoot运行jsp原理浅析

结论

  1. 启动server的时候会创建临时目录
  2. 在浏览器中访问jsp文件的时候通过内置Tomcat将jsp转换为java,保存在临时目录中
  3. 然后编译为class文件,保存在临时目录中

分析过程

jsp依赖

官方不推荐在spring-boot中使用jsp文件。如果要使用,需要添加jasper依赖。

1
2
3
4
5
6
7
8
9
10
        <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>

配置文件属性

src/main/resources/application.properties配置文件

1
2
3
4
5
6
# 页面默认前缀目录
spring.mvc.view.prefix=/WEB-INF/jsp/
# 响应页面默认后缀
spring.mvc.view.suffix=.jsp
# 自定义属性,可以在Controller中读取
application.XXX=YYY

编码

  1. 编写Controller
  2. 编写JSP页面
  3. 编写启动类

结构图如下

打包阶段

需要在pom中的build中增加如下属性,目的是将指定目录下的资源打包:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<resources> 
            <!-- 打包时将jsp文件拷贝到META-INF目录下--> 
            <resource> 
                <!-- 指定resources插件处理哪个目录下的资源文件 --> 
                <directory>src/main/webapp</directory> 
                <!--注意此次必须要放在此目录下才能被访问到--> 
                <targetPath>META-INF/resources</targetPath> 
                <includes> 
                    <include>**/**</include> 
                </includes> 
            </resource> 
            <resource> 
                <directory>src/main/resources</directory> 
                <includes> 
                    <include>**/**</include> 
                </includes> 
                <filtering>false</filtering> 
            </resource> 
       </resources>

启动并调试Fat-jar

Jar包物理图:

源码分析

  1. 调用TomcatEmbeddedServletContainerFactory 类中的getEmbeddedServletContainer方法。

    1
    2
    Tomcat tomcat = new Tomcat();
    File baseDir = (this.baseDirectory != null ? this.baseDirectory: createTempDir("tomcat"));
  2. 创建Tomcat实例

  3. 第一次启动的时候,会创建临时目录basedir,两个文件夹,路径位置例如以下所示:C:\Users\用户名\AppData\Local\Temp\tomcat.7897322053330749685.8080和tomcat-docbase.1385973521217649694.8080
    初始目录中内容为空

  4. 初始化defaultServlet

  5. 初始化JspServlet

  6. ……

  7. 启动自定义application

  8. 访问jsp

    通过Archive提供的URL(如果Archive中有子Archive,可以通过第二个方法获取)。然后通过Classloader提供的访问classpath resource的能力来实现的。
    jsp访问路径在之前的配置文件中:

    1
    spring.view.prefix: /WEB-INF/jsp/
  9. 在浏览器中输入jsp地址,会调用内置Tomcat
    provides: tomcat-embed-core
    将jsp文件转换为java servlet文件,编译为class。

  10. 可以发现,临时目录下已经出现如下文件.java和.class

文章作者: 李浩
文章链接: https://leehoward.cn/2019/10/17/SpringBoot运行jsp原理浅析/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 leehoward
打赏
  • 微信
  • 支付宝

评论