上一节讲到了快速新建一个springboot应用,以及springboot的自动配置类起作用的时机,并且一起看了一个自动配置类的源码。

  这一节我们来粗略看看当用户在浏览器输入一个url,怎么样返回一个静态HTML和动态网页,以及其中的原理。

  在此之前说一点,springboot不支持jsp,也就是说以前我们写的jsp页面页面在这里解析不了,换句话说,springboot肯定有一个自己独有的类似jsp的技术来实现动态网页的访问,这点毫无疑问,不然一个网站只能访问html网页,太单调了。

  springboot的这个独有的技术是thymeleaf,下面就简要说说thymeleaf,要想彻底学会还需要自己多查查资料,我这里只能说一个大概的。

1.初识thymeleaf

  作为一个类似于jsp的技术,用脚趾头想肯定是类似标签的东西、符合thymeleaf语法,经过thymeleaf引擎解析(thymeleaf引擎又是个什么东西呢?很抽象,我也说不好说;总之,想想jsp引擎,不就是将那些jsp页面里的所有标签解析成servlet,然后向用户响应servlet,第一次请求要先将jsp文件里面的东西全部解析成servlet,然后还要编译成.class文件,运行,然后才能响应简直了,而且jsp开发比较慢,以及后期的项目部署花费比较高,虽然说jsp第二次以及之后运行速度很快、安全性比较好,但是市场上用jsp开发的大多是银行啊这些国企,小企业是没有那个经济用jsp开发,扯远了。。。)

  目录结构

  用thymeleaf之前,导入依赖以及版本控制(这个可以不用springboot自带的版本),以及在带有thymeleaf的html文件加入名称空间

  pom.xml文件:

  说说thymeleaf语法基本就是这样一个模式,th:xx=“${xxx}”,这里的xx可以是任意属性值,假设有如下一个controller

  打开success.html,

  还有th:if   th:object   th:each等标签的运用自己去试试,跟jsp里面的标签及其相似,这里不多说了。根据上面的设置,运行,打开浏览器测试,打开heml源码就能看到效果。

2.thymeleaf小知识

  为什么controller里面返回的success,就会跳转到template/success.html页面,thymeleaf引擎就会将其解析,并响应呢?而且静态网页为什么是放在那个static文件夹下,放在其他地方行吗?这都是需要大概了解的

  首先,我们打开这个类

  

  

  我们打开ThymeleafProperties这个类,可以看到一些属性

  这就很明显了,配置了前缀后缀,无非是视图解析器调用这个类中的属性,然后和controller返回的字符串(就是所谓的逻辑视图名)和这个前后缀拼接组成真正的视图全路径,再调用模板引擎去解析成最终的html,然后响应。

  由此,我们就要知道,thymeleaf文件就要放在类路径下的template文件夹下,并且以.html结尾,或者自己去主配置文件spring.thymeleaf.xx="xxx"去自定义位置。

3.静态文件路径解析

  接下来是静态文件夹,还记不记得前面的导入了很多的xxxAutoConfiguration,这里的静态文件位置就要用到一个,就是WebMvcAutoConfiguration,这个自动配置类其实就是相当于ssm的springmvc配置。

  补充一个知识点,webjars网站https://www.webjars.org/,这里将很多的东西都打包成了jar包,想要用什么只需要导入相关的依赖就可以了。

  比如springboot会用到jquery,webjars的依赖,然后html文件里引用就好。

  打开这个类WebMvcAutoConfiguration,看到这个方法里里面

  现在我们就要看看staticPathPattern到底是什么,点开getStaticPathPattern();------------->点开return xxx.staticPathPattern-------->看到private String staticPathPattern = "/**";

我们就明白了,访问路径:我们只要在浏览器输入localhost:8080/xxx都可以了

  继续分析this.resourceProperties.getStaticLocations()这个,这代表springboot会去哪里找你想要的静态文件

  点开.getStaticLocations()------->点开return this.staticLocations;---------->private String[] staticLocations = RESOURCE_LOCATIONS;(点开RESOURCE_LOCATIONS),最后,你能看到如下代码

  结论

  1.假如你在浏览器输入localhost:8080/webjars/xxx,springboot就会遍历所有jar包下的webjars,直至找到xxx文件

  2.假如你在浏览器输入localhost:8080/xxx,那么springboot就会在如下的五个路径下依次遍历,直到找到则个静态文件,否则,抛出异常

{"/",

"classpath:/META-INF/resources/",

"classpath:/resources/",

"classpath:/static/",

"classpath:/public/" };

  3.假如在浏览器输入localhost:8080/xxx(动态网页),springboot就会去类路径下template/xxx.html文件

带着萌新看springboot源码03的更多相关文章

  1. 带着萌新看springboot源码8(spring ioc源码 完)

    上一节说到实例化了所有的单实例Bean,后面还有一步遍历 12.完成容器刷新(finishRefresh();) 那个和生命周期有关的后置处理器类型是LifecycleProcessor:监听器原理我 ...

  2. 带着萌新看springboot源码05

    上一节走了一遍从浏览器发出请求到得到向页面的流程,基本的功能是已经实现了.但是现在啊,我想自定义一个拦截器(拦截器可以做用户登录验证,如果登录了,就让你通过,如果没有登录,就重定向登录页面),这里就不 ...

  3. 带着萌新看springboot源码8(spring ioc源码上)

    emmm.....这次先不说springboot原理,先好好回顾一下以前的注解版spring原理,先把spring原理了解清晰了,再看springboot原理更容易. 要说起spring,最重要的就是 ...

  4. 带着萌新看springboot源码12(启动原理 下)

    先继续接上一篇,那个启动原理还有一点没说完. 6. afterRefresh(context, applicationArguments); 看这个名字就知道,应该就是ioc容器刷新之后的一些操作了, ...

  5. 带着萌新看springboot源码11(springboot启动原理 源码上)

    通过前面这么多讲解,springboot原理应该也大概有个轮廓了,一些基本的配置,从客户端url到controller(配置一些要用的组件,servlet三大组件,处理器映射器,拦截器,视图解析器这些 ...

  6. 带着萌新看springboot源码10(springboot+JdbcTemplate+druid)

    上一节把springboot和jdbcTemplate大概用法说了一下,以及大概看了一下源码,还说了加载sql文件时的原理. 这一节来看看自动注入JdbcTemplate的原理,顺便用一用Druid数 ...

  7. 带着萌新看springboot源码09(springboot+JdbcTemplate)

    emmm.....常规开局,继续说一下废话,前面简单的说了一下spring的ioc容器创建原理(花了不少时间去看了别人的博客+查了不少资料+自己的理解),相信大家对ioc容器有了一个初步的认识了. s ...

  8. 带着萌新看springboot源码04

    继续开头说些废话,我也不知道什么鬼,每次写着写着经常会写到其他地方去了,太容易分神了. 这次说一下springboot对于springmvc的大概整个流程,以请求动态网页为例 . 1.梳理一下spri ...

  9. 带着萌新看springboot源码8(spring ioc源码下)

    继续接着上一节,到了第六步(温馨提醒,内容有点小多,不过看完ioc原理就差不多了) 6.注册Bean后置处理器(registerBeanPostProcessors(beanFactory)) 最后一 ...

随机推荐

  1. 派多个订单给一个司机,拒单是同一订单id

    问题:多次派单给一个司机,发现多个拒单请求是同一个订单id的. 原因:来单页面是SingleTask, 并且没有重写onNewIntent, 而倒计时结束拒单的时候会弹窗提示,只有点了确认按钮才会把当 ...

  2. scrapy 教程

    pip install Scrapy 结果报错,那就一个一个安装吧 一.安装  1.pip install wheel 后面的都一样 pip install lxml pip install pyop ...

  3. GitLab在centos7上安装和使用

    git的优点 git是分布式的,svn不是 git分布式本地就可以用,可以随便保存各种历史痕迹,不用担心污染服务器,连不上服务器也能提交代码.查看log. GIT分支和SVN的分支不同 分支在SVN中 ...

  4. android BLE Peripheral 模拟 ibeacon 发出ble 广播

    Android对外模模式(peripheral)的支持: 从Android 5.0+开始才支持. api level >= 21 所以5.0 之前设备,是不能向外发送广播的. Android中心 ...

  5. Linux SVN服务器的搭建配置及分支的创建与合并

    第一步:通过yum命令安装svnserve,命令如下: >yum -y install subversion 若需查看svn安装位置,可以用以下命令: >rpm -ql subversio ...

  6. mysql数据库内容相关操作

    第一:介绍 mysql数据内容的操作主要是: INSERT实现数据的插入 UPDATE实现数据的更新 DLETE实现数据的删除 SELECT实现数据的查询. 第二:增(insert) 1.插入完整的数 ...

  7. autpmapper映射忽略某个属性

    1.直接加特性[IgnoreMap] 2.映射规则 CreateMap<BaseAccount, BaseAccountListDto>().ForMember(dest => de ...

  8. QT中foreach的使用

    在标准C++中,并没有foreach关键字. 但是在QT中,可以使用这一个关键字,其主要原因是QT自己增加了这一个关键字,就像slots和signals.emit等一样.增加的foreach关键字在编 ...

  9. VIM批量缩进

    方法一 1.按 ctrl + shif + ;  进入底行模式 2.将所要批量缩进的行号写上,按照格式:“行号1,行号2>”输入命令,如要将4至11行批量缩进一个tab值,则命令为“4,11&g ...

  10. Java 2018 面试

    1.Java的引用有什么作用?传递的是什么? Java的引用可以用来操作对象,传递的是对象的地址 2.引用分为几种?他们的区别是什么?弱引用用在什么地方? 分四种:强引用 . 软引用 . 弱引用 . ...