JavaWeb
JavaWeb
落星湖Web前端开发
前端技术
Web标准:
- HTML
- CSS
- JavaScript
HTML CSS
HTML
- 控制页面结构
- 超文本标记语言
CSS
- 控制页面样式
- 层叠样式表
基础标签和样式
基础标签
<img>
图片标签- src 指定url
- url–>绝对路径(绝对磁盘/绝对网络)
相对路径(./当前目录 ../上一目录) - width 像素/百分比
- height
<h1>-<h6>
标题标签<hr>
水平线标签<a href="(url)" target="_self(当前窗口) (_blank新标签页)"></a>
超链接标签<video>
视频标签src/width/heigth
controls
播放插件
<audio>
音频标签<p>
段落标签<b>/<strong>
文本加粗<span>
无语义标签 一行多个<div>
一行独个<table>
表格标签<tr>
行<th>
表头单元格<tb>
单元格- border 边框宽度
- cellspacing 单元格之间的空间
<form>
表单标签- action url
- method 提交方式
<input>
type<select>
<textarea>
CSS样式
引入CSS(行内/内嵌(写在head里)/外联)
- 内嵌
<style> h1{color: rgb(0,0,0);}</style>
- 外联
<link rel="stylesheet" href="./css/style.css">
CSS选择器
- 优先级依次++
- 元素选择器
- 类选择器
.cls{}
- id选择器
#id {}
样式
color
颜色font-size
字体大小text-decoration
文本修饰text-indent
缩进text-align
属性- 盒子模型
box-sizing
盒子宽高padding
内边距border
边框margin
外边距上右下左
JS
外部脚本 <script src="#path"></script>
(不能采取自闭合)
基础语法
- 分号可有可无
window.alert() document.write() console.log()
- 变量
var 可存放不同类型,全局变量,可重复声明
let 只在相应代码块里有效,不可重复
const 常量 - 数据类型
number string boolean null undefined - 运算符
==会进行类型转换 ===不会
类型转换 字符串转数字 其他转boolean - 函数
function name(a,b)
无需参数和返回类型 - JS对象
JS对象
- 基础对象
- Array
长度可变 类型可变forEach()遍历
push()
splice()
- String
charAt()
indexOf()检索
trim()去除字符串两边空格
substring()
- JSON
js对象标记法–文本var a='{"key1":value1}'
var jso=JSON.parse(a) var jsons=JSON.stringify(jso)
转换
- Array
- BOM
浏览器模型对象- Window 浏览器窗口
alert() confirm() setInterval()周期性执行某个函数 setTimeout()延迟执行
- Navigator 浏览器
- Screen 屏幕
- History 历史记录
- Location 地址栏
location.href()
- Window 浏览器窗口
- DOM
文档对象模型- Document 文档
- Element 元素
获取Element元素document.getElementById(); //ByTagName() ByName() ByClassName()
- Attribute 属性
- Text 文本
- Comment 注释
JS事件
事件绑定
HTML标签中事件属性绑定
DOM绑定
1
document.getElementById('btn').onclick=function(){}
常见事件 事件监听
1 | onblur();//元素失去焦点 |
异步交页Ajax
异步的JavaScript和XML
数据交换–异步交互
Axios 封装原生Ajax
前端开发框架
Vue
基于MVVM模型的js框架
免除原生JavaScript中DOM操作 数据双向绑定
1 | <script> |
指令
1 | v-bind 绑定HTML标签属性值 设置href css等 |
生命周期
八个阶段
1 | mounted 挂载完成--Vue初始化完成,HTML页面渲染成功--发送请求到服务端 加载数据 |
前端工程化
- YApi–api管理平台
- 环境 vue-cli 脚手架
依赖环境 nodejs
组件库Element
官方文档cv
- Table
- Pagination 分页
- Dialog
- Form
vue路由
url中的hash与组件间的对应关系
Vue Router
打包部署
- build 打包
- Nginx 部署 dist–>nginx/html
1 | <router-link> |
Web后端开发
项目构建–Maven
- 安装配置(略)
- IDEA集成Maven 配置–创建–导入
依赖管理
依赖配置
1 | <dependency></dependency> |
依赖传递
依赖有传递性
1 | //断开指定依赖 |
依赖范围
1 | //控制依赖作用范围 |
生命周期
- clean
- default
- compile
- test
- package
- install
- site
Web
SpringBootWeb
1 | //端口号8080可能会被占用 |
HTTP协议
- 基于TCP协议
- 请求-响应模型
- 无状态协议–请求间不能共享,但速度快
请求协议
请求数据格式
- 请求行
- 请求方式 资源路径 协议及版本
- 请求方式:
- GET:请求参数在请求行,无请求体,有大小限制
- POST:请求参数在请求体,无大小限制
- 请求头
- 常见请求头
- Host
- User-Agent 浏览器版本
- Accept 浏览器能接收的资源类型
- Accept-Language
- Accept-Encoding 浏览器支持的压缩类型
- Content-Type 请求主体的数据类型
- Content-Length
- 请求体
响应协议
响应格式
- 响应行
- 协议 状态码 描述
- 响应状态码:
- 1xx 响应中
- 2xx 成功
- 3xx 重定向
- 4xx 客户端错误
- 5xx 服务器错误
- 响应头
- Content-Type 相应内容类型
- Content-Length
- Content-Encoding 响应压缩算法
- Cache-Control 客户端应如何缓存
- Set-Cookie 所在域设置Cookie
- 响应体
协议解析
繁琐–封装 使用Web服务器
Tomcat(略)
SpringBoot已内嵌依赖
请求响应
请求
接口测试–postman Apipost
参数
- 简单参数
- SpringBoot接收参数
- 名不一致 手动映射--@RequestParam注释(必须传递参数)
- 实体参数–封装实体类
- 数组集合参数
- 如前端传回的checkbox 多个参数
- 数组
Array.toString(String[])
默认封装到数组 - 集合
@RequestParam List<String>
- 日期参数
- 日期参数格式化
@DateTimeFormat(pattern="yyyy-MM-dd") LocalDateTime time)
- 日期参数格式化
- JSON参数
- 将其封装为实体类 注解
@RequestBody
- 将其封装为实体类 注解
- 路径参数
- 请求路径参数
@RequestMapping("/path/{id}")
- 接收路径参数
@PathVariable Integer id
- 请求路径参数
响应
@ResponseBody
方法返回值直接响应(实体类/集合–>JSON)@RestController=@Controller+@ResponseBody
统一响应结果(返回类型)–封装
Result(code,msg,data)
全部转为JSON格式数据
分层解耦
- 三层架构 控制层controller–逻辑处理service–数据访问dao
- 分层解耦
- 高内聚低耦合
- 解耦合
- 控制反转 IOC
- 依赖注入 DI
- Bean对象
- IOC
@Component
若想切换 将注解注释掉即可(不属于以下三类衍生注解时,采用此注解)- 衍生注解
- 标注在控制器类上
@Controller
(可省) - 标注在业务类上
@Service
- 标注在数据访问类上
@Repository
- Bean组件扫描
@ComponentScan({包名})
启动类@SpringBootApplication
包含扫描,但默认扫描当前包及其子包
- 标注在控制器类上
- 规范!!推荐放入启动类所在包机器子包下
- DI
@Autowired
Spring框架提供的注解 按类型注入- 若存在多个类型相同的Bean对象
@Primary
不推荐@Autowired+@Qualifier("bean名称")
@Resource(name="bean名")
JDK提供的注解,按名称注入(注意与@Autowired的区别)
MySQL
- 关系型数据库(表结构 SQL语句操作)
- SQL语句
- DDL 定义对象
- DML 操作数据
- DQL 查询表
- DCL 控制权限
数据库设计-DDL
- SQL语句
1 | //search |
图形化界面操作–navicat等
DDL表操作–创建 查询修改删除(略)
1 | //create |
数据库操作-DML DQL
操作-DML
- INSERT
1 | insert into 表名 (字段名,...) values (值,...)(值,...); |
- UPDATE
1 | update 表名 set 字段名1=值1,... [where 条件]; |
- DELETE
1 | delete from 表名 [where 条件]; |
查询-DQL
1 | select 字段 from 表名 |
多表设计
- 外键约束–物理外键–容易引发数据库死锁(不推荐)
1 | (表外alter table 表名 add) constraint 外键名称 foreign key (字段) references 主表 |
外键约束–逻辑约束(推荐)
业务层逻辑关联一对一–采取unique 多对多–采取中间表
多表查询
消除无效笛卡尔积(where 限制)
- 连接查询
- 内连接–交集部分
- 隐式内连接
select 字段 from 表1,表2 where ...
- 显示内连接
select 字段 from 表1 [inner] join 表2 on ...
- 隐式内连接
- 外连接–完整包含某表
- 左外连接
select 字段 from 表1 left [outer] join 表2 on ...
- 右外连接
select 字段 from 表1 right [outer] join 表2 on ...
- 左外连接
- 内连接–交集部分
- 子查询–嵌套查询
select 字段 from 表1 where ...(select ...)
- 标量子查询 单行单列
- 列子查询 in / not in
- 行子查询
- 表子查询
事务
事务控制
- 开启事务
start transaction / begin;
- 提交事务
commit;
- 回滚事务
rollback;
数据库优化-DCL
索引
提高查询效率 降低排序成本 降低CPU消耗
索引会占用存储空间 降低增删改的效率
结构
默认为B+Tree结构组织的索引
二叉搜索树
很容易产生斜树,效率–
红黑树
与二叉搜索树 一个节点均只有两个子节点–大数据量层级深,检索速度慢B+Tree 多路平衡搜索树
- 每个节点多个key
- 所有数据都在叶子节点中 非叶子节点用来索引
- 叶子节点间双向链表且有序
1 | //创建索引 主键会自动创建索引 唯一约束的字段也会自动创建索引 |
MyBatis
简化JDBC开发(操作关系型数据库的API)
MyBatis入门
- mybatis相关配置
- Mapper接口
数据库连接池
类似线程池
- SpringBoot–默认Hikari连接池
- 其他数据库连接池 Druid
lombok
解决实体类中需要写get set toString等方法冗杂的问题
常用注解
1
2
3
4
5
6@Getter/@Setter
@ToString
@EqualsAndHashCode
@Data(=上面四个之和)
@NoArgsConstructor
@AllArgsConstructor
Mybatis基础操作–注解开发
删除
1 | //动态传值 不要将where条件限制为id=1这样 |
- Mybatis预编译SQL
- 性能高
- 安全 防SQL语句注入
- 参数占位符
- #{..} 参数传值,预编译替换成?
- ${..} 对表名等动态设置时使用拼接SQL,易产生SQL注入问题
新增
1 | //字段名通常采用下划线命名 如user_id |
- 主键返回
1 | @Options(keyProperty="id",useGeneratedKeys=true) |
更新(修改)
1 | @Update("update emp set user_name=#{userName},... where id=1")//根据主键确定 |
查询
1 | @Select("select * from emp where id= #{id}") |
出现的问题–mybatis智慧自动封装实体属性名与字段名一致的
解决方案一:
给字段起别名1
2@Select("select user_id userId from emp where id= #{id}")
public Emp select(Integer id);解决方案二:
mybatis注解手动映射封装 @Results @Result解决方案三:
mybatis驼峰命名自动映射
application.properties里配置1
mybatis.configuration.map-underscore-to-camel-case=true
条件查询–封装到集合 可能采用like模糊查询–特殊注意 如查询姓名时不可以%#{name}%
预编译不能通过 应采取%${name}%
或使用concat函数 concat('%','#{name}','%')
XML映射文件–动态开发
规范:
1 | <mapper namespace="com.mapper.usermapper"> |
使用注解–完成简单增删改查
XML–实现复杂SQL功能
动态SQL
动态查询–多条件查询时可只输入其中几项查询
动态更新–更新其中几项(这样不会将其他项更新为null)
<if>
条件成立则拼接1
2
3
4
5
6
7
8
9
10
11
12
13
14//where 需要改成标签-自动判断需要哪几个条件去掉多余的and
//同理若为动态更新(update) 则将set 改为标签
<select id="list" resultType="com.pojo.emp">
select *
from emp
<where>
<if test="id!=null">
id =#{id}
</if>
<if test="user!=null">
and user like concat('%',#{name},'%')
</if>
</where>
</select>
动态删除–批量删除
<foreach>
1
2
3
4
5
6
7
8<delete id="delid">
delete from emp
where id in
<foreach collection="idlist" item="id" separator="," open="(" close=")">
#{id}
//可采用Arrays.asList
</foreach>
</delete>
查询全部字段时不建议使用select *
而是将所有字段列出来–可能会重复使用
<sql>
1
2
3
4
5
6
7//单独抽取成片段
<sql id="commonselect">
select id,user... from emp
</sql>
//在查询时引入代替原来的select ... from ...
<include refid="commonselect"/>
other
会话技术
会话跟踪
- 客户端 Cookie
- 服务端 Session
- 令牌
JWT令牌
生成/解析令牌
1
2
3
4
5
6
7
8
9
10
11
12
13//
Map<String,Object> claims=new HashMap<>();
claims.put("id",1);
String jwt= Jwts.builder().
signWith(SignatureAlgorithm.HS256,"lxh11111")
.setClaims(claims)
.setExpiration(new Date(System.currentTimeMillis()+3600*1000))
.compact();
//
Claims claim1=Jwts.parser()
.setSigningKey("lxh11111")
.parseClaimsJws("...")
.getBody();校验
过滤器Filter/拦截器Interceptor
- Filter(Web)
- 执行流程
- 拦截路径
- 过滤器链 多个过滤器
- Interceptor(Spring)
- 定义拦截器 实现HandlerInterceptor接口->注册拦截器(config)
- 拦截路径
- /* 拦截一级路径
- /** 拦截任意级路径
- 执行流程
异常处理
全局异常处理器
AOP
事务管理
事务属性–回滚 传播
1 | ---事务 |
AOP
执行 (动态代理)
1 | //引入aop依赖 |
通知
- 通知类型
@Around
环绕通知–需要ProceedingJoinPoint.proceed()调用原始方法,返回值必须指定为Object@Before
@After
@AfterReturning
@AfterThrowing
@Pointcut("execution(*..)")
抽取公共切点表达式
- 通知顺序
- 按字符顺序
@Order(1)
指定顺序
- 切入点表达式
execution(访问修饰符(可省) 返回值 包名.类名.方法(参数) throws 异常(可省))
- 通配符 * 单个独立,通配任一值
- 通配符 .. 多个连续,通配任意层级
@annotation(com...mylog)
在需要的方法上加上@mylog
注解(可以起别的名,要定义注解类,在里面定义注解名)
- 连接点
- spring中采取JoinPoint抽象连接点,获取方法参数等
@Around
只能使用ProceedingJoinPoint
- 其他四个注解只能
JoinPoint
SpringBoot原理
配置优先级
- 命令行参数 –server.port= (maven package打包成jar包后在命令行后面写入)
- java系统属性 –Dserver.port=
- application.properties
- application.yml(推荐)
- application.yaml
优先级依次下降
bean原理
- 获取bean
- 根据bean名称获取
applicationContext.getBean("controller")
默认bean名为类名首字母小写 - bean类型获取
applicationContext.getBean(Controller.class)
- 名称及类型获取
- 根据bean名称获取
- bean作用域
- singleton 单例
- prototype 非单例
@Scope("prototype")
默认是单例的
- 第三方bean
- 需要管理的bean对象来自第三方,无法通过@component注入
- 采用@Bean注解
- 建议新建配置类 在其中配置@Bean
- 第三方bean依赖注入 在配置bean的方法中直接传入参数即可
SpringBoot原理
SpringBoot起步依赖
简化spring需要配置大量依赖
起步依赖原理–maven依赖传递
SpringBoot自动配置
自动配置如bean对象存入IOC容器中
自动配置:
- 方案一
@ComponentScan
扫描 - 方案二
@Import
导入 采用第三方依赖@Enablexxx
注解封装
Maven其他
分模块设计和开发
将项目拆分为若干模块
注意引入依赖
继承与聚合
继承
继承管理
解决各个模块依赖配置冗杂 统一管理
- 创建parent父工程 打包方式为pom(默认jar) –仅用来配置依赖
<packaging>pom</packaging>
- 父工程继承父类spring-boot-starter-parent
- 子工程配置关系
<parent></parent>里面添加<relativePath>../xxparent/pom.xml</relativePath>
版本锁定
- 父工程中添加
<dependencyManagement></dependencyManagement>
其中只用于声明依赖版本,子工程仍需引入依赖(无需写入版本号) - 自定义属性(统一管理版本)
<properties><lombok.version>1.18.24</lombok.version></properties>
这样在<dependencyManagement>..<version>${lombok.version</version>..</dependencyManagement>
即可
聚合
将父工程作为聚合工程–快速构建项目
pom里声明<modules><module>(要聚合的模块)</module></modules>
私服
本地仓库->私服(release snapshot central)->中央仓库
配置私服
- server标签配置个人凭证
- mirror,profiles配置
- pom.xml添加私服地址
- 运行deploy生命周期