Spring-boot运行jsp原理分析
 
结论:
  1. 启动server的时候会创建临时目录
  2. 在浏览器中访问jsp文件的时候通过内置Tomcat将jsp转换为java,保存在临时目录中
  3. 然后编译为class文件,保存在临时目录中。
 
分析过程如下:
编码阶段:
 
1、官方不推荐在spring-boot中使用jsp文件。
如果要使用,需要添加jasper依赖:
 
       
<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>
 
2、配置文件属性
src/main/resources/application.properties配置文件
# 页面默认前缀目录
spring.mvc.view.prefix=/WEB-INF/jsp/
# 响应页面默认后缀
spring.mvc.view.suffix=.jsp
# 自定义属性,可以在Controller中读取
application.XXX=YYY
 
  1. 编写Controller
 
  1. 编写JSP页面
 
  1. 编写启动类App.java
结构图如下

打包阶段
需要在pom中的build中增加如下属性,目的是将指定目录下的资源打包:
 
 <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方法。
Tomcat tomcat =
new Tomcat();
File
baseDir = (this.baseDirectory
!= null ?
this.baseDirectory: createTempDir("tomcat"));
  1. 创建Tomcat实例。
  2. 第一次启动的时候,会创建临时目录basedir,两个文件夹,路径位置例如以下所示:C:\Users\用户名
 \AppData\Local\Temp\tomcat.7897322053330749685.8080和tomcat-docbase.1385973521217649694.8080
 
初始目录中内容为空。
  1. 初始化defaultServlet

  1. 初始化JspServlet

……
……
……
 
  1. 启动自定义application
 
 
 
 
  1. 访问jsp。

通过Archive提供的URL(如果Archive中有子Archive,可以通过第二个方法获取)。然后通过Classloader提供的访问classpath
resource的能力来实现的。
jsp访问路径在之前的配置文件中:
spring.view.prefix:
/WEB-INF/jsp/
 
  1. 在浏览器中输入jsp地址,会调用内置Tomcat
provides: tomcat-embed-core
将jsp文件转换为java servlet文件,编译为class。
 
  1. 可以发现,临时目录下已经出现如下文件*.java和*.class:
 


spring boot 运行jsp原理分析的更多相关文章

  1. Spring Boot 实战与原理分析视频课程

    Spring Boot 实战与原理分析视频课程 链接:https://pan.baidu.com/share/init?surl=PeykcoeqZtd1d9lN9V_F-A 提取码: 关注公众号[G ...

  2. spring boot应用启动原理分析

    spring boot quick start 在spring boot里,很吸引人的一个特性是可以直接把应用打包成为一个jar/war,然后这个jar/war是可以直接启动的,不需要另外配置一个We ...

  3. Spring Boot应用启动原理分析(转)

    在spring boot里,很吸引人的一个特性是可以直接把应用打包成为一个jar/war,然后这个jar/war是可以直接启动的,不需要另外配置一个Web Server. 如果之前没有使用过sprin ...

  4. Spring Boot运行原理

    概述 本文主要写了下Spring Boot运行原理,还有一个小例子. Spring4.x提供了基于条件来配置Bean的能力,而Spring Boot的实现也是基于这一原理的. Spring Boot关 ...

  5. Spring Boot自动配置原理(转)

    第3章 Spring Boot自动配置原理 3.1 SpringBoot的核心组件模块 首先,我们来简单统计一下SpringBoot核心工程的源码java文件数量: 我们cd到spring-boot- ...

  6. Spring Boot自动配置原理、实战

    Spring Boot自动配置原理 Spring Boot的自动配置注解是@EnableAutoConfiguration, 从上面的@Import的类可以找到下面自动加载自动配置的映射. org.s ...

  7. Spring boot整合jsp

    这几天在集中学习Spring boot+Shiro框架,因为之前view层用jsp比较多,所以想在spring boot中配置jsp,但是spring boot官方不推荐使用jsp,因为jsp相对于一 ...

  8. Spring Boot 添加JSP支持【转】

    Spring Boot 添加JSP支持 大体步骤: (1)            创建Maven web project: (2)            在pom.xml文件添加依赖: (3)     ...

  9. 81. Spring Boot集成JSP疑问【从零开始学Spring Boot】

    [原创文章,转载请注明出处] 针对文章: ()Spring Boot 添加JSP支持[从零开始学Spring Boot] 有网友提了这么一些疑问: 1.Spring Boot使用jsp时,仍旧可以打成 ...

随机推荐

  1. vue框架初学习的基本指令

           学习地址:<ahref="https: cn.vuejs.="" org="" "="" targe ...

  2. dataTable 自定义排序

    $("#id").DataTable({ aaSorting: [0, 'desc'], // 默认排序 aoColumnDefs: [ {
 "bSortable&qu ...

  3. 如何使用koa实现socket.io官网的例子

    socket.io官网中使用express实现了一个最简单的IM即时聊天,今天我们使用koa来实现一下 ### 框架准备 确保你本地已经安装好了nodejs和npm,使用koa要求node版本> ...

  4. Python中的tuple

    tuple_lst = [ ('元祖容器可哈希',), ('元祖中的元素不可直接修改',), ('元祖可迭代',), ('查',), ('练习',), ] 元祖容器可哈希 >>>ha ...

  5. n个人排队都不站在原来的位置

    一.题目描述 有n个人首先站成一排,请问,当n个人第二次再重新排列,每个人都不在原来的位置上,问有多少种站法.例如,原来有3个人,ABC,那么第二次每个人都不在原来的位置上有2种站法,BCA和CAB, ...

  6. 后缀数组的使用心得——POJ2774 最长连续公共子串

    对于这道题,将两个字符串直接合并成为一个字符串,分别记录连个字符串结束的位置. 首先,应用黑暗圣典的模板,我们可以顺利得到height,rank,sa三个数组. 之后直接扫描1-n所有的位置,选出来一 ...

  7. 其它- in-place

    in-place 刷编程题的时候,经常遇到题目要求do in-place.所以就上网搜了相关概念,简单总结一下.   in-place操作,意思是所有的操作都是”就地“操作,不允许进行移动,或者称作  ...

  8. (WPF&Silverlight)silverlight自定义控件

    2个半小时弄懂了自定义控件是怎么回事儿. 在silverlight中创建一个UserControl,把上面sliderbar的外观和功能都封装在里面. 以自定义控件mapslider控件为例: 1.首 ...

  9. install golang plugin in webstrom

    https://github.com/go-lang-plugin-org/go-lang-idea-plugin/wiki/Documentation

  10. UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 19: ordinal not in range(128)

    解决方案: 1: 在网上找到的解决方案是: 在调用import matplotlib.pyplot as plt前 import sys sys.setdefaultencoding(“gbk”) 让 ...