java web发展史
web的产生
url http 特定目录->资源 (为了返回静态资源)
CGI的诞生
动态参数写进环境变量 启动CGI的程序获取参数后返回动态的结果
一个请求启动一个cgi程序,耗费自愿(腾讯部分还在用c++ php)
java原始(能实现几乎所有事情)
applet
浏览器插件,服务端传来代码 在插件中执行(代码不能多,不能复杂)
客户端执行代码不太好
servlet+applet 静态页+动态数据 拼接页面返回 (out.print("
"))
servlet\JSP (要求开发全栈)
-> java web (分层架构,解耦)
-> ajax (渲染部分页面,js整个技术的基石)
-> spring(ssm ssh)(简化了代码量)
IOC:
控制反转 依赖注入
本质:构建对象的技术 单例模式 工厂创建对象
容器 对象之间的依赖 本该我们自己管理对象
交给容器管理 并且自动注入属性
AOP:
面向切面编程
系统中有多个模块 很多模块共用某些功能 (日志 异常 事务管理)
非核心业务逻辑 交叉关注点 通用 避免了同样功能代码分散难以更新
-> springboot (简化ssm等配置 插件)
引导我们更便捷地使用spring
-> 微服务
-> 未来
新技术的诞生 用来解决现有技术的痛点
异步(Netty)、响应式编程(Spring5+)
约定大于配置 后续框架更多地遵循这种原则
初识
2014.4 springboot1.0.0
简化新spring的搭建和开发过程
2017.1 Springboot1.5.0
动态日志修改 增加apache kafuka
LDAP、事务管理新特性
2018.3 springboot2.0.0(历史革新)
基于java8响应式编程 http2.0支持
kotlin支持 quartz支持 security简化等
2019.9 2.1.18(稳定版)
我们学习的版本
微服务
springcloud
一种分布式架构,一种思想,一种设计原则
通过springboot创建服务,springcloud关注全局的服务治理
基于springboot的特性,我们可以快速构建独立的微服务
是java领域最优秀的微服务架构落地技术
springboot特性与优势
编码更简单
遵循约定大于配置原则 (默认配置)
测试更简单
内置七种测试框架
部署更简单
内嵌容器,集成jenkins,支持容器化(不用打war,打jar就行)
监控更简单
Actuator监控应用健康情况,SpringBoot Admin集群监控工具(便捷)
maven基础
1.管理jar包,管理jar依赖
提供了本地仓库、中央仓库、远程仓库
通过坐标定位jar 中配置
2.提供统一的规范,约定优于配置,利于合作 src/main/java..
3.扩展性好,支持各类插件,涉及到方方面面,如编译、打包、以来检察、web容器自动, 用例执行
compile编译、test测试、package打包、install安装、deploy发布
约定配置:
..
存放pom.xml和所有子目录
../src/main/java
项目的java源代码
../src/main/resourceses
项目的资源,比如说property文件
../src/test/java
项目测试类 如Junit代码
../src/test/resourceses
测试资源
../target
打包输出目录
~/.m2/repository
mvn默认的本地仓库位置
pom.xml
maven核心,Project Object Model,项目对象模型,定义了项目的基本信息
project是根元素,他还声明了一些pom相关的命名空间和xsd元素
groupId、artifactId、version三要素定义了项目的基本坐标,在mvn世界里,所有的war和jar都是依据坐标进行区分
groupId定义了组名,一般是用公司或组织的域名
artifactId定义了项目在mvn的唯一ID,一般是项目或子项目名
version定义了这个项目当前的版本
依赖范围管理:
主要管理依赖的部署,依赖范围控制哪些依赖在classpath中可用,哪些依赖包含在一个应用中,以下5个值可在scope中使用
compile
缺省值,适用于所有阶段,会随着项目一起发布
provided
只有在当jdk或者一个容器已提供该以来之后才使用(不会被打包)
runtime
只有在运行时使用,如jsbc驱动,适用运行和测试阶段
test
只在测试时使用,不会发布
system
不推荐,类似provided,需要显式的提供包含以来的jar,mvn不会在repository中查找他
mvn依赖传递性
mvn默认依赖传递必须加载,但有时候,有些可以不必加载,如a-> b->c,但a不需要c,这时可以进行可选依赖和依赖排除
可选依赖
true
假设以上是A的配置,即a->b
这时编译a,ok。如果x->a,x不用到b,ok
但是x如果用到b,需在pom.xml中重新配置对项目b的依赖
依赖排除
当一个项目A依赖项目B,而项目B同时依赖C,项目A如果因为各种原因不想引入C,在配置项目B的依赖时,可以排除对C的依赖
使用:
配置镜像
....建议阿里云
maven全局配置JDK
cofg/settings.xml
pom.xml
helloword
jdk + maven + idea + springboot 有版本捆绑关系,
示例 jdk1.8.18 mvn3.1.3+ idea2019.2+ springboot2.1.8release
1.创建maven项目 起名spring-boot-duying.demo
2.spring官网,springboot官网,resful快速构建
3.部分复制到pom里面 springboot-starter-parent
超级父pom,springboot的父依赖
..starter-web<>
web部分依赖
4.随便创建一个主入口类DemoApplication.main,创建main函数
main中使用spring静态方法启动
SpringApplication.run(DemoApplication.class,args);
DemoApplication类名上加@SpringBootApplication
5.创建controller.xxController 加@Controller
@ResponseBody
@RequestMapping("/xxxx")
xxxx()
热部署:
1.pom文件增加依赖引入
org.springframwork.boot
spring-boot-devtools
2.idea的settings配置
勾选build project automatically
3.项目中命令行 osk 快捷键ctrl+shift+alt+/ ,选择registry
勾选compiler automake allow when app running
打包:
文档--getting started -- Creating an Excutable Jar
... 与dependencies同级 复制到我们的pom.xml
右侧maven Projects里面多一个springboot的选项
springboot-run 、maven-package双击
jar包打到target目录下
可以show in explore 放到某个位置
部署
cmd cd到这个路径
java -jar xxx.jar 这就成功启动了(不用要记得退出,会占用端口)
配置
配置基础
自定义banner(旗帜/标语)()
启动springboot时候表现的封面图
../resources/banner.txt
更改启动端口
内部配置:
..resources/application.propertise/YML
sever.port=8090
官网配置文件目录X Append..
外部配置
java -jar *.jar --server.port=8081
REST
@RestController controller上面,返回json
等价于controller+responsebody两个注解
返回json,而不是视图(jsp html)
配置常量
使用注解@Value(${key})获取
参数间可以互相引用three=${one}+${two}
可使用随机值${radom.int}
绑定bean(官方推荐)
一个bean
bean上添加注解@ConfigurationProperties(prefix="food")
入口类上添加注解@EnableConfigurationProperties(xxBeanConfig.class) //告诉主程序要自己引入配置文件
多个bean(对应多个配置文件)
配置处理器
..configuration-processor 到pom.xml
4.bean上加 @getter @setter
4.1 @Data 同时生成getter setter contructor hash equals tostring
4.2 @NoArgsConstructor @RequiredArgsConstructor @AllArgsConstructor无参、部分参数、全参构造器
4.3 @Builder @Slf4j 等价于private final Logger logger = LoggerFactory.getLogger(XXX.class);
原理:
[源代码] 词法分析 -> (检查关键字 分析结果编程规范化的Token流)
[规范Token流] 语法分析 -> (抽象语法树)
[抽象语法树] 语义分析 -> (难懂的语法转化成简单的注解的抽象语法树)
如foreach -> for
[注解抽象语法树] 字节码生成 -> (符合jvm规范的二进制代码)
lombok原理:语法分析过程中,在编已处理后,匹配到有它注解的类,注解编译器就会自动去匹配项目中的注解对应到在lombok语法树中的注解文件,并自动编译匹配来生成方法,达到简化代码的目的
配置格式yaml
propertise对于复杂的数据结构不如yaml
YAML:Yaml Ain Markup Language
LINUX:Linux Is Not Unix
语法规则:
1.大小写敏感
2.缩进表示层级关系
3.缩进不允许使用tab键(特别重要)(一定要在冒号后加个空格)
4.缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
支持的数据结构:
1.对象:键值对集合,又称映射、哈希、字典
food:
meat: 鱼香
rice: 肉丝
food: {meat: 鱼香,rice: 肉丝}
2.数组:一组按次序排列的值,又称为序列/列表
A:
-d
-t
-y
-e
-
id:aa
age:bb
sex:cc
3.纯量:单个的、不可再分的值
整数 浮点 日期....用到的时候再来找
一些特殊符号
--- ---表示一个文档的开始
---
spring:
profiles:dev
...和--- 在一个配置文件中表示一个文件的结束
~~ 做强值类型转换
> 折叠换行,|保留换行符
引用 可以用&来完成锚点定义,使用*来完成锚点引用
合并内容 主要和锚点配合使用,可以将一个锚点内容直接合并到一个对象中
多文件配置
spring:
profiles:
active:dev
---
spring:
profiles:dev
sever:
port:8080
---
spring:
profiles:prod
sever:
port:8090
配置加密Jasypt
(用户名、密码、..),密码一般都是加密之后存储
如果两个密码都是123 黑客也是123 同样的密码加密之后都一样
加盐加密,同样的密码加了盐也不一定一样
可以把盐理解为调料 一样的A加了不同量的b得到不同的结果
使用:
1.引入依赖 Jasypt-spring-boot-starter
2.自己写一个类 JasyptUtil 写个主函数
Main(){
BasicTextEncryptor x = new BasicTextEncryptor();
x.setPassword("123456!@#");
String userName = x.encrypt("xxxx****x");
String password = x.encrypt("*********");
//多次执行结果不一样
}
3.配置文件中使用,
jasypt:
encryptor:
password:123456!@#
xxinfo:
user:ENC(密文1)
pass:ENC(密文2)
模板引擎+curd
发展过程
JSP
html+java代码->Servlet类->放到容器中执行
缺点 繁杂而不易维护
本质上是"模板" 通过规则和标签抽象出来的
模板引擎
freemarker velocity thymeleaf beetl(国人开窗,据说性能很高)
freemarker使用最多 velocitysb不再支持 thymeleaf官方推荐
基于API的前后端分离
web服务器:
解析静态资源 nginx apache (前台接待-外网访问)
应用服务器:
解析动态+静态资源 tomcat jetty (核心价值提供者-内网访问)
nginx(前端代码)->ajax请求api->tomcat(服务端代码) 数据格式json
模板引擎(thymeleaf 百里香的叶子)
执行过程
1.利用正则表达式分解出普通字符串和模板标识符
2.将模板标识符转换成普通的语言表达式
3.生成待执行语句
4.将数据填入执行,生成最终的字符串
使用
1.创建项目
使用springboot初始化器
group、artifact、jar、java8不变,package简化下
选择依赖 热部署、lombok、web..
Freemarker
引入dependency
application.yml
spring:
mvc:
view:
#文件位置
prefix: /templates/
#文件后缀
suffix: .ftl
controller(Model model)
model.addAttribute("now",new Date().toString())
return "index"
新建 index.ftl
${xxx${now}}
Thymeleaf
Springboot官网就是springboot+thymeleaf编写的
特点
1.能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个web应用。便于前后端联调(动态值有一个默认的静态值)
2.模板语法并不会破坏文档结构,只会在运行期替换掉静态值
整合方式:
1.两种启动方式(模板 和 starter 两个dependency)
2.resources下创建thymeleaf文件夹,创建html文件
3.html文件
4. name
表达式:
变量表达式 ${...}
OGNL(对象导航语言)表达式,如果将Thymeleaf与Spring集成在上下文变量上(也称为Spring术语中的模型属性),则为SpringEL
选择变量表达式 *{...}
他们不是整个上下文变量映射上执行,而是在先前选择的对象
model打包参数设置为object, html中父标签绑定object ${obj},子标签绑定obj.xxx *{xxx}
链接URL表达式 @{...}
在构建URL并向其添加有用的上下文会话信息
有绝对url、相对url(网页、上下文、协议、请求等)
消息表达式 #{...}
消息表达式(通常称为文本外部化,国际化或i18n)允许从外部源(如:.properties)文件中检索特定于语言环境的消息,通过键来引用这引用消息。在Spring应用程序中,它将自动与Spring的MessageSource机制集成
构建message.properties 然后#{xxx}去文件里面找
片段表达式 ~{...}
一种简单的方法用来表示标记的片段并将其移动到模板中,由于这些表达式,片段可以被复制,传递给其他模板的参数等