带着萌新看springboot源码03
上一节讲到了快速新建一个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的更多相关文章
- 带着萌新看springboot源码8(spring ioc源码 完)
上一节说到实例化了所有的单实例Bean,后面还有一步遍历 12.完成容器刷新(finishRefresh();) 那个和生命周期有关的后置处理器类型是LifecycleProcessor:监听器原理我 ...
- 带着萌新看springboot源码05
上一节走了一遍从浏览器发出请求到得到向页面的流程,基本的功能是已经实现了.但是现在啊,我想自定义一个拦截器(拦截器可以做用户登录验证,如果登录了,就让你通过,如果没有登录,就重定向登录页面),这里就不 ...
- 带着萌新看springboot源码8(spring ioc源码上)
emmm.....这次先不说springboot原理,先好好回顾一下以前的注解版spring原理,先把spring原理了解清晰了,再看springboot原理更容易. 要说起spring,最重要的就是 ...
- 带着萌新看springboot源码12(启动原理 下)
先继续接上一篇,那个启动原理还有一点没说完. 6. afterRefresh(context, applicationArguments); 看这个名字就知道,应该就是ioc容器刷新之后的一些操作了, ...
- 带着萌新看springboot源码11(springboot启动原理 源码上)
通过前面这么多讲解,springboot原理应该也大概有个轮廓了,一些基本的配置,从客户端url到controller(配置一些要用的组件,servlet三大组件,处理器映射器,拦截器,视图解析器这些 ...
- 带着萌新看springboot源码10(springboot+JdbcTemplate+druid)
上一节把springboot和jdbcTemplate大概用法说了一下,以及大概看了一下源码,还说了加载sql文件时的原理. 这一节来看看自动注入JdbcTemplate的原理,顺便用一用Druid数 ...
- 带着萌新看springboot源码09(springboot+JdbcTemplate)
emmm.....常规开局,继续说一下废话,前面简单的说了一下spring的ioc容器创建原理(花了不少时间去看了别人的博客+查了不少资料+自己的理解),相信大家对ioc容器有了一个初步的认识了. s ...
- 带着萌新看springboot源码04
继续开头说些废话,我也不知道什么鬼,每次写着写着经常会写到其他地方去了,太容易分神了. 这次说一下springboot对于springmvc的大概整个流程,以请求动态网页为例 . 1.梳理一下spri ...
- 带着萌新看springboot源码8(spring ioc源码下)
继续接着上一节,到了第六步(温馨提醒,内容有点小多,不过看完ioc原理就差不多了) 6.注册Bean后置处理器(registerBeanPostProcessors(beanFactory)) 最后一 ...
随机推荐
- 派多个订单给一个司机,拒单是同一订单id
问题:多次派单给一个司机,发现多个拒单请求是同一个订单id的. 原因:来单页面是SingleTask, 并且没有重写onNewIntent, 而倒计时结束拒单的时候会弹窗提示,只有点了确认按钮才会把当 ...
- scrapy 教程
pip install Scrapy 结果报错,那就一个一个安装吧 一.安装 1.pip install wheel 后面的都一样 pip install lxml pip install pyop ...
- GitLab在centos7上安装和使用
git的优点 git是分布式的,svn不是 git分布式本地就可以用,可以随便保存各种历史痕迹,不用担心污染服务器,连不上服务器也能提交代码.查看log. GIT分支和SVN的分支不同 分支在SVN中 ...
- android BLE Peripheral 模拟 ibeacon 发出ble 广播
Android对外模模式(peripheral)的支持: 从Android 5.0+开始才支持. api level >= 21 所以5.0 之前设备,是不能向外发送广播的. Android中心 ...
- Linux SVN服务器的搭建配置及分支的创建与合并
第一步:通过yum命令安装svnserve,命令如下: >yum -y install subversion 若需查看svn安装位置,可以用以下命令: >rpm -ql subversio ...
- mysql数据库内容相关操作
第一:介绍 mysql数据内容的操作主要是: INSERT实现数据的插入 UPDATE实现数据的更新 DLETE实现数据的删除 SELECT实现数据的查询. 第二:增(insert) 1.插入完整的数 ...
- autpmapper映射忽略某个属性
1.直接加特性[IgnoreMap] 2.映射规则 CreateMap<BaseAccount, BaseAccountListDto>().ForMember(dest => de ...
- QT中foreach的使用
在标准C++中,并没有foreach关键字. 但是在QT中,可以使用这一个关键字,其主要原因是QT自己增加了这一个关键字,就像slots和signals.emit等一样.增加的foreach关键字在编 ...
- VIM批量缩进
方法一 1.按 ctrl + shif + ; 进入底行模式 2.将所要批量缩进的行号写上,按照格式:“行号1,行号2>”输入命令,如要将4至11行批量缩进一个tab值,则命令为“4,11&g ...
- Java 2018 面试
1.Java的引用有什么作用?传递的是什么? Java的引用可以用来操作对象,传递的是对象的地址 2.引用分为几种?他们的区别是什么?弱引用用在什么地方? 分四种:强引用 . 软引用 . 弱引用 . ...