----------------------------SQL-----------------------------------
SQL语言的分类
SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL。
1. 数据查询语言DQL
数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE子句组成的查询块:SELECT <字段名表>FROM <表或视图名>WHERE <查询条件>
2 .数据操纵语言DML
数据操纵语言DML主要有三种形式:
1) 插入:INSERT
2) 更新:UPDATE
3) 删除:DELETE
3. 数据定义语言DDL
数据定义语言DDL用来创建数据库中的各种对象-----表、视图、索引、同义词、聚簇等如:CREATE TABLE / VIEW / INDEX / SYN / CLUSTER| 表 视图 索引 同义词 簇。DDL操作是隐性提交的!不能rollback
4. 数据控制语言DCL
数据控制语言DCL用来授予或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果,对数据库实行监视等。如:
1) GRANT:授权。
2) ROLLBACK [WORK] TO [SAVEPOINT]:回退到某一点。回滚---ROLLBACK回滚命令使数据库状态回到上次最后提交的状态。其格式为:SQL>ROLLBACK;
3) COMMIT [WORK]:提交。在数据库的插入、删除和修改操作时,只有当事务在提交到数据库时才算完成。在事务提交前,只有操作数据库的这个人才能有权看到所做的事情,别人只有在最后提交完成后才可以看到。提交数据有三种类型:显式提交、隐式提交及自动提交。下面分别说明这三种类型。
(1) 显式提交
用COMMIT命令直接完成的提交为显式提交。其格式为:SQL>COMMIT;
(2) 隐式提交
用SQL命令间接完成的提交为隐式提交。这些命令是:ALTER,AUDIT,COMMENT,CONNECT,CREATE,DISCONNECT,DROP,EXIT,GRANT,NOAUDIT,QUIT,REVOKE,RENAME。
(3) 自动提交
若把AUTOCOMMIT设置为ON,则在插入、修改、删除语句执行后,系统将自动进行提交,这就是自动提交。其格式为:SQL>SET AUTOCOMMIT ON;
-----------------LIMIT
SELECT * FROM LIMIT 0,3 第一页
SELECT * FROM LIMIT 3,3 第一页
SELECT * FROM LIMIT 6,3 第一页
开始索引=(当前页码-1)*每页显示的条数
结束索引=每页显示的条数
-----------------------NOTNULL
--创建表时添加约束
CREATE TABLE stu(
id INT,
NAME VARCHARA(20) NOT NULL
);
--删除name的非空约束
删除非空约束:ALTER TABLE stu MODIFY NAME VARCHAR(20);
--创建表完后,添加非空约束
ALTER TABLE stu MODIFY NAME VARCHAR(20)NOT NULL;
------------------UNIQUE
--创建表时条件唯一约束
CREATE TABLE stu(
id INT,
phone_number VARCHAR(20) UNIQUE
);
--删除唯一约束
ALTER TABLE stu DROP INDEX phone_number;
--在表创建完后,添加唯一约束
ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE;
-------------PRIMARY KEY
--创建表时添加主键约束
create table stu(
id int primary key,
name varchar(20)
);
--删除主键
ALTER TABLE stu DROP INDEX PRIMARY KEY;
--创建完表后,添加主键
ALTER TABLE stu MODIFY id INT PRIMARY KEY;
-------------------------自动增长
--自动增长:如果某一列时数值类型的,使用auto_increment可以来完成值得自动增长
--创建表时,添加主键约束,并且完成主键自动增长
create table stu(
id int primary key auto_increment,
name varchar(20)
);
--删除自动增长
ALTER TABLE stu MODIFY id INT;
--添加自动增长
ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;
-------------FOREIGN KEY
--创建表时,可以添加外键
create table stu(
constraint 外键名称 foreign key(外键列名称) references 主表名称(主表列名称)
);
--删除外键
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
--创建表之后,添加外键
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY(外键列名称) REFERENCES 主表名称(主表列名称)
---------------------------级联操作
1.级联更新:ON UPDATE CASCADE
2.级联删除:ON DELETE CASCADE
--------------------------多对多关系
多对多关系实现需要借助第三张中间表。中间表至少包含两个字段,这两个字段作为
第三张表的外键,分别指向两张表的主键
一对多关系实现需要再多的一方建立外键,指向一的一方的主键
一对一关系实现,可以在任意一方添加外键只想另一方的外键,让外键唯一
--------------------------------事务---------------------------------------
//事物的基本介绍
1.概念:
*如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。
2.操作:
1.开启事务:start transaction;
2.回滚:rollback;
3.提交:commit;
3.MySQL中事务默认自动提交
*事务提交的两种方式:
*自动提交:
*mysql就是自动提交
*一条增删改语句会自动提交一次事务
*手动提交:
*Oracle默认是手动提交
*需要先开启事务,在提交
*修改事务的默认提交方式
*查看事务的默认提交方式:SELECT @@autocommit; --1 代表自动提交 0 代表手动提交
*修改:SET @@autocommit=0;
//事务的四大特征
1.原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败。
2.持久性:当事务提交或回滚后,数据会持久化的保存数据。
3.隔离性:多个事务之间相互独立。
4.一致性:事务操作前后数据总量不变。
//事务的隔离级别:
1. read uncommitted:读未提交
产生的问题:脏读、不可重复读、幻读
2.read committed:读已提交(Oracle)
产生的问题:不可重复读、幻读
3.repeatable committed:可重复读(MySQL默认)
产生的问题:幻读
4.serializable:串行化
可以解决所有的问题
注意:隔离级别从小到大安全性越来越高,但是效率越来越低
*查询隔离级别:
SELECT @@tx_isolation;
*设置隔离级别:
set global transaction isolation level 级别字符串;
----------------------------管理用户
--1.切换到mysql数据库
USE mysql;
--2.查询user表
SELECT *FROM USER;
--创建用户
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
--删除用户
DROP USER '用户名'@'主机名';
--修改密码
UPDATE USER SET PASSWORD = PASSWORD('新密码')WHERE USER = '用户名';
SET PASSWORD FOR '用户名'@'主机名' = PASSWORD('新密码');
-------------------------------------------------JDBC-------------------------------------------------
//JDBC快速入门
步骤:
0.创建工程,导入驱动jar包
1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
2.获取连接
Connection conn = DriverManager.getConnection(url,username,password);
3.定义SQL语句
String sql = "update...";
4.获取执行SQL对象
Statement stmt = conn.createStatement();
5.执行SQL
stmt.executeUpdate(sql);
6.处理返回结果
7.释放资源
-------------------------JDBC API详解-----------------------
//DriverManager驱动管理类
作用:
1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
2.获取数据库连接
Connection conn = DriverManager.getConnection(url,username,password);
1.url:连接路径
语法:jdbc:mysql://ip地址:端口号/数据库名称?参数键值对1&参数键值对2
示例:jdbc:mysql://127.0.0.1:3306/dbem
细节:*如果连接的是本机mysql服务器,并且默认端口是3306,url可以写为jdbc:mysql:///dbem
*配置useSSL=false参数,禁用安全连接方式,解决警告提示
2.user:用户名
3.password:密码
//Connection数据库连接对象
作用:
1.获取执行SQL的对象
>普通执行SQL对象
Statement createStatement()
>预编译SQL的执行SQL对象:防止SQL注入
PreparedStatement PrepareStatement(sql)
>执行存储过程的对象
CallableStatement prepareCall(sql)
2.管理事务
开启事务:setAutoCommit(boolean autoCommit): true为自动提交事务;false为手动提交事务,即为开启事务
提交事务:commit()
回滚事务:rollback()
在try catch模块中编写
try:setAutoCommit(boolean autoCommit) 执行sql语句 返回结果 commit()
catch:rollback()
//Statement
作用:
1.执行SQL语句
int executeUpdate(sql):执行DML、DDL语句
>返回值:(1)DML语句影响的行数(2)DDL语句执行后,执行成功也可能返回0
ResultSet executeUpdate(sql):执行DQL语句
>返回值:ResultSet结果集对象
//ResultSet(结果集对象)
作用:
1.封装了DQL查询语句的结果
ResultSet stmt.executeQuery(sql): 执行DQL语句,返回ResultSet对象
2.获取查询结果
boolean next():(1)将光标从当前位置向前移动一行(2)判断当前行是否为有效行(有无数据)
xxx getXxx(参数):获取数据
>xxx:数据类型: 如int getInt(参数); String getString(参数);
参数:
int:列的编号,从1开始
String:列的名称
while(rs.next()){
//获取数据
rs.getXxx(参数);
}
//PreparedStatement
作用:
1.预编译SQL语句并执行:预防SQL注入问题
>SQL注入:通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法
①获取PreparedStatement对象
String sql = "select * from user where username = ? and password = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
②设置参数值
PreparedStatement对象:setXxx(参数1,参数2):给?赋值
>Xxx:数据类型;如setInt(参数1,参数2)
>参数:
参数1:?的位置编号,从1开始
参数2:?的值
③执行SQL
executeUpdate();
2.优点:预编译SQL,性能更高
PreparedStatement预编译功能开启:useServerPrepStmts=true
原理:1.获取PreparedStatement对象时,将sql语句发送给mysql服务器进行检查,编译(很耗时)
2.执行时就不用再进行这些步骤了,速度很快
3.如果sql模板一样,则只需要进行一次检查、编译。
//数据库连接池
概念:
1.数据库连接池是个容器,负责分配、管理数据库连接
2.它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
3.释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库遗漏
4.好处:
>资源复用
>提升系统响应速度
>避免数据库连接遗漏
实现:
标准接口:DataSource
>官方(SUN)提供的数据库连接池标准接口,由第三方组织实现此接口
>功能:获取链接 Connection getConnection()
常见的数据库连接池:
>DBCP
>C3P0
>Druid
Druid
>是阿里巴巴开源的数据库连接池项目
>功能强大,性能优秀,是JAVA语言最好的数据库连接池之一
-------------------------------------------MAVEN----------------------------------------------
依赖管理网站:mvnrepository.com
<scope> </scope> 依赖范围
compile最大范围 默认值
test 测试环境有效 junit的jar包
provided 编译环境和测试环境有效
runtime 测试环境和运行环境有效 jdbc驱动jar包
system 运行环境无效 存储在本低的jar包 基本用不到
----------------------------------MyBatis----------------------------------------
MyBatis是一款优秀的持久层框架,用于简化JDBC开发
持久层:
负责将数据保存到数据库的那一层代码
JavaEE三层架构:表现层、业务层、持久层
框架:
半成品软件,是一套可重用的、通用的、软件基础代码模型
在框架的基础上构件软件编写更加高效规范、通用、可扩展
------------------快速入门
1.创建MAVEN工程 导入相应的依赖 日志文件、测试、数据库、mybatis等依赖
2.创建想要操作的数据库中表的对应类,如salary表对应Salary类(com.itheima.pojo.Salary),类中包含salary表中的元素和Getter、Setter、toString的方法
3.在java目录下的resources目录下创建logback、mybatis-config、XxxMapper(如SalaryMapper)等xml文件
>logback日志文件 百度搜
>mybatis-config(核心配置文件)和XxxMapper在MyBatis官网有
>XxxMapper中编写对应表中的sql语句
4.MybatisDemo
//1.记载mybatis核心配置文件,获取SqlsessionFactory(这三行没有必要记住,MyBatis官网有,用的次数不多,一般只用一遍)
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2.获取Sqlsession对象,用来执行sql
SqlSession sqlSession = sqlSessionFactory.openSession();
//3.执行sql
List<Salary> Salarys = sqlSession.selectList("test.selectAll");
System.out.println(Salarys);
//4.释放资源
sqlSession.close();
----------------Mapper代理开发
1.定义与SQL映射文件同名的Mapper接口,并将Mapper接口和SQL映射文件放在同一目录下
>在resource下创建目录如(com/itheima/mapper) 注意要用/而不是.
2.设置SQL映射文件的namespace属性为Mapper接口全限定名(namespace="com.itheima.mapper.SalaryMapper")
3.在Mapper接口中定义方法,方法名就是SQL映射文件中的sql语句的id,并保持参数类型和返回值类型一致
4.编码
1.通过SqlSession的getMapper方法获取Mapper接口的代理对象
2.调用对应方法完成执行
SalaryMapper mapper = sqlSession.getMapper(SalaryMapper.class);
List<Salary> list = mapper.selectAll();
细节:如果Mapper接口名称和SQL映射文件名称相同,并在同一目录下,则可以使用包扫描的方式简化SQL映射文件的加载
---------------------------实际操作
//当定义的类中属性名称与数据库中属性名称不同时,会出现值为null的情况
解决方法:
Mapper.xml中添加标签如:
<resultMap id="salaryResultMap" type="Salary">
<result column="数据库中属性名称" property="类中属性名称">
.
.
.
</resultMap>
然后将<select id="selectAll" resultType="Salary">
select * from salary;
</select>
改为<select id="selectAll" resultMap="salaryResultMap">
select * from salary;
</select>
//#{}:会将其替换为?,即参数占位符,为了防止sql注入
${}:拼sql,会存在sql注入问题
使用时机:参数传递的时候用#{};
表名或者列名不固定的情况下用${};
参数类型:parameterType:可以省略
特殊字符处理:
1.转义字符
2.CDATA区:
<![CDATA[
]]> 在这个区域写特殊字符 如小于号<
//SQL语句中设置多个参数三种方式:
1.散装参数:需要使用@Param("SQL中的参数占位符名称")
2.实体类封装参数
*只需要保证SQL中的参数名和实体类属性名对应上,即可设置成功
3.map集合
*只需要保证SQL中的参数名和map集合的键的名称对应上,即可设置成功
//动态SQL
SQL语句会随着用户的输入或外部条件的变化而变化,我们成为动态SQL
Mybits动态SQL标签
1.<if>:用于判断参数是否有值,使用test属性进行条件判断
*存在问题:第一个条件不需要逻辑运算符
*解决方案:
1)使用恒等式让所有条件格式都一样 where 1=1 and 。。。。
2)<where>标签替换where关键字
例如:
select * from user
<where>
<if test="id!=null">
and id = #{id}
</if>
<if test="username!=null">
and username = #{username}
</if>
<if test="password!=null">
and password = #{password}
</if>
</where>
</select>
2.<foreach>
<select id="findById" parameterType="list" resultType="user">
select * from user
<where>
<foreach collection="list" open="id in(" close=")" item="id" separator=",">
#{id};
</foreach>
</where>
</select>
3.sql片段的抽取
<sql id="selectAll"> select * from user</sql>
<select id="findAll" resultType="user">
<include refid="selectAll"></include>
</select>
从多个条件中选择一个
choose(when,otherwise):选择,类似于switch(case,defult)
//进行增删改操作之后,需要提交事务否则会自动回滚
手动提交:
openSession(false)或openSession()
sqlSession.commit()
自动提交
openSession(true)
//返回添加数据的主键
<insert useGeneratedKeys="true" keyProperty="id">
//核心配置文件深入
1.自定义类型处理器
1.定义转换类继承类BaseTypeHandle<T>
2.覆盖4个为实现的方法,其中setNonNullParameter位java程序设置数据到
数据库的回调方法,getNullableResult为查询时 mysql的字符串类型传换成java的Type类型的方法
3.在MyBatis核心配置文件中进行注册
4.测试转换是否正确
//plugins标签
开发步骤:
1.导入通用PageHelper坐标
2.在mybatis核心配置文件中配置PageHelper插件
3.测试分页数据获取
---------------------------HTTP--------------------------
概念:超文本传续协议,规定了浏览器和服务器之间数据传输的规则
特点:
1.基于TCP协议:面向连接,安全
2.基于请求-响应模型的:一次请求对应一次响应
3.HTTP协议时无状态的协议:对于事务处理没有记忆能力。每次请求-响应都是独立的
·缺点:多次请求间不能共享数据 Cookie、Session会解决这个问题
·优点:速度快
---------------------------Servlet Request-----------------------
//Request
1.Request继承体系
2.获取请求数据
3.请求转发
//继承体系
ServletRequest<------------HttpServletRequest<-------------RequestFacade
Java提供的请求对象跟接口 Http协议封装的请求对象接口 Tomcat定义的实现类
1.Tomcat需要解析请求数据,封装为request对象,并且创建request对象传递到service方法中
2.使用request对象,查阅javaEE API文档的HttpServletRequest接口
//获取请求数据
1.请求行:
getMethod:获取请求方式:GET
getContextPath:获取虚拟目录(项目访问路径):/request-demo
StringBuffer getRequestURL:获取URL(统一资源定位符):http://localhost:8080/request-demo/req1
getRequestURI:获取URI(统一资源标识符):/request-demo/req1
getQueryString:获取请求参数(GET方式):uesrname=zhangsan&password=123
2.请求头
getHeader(String name):根据请求头名称,获取值
3.请求体
只有post请求才有
ServletInputStream getInputStream():获取字节输入流
BufferedReader getReader():获取字符输入流
//通用方式获取请求参数
GET: getQuertString
POST: getReader
不一样,麻烦
Map<String,String[]> getParameterMap():获取所有参数Map集合
Strig[] getParameterValues(String name):根据名称获取参数值(数组)
String getParameter(STring name):根据名称获取参数值(单个值)
//解决中文乱码问题
URL编码
1.将字符串按照编码方式转为二进制
2.每个字符转为2个16进制数并在前边加上%
URL编码实现方式
1.编码:
URLEncoder.encode(str,"utf-8");
URLDecoder.decode(s,"ISO-8859-1");
GET解决中文乱码:
//乱码原因:tomcat进行URL解码,默认的字符集ISO-8859-1
//1.先对乱码数据进行编码,转化为字节数组
Bytes[] bytes = username.getBytes(StandardCharsets.ISO_8859_1);
username = new String(bytes,StandardCharsets.UTF-8);
简化:
username = new String(username.getBytes(StandardCharsets.ISO_8859_1),StandardCharsets.UTF-8);
POST解决中文乱码:request.setCharacterEncoding("UTF-8");
Tomcat8.0之后,已将GET请求乱码问题解决,设置默认的解码方式为UTF-8
//Request请求转发
请求转发forward:一种在服务器内部的资源跳转方式
req.getRequestDispatcher("资源B路径").forward(req,resp);
请求转发资源间共享数据:使用Requ对象
void setAttribute(String name,O object);设置键,值,存到request域中
Object getAttribute(String name);通过键,获取值
void removeAttribute(String name);通过键,删除该键值对
请求转发的特点:
浏览器地址栏路径不发生变化
转发只能转发到当前服务器的内部资源
一次请求,可以在转发的资源间使用request共享数据
-----------------------------------------Servlet Response---------------------------
//继承体系
ServletResponse<------------HttpServletResponse<-------------ResponseFacade
Java提供的请求对象跟接口 Http协议封装的请求对象接口 Tomcat定义的实现类
//设置响应数据功能介绍
1.响应行
void setStatus(int sc):设置响应状态码
2.响应头
void setHeader(String name,String value):设置响应头键值对
3.响应体
PrintWriter getWriter():获取字符输入流
ServletOutputStream getOutputStream(): 获取字节输出流
//完成重定向
重定向Redirect:一种资源跳转方式
浏览器请求资源A,A处理不了,做出响应
响应1:我处理不了,找别人去处理:状态码302
2:那个人的位置是XXX:响应头location:xxx
然后浏览器去请求xxx
实现方式:resp.setStatus(302);
resp.setHeader("Location","资源B的路径");
简化方式:resp.senRedirect("资源B的路径");
重定向特点:
地址栏发生变化(浏览器发出了两次请求)
可以重定向到任意位置的资源(服务器内部外部均可)
两次请求,不能再多个资源使用request共享数据
//路径问题
浏览器使用:需要加虚拟目录
服务端使用:不需要加虚拟目录
重定向是给浏览器使用,所以要加
forward是服务器内部使用,不用加虚拟目录
//响应字符数据
0.支持中文和html
resp.setContentType("text/html","charset=utf-8");
1.获取字符输出流
PrintWriter writer = resp.getWriter();
2.写数据
writer.write("aaa");
//响应字节数据
1.获取字符输出流
ServletOutputStream outputStream = resp.getOutputStream();
2.写数据
outputStream.write(字节数据);
过程:
1.读取文件 FileInputStream fis = new FileInputStream(文件路径);
2.获取response字节输出流 ServletOutputStream os = response.getOutputStream();
3.完成流的copy
byte[] buff = new byte[1024];
int len = 0 ;
while((len=fis.read(buff))!=-1){
os.write(buff,0,len);
}
fis.close();
3.替换 依赖commons-io提供了copy的方法
IOUtils.copy(fis,os);
//代码优化
创建sqlSessionFactory时要注意 只能创建一次
写一个创建该工厂的工具类sqlSessionFactoryUtils
private static sqlsessionFactory sqlsessionFactory;
static {
try {
创建工厂的那几行代码
}catch (IOException e)
{
e.printStackTrace();
}
}
public static sqlsessionFactory getSqlsessionFactory(){
return this.sqlsessionFactory;
}
静态代码块会随着类的加载而自动执行,且只执行一次
----------------------------------JSP------------------------------
java服务端页面 一种动态的网页技术
JSP=html+java 用于简化开发
jsp本质上就是一个servlet
作用:简化开发,避免了再Servlet中直接输出HTML标签
//快速入门
1.导入JSP坐标
2.创建JSP文件
3.编写HTML标签和Java代码
//JSP脚本
用于再JSP页面内定义java代码
1.<%.....%>:内容会直接放到_jspService()方法之中
2.<%=...%>:内容会放到out.print()中,作为out.print()的参数
3.<%!...%>:内容会放到_jspService()方法之外,被类直接包含
//缺点
1.书写麻烦 2.阅读麻烦 3.复杂度高 4.占内存和磁盘 5.调试困难 6.不利于团队协作
//EL表达式
表达式语言,用于简化JSP页面内的Java代码
主要功能:获取数据
语法:${expression} 获取域中存储的key为brands的数据
JavaWeb四大域对象 范围逐渐递增
1.page:当前页面有效
2.request:当前请求有效
3.session:当前会话有效
4.application:当前应用有效
//JSTL标签
JSP标准标签库:使用标签取代JSP页面上的Java代码
1.导入坐标
2。在JSP页面上引入JSTL标签库
3.c标签有很多语法 比如:
<c:if test="逻辑表达式">
</c:if>
<c:forEach items="${brands}" var="brand">
<tr align="center">
<td>${brand.id}</td>
<td>${brand.name}</td>
</tr>
</c:forEach>
item对应被遍历的容器 var对应遍历产生的临时变量
for循环0-10
<c:forEach begin="0" end="10" strp="1" var="i">
${i}
</c:forEach>
---------------------------MVC
模型JavaBean 视图JSP 控制器Servlet
----------------------------三层架构
数据访问层:对数据库进行CRUD基本操作 com.itheima.dao/mapper 使用MyBatis框架
业务逻辑层:对业务逻辑进行封装,组合数据访问层层中基本功能,形成复杂的业务逻辑 com.itheima.service 使用Spring框架
表现层:接受请求,封装数据,调用业务逻辑层,响应数据 包名:com.itheima.web/controller 使用SpringMVC框架
---------------------------------会话跟踪技术---------------------------------------
会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应
会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自同一浏览器,以便在同一次会话的多次请求间共享数据
HTTP协议是无状态的,每次浏览器向服务器请求时,服务器都会将该请求视为新的请求,因此我们需要会话跟踪技术来实现会话内数据共享
客户端会话跟踪技术:Cookie
服务端会话跟踪技术:Session
---------------------------------Cookie
//基本使用
发送Cookie
1.创建Cookie对象,设置数据
Cookie cookie = new Cookie("key","value");
2.发送Cookie到客户端:使用response对象
response.addCookie(cookie);
获取Cookie
3.Cooike[] cookies = request.getCookies();
4.遍历数组,获取每一个Cookie;
5.获取数据 cookie.getName() cookie.getValue();
//原理
Cookie的实现是基于HTTP协议的
响应头:set-cookie
请求头:cookie
//使用细节
Cookie存活时间
>默认情况下,存储在浏览器中,浏览器关闭后,Cooike也被销毁
>setMaxAge(int seconds):设置Cookie存活时间
1.正数:将Cookie写入浏览器所在电脑的硬盘,持久化存储。到时间自动删除
2.负数:默认值,Cookie在当前浏览器内存中,当浏览器关闭,则Cookie被销毁
3.零:删除对应Cookie
Cookie存储中文
>Cookie默认不能存储中文
>存储中文需要进行URL编码
URLEncode URLDecode
--------------------------------Session
服务端会话跟踪技术:将数据保存到服务端
JavaEE提供HTTPSession接口,来实现一次会话的多次请求间数据共享功能
//使用:
1.获取Session对象 request.getSession();
2.Session对象功能:
void setAttribute(String name,O object);设置键,值,存到request域中
Object getAttribute(String name);通过键,获取值
void removeAttribute(String name);通过键,删除该键值对
//原理
Session是基于Cookie实现的
//使用细节
·Session钝化、活化
服务器重启后,Session中的数据是否还存在?
>钝化:服务器正常关闭后,Tomcat会自动将Session数据写入硬盘文件中
>活化:再次启动服务器后,从文件中加载数据到Session中
·Session销毁
默认情况下,无操作,30分钟自动摧毁
<session-config>
<session-timeout>30</session-timeout>
</session-config>
调用Session对象的invalidate()方法
-----------------------Filter
过滤器,是JavaWeb三大组件(Servlet、Filter、Listener)之一
可以把对资源的请求拦截下来,从而实现一些特殊的功能
过滤器一般完成一些通用的操作,比如:权限控制、统一编码处理、敏感字符处理等等
---------------------AJAX
异步的Javascript和XML
作用:
1.与服务器进行数据交换:通过AJAX可以给服务器发送请求,并获取服务器响应的数据
>使用AJAX和服务器进行通信,就可以使用HTML和AJAX来替换JSP页面了
2.异步交互:可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分王爷的技术,如
搜索联想、用户名是否可用校验,等等。。。
//快速入门
1.编写AjaxServlet,并使用response输出字符串
2.创建XMLHttpRequest对象:用于和服务器教化数据
3.向服务器发送请求
4.获取服务器响应数据
//Axios异步框架
对原生AJAX进行封装,简化书写
官网:www.axios-http.cn
1.引入axios的js文件
<script src="js/axios-0.18.0.js"></script>
2.使用axios发送请求,并获取响应结果
-------------------JSON
请求数据:JSON字符串转为java对象
响应对象:java对象转化为JSON字符串
方法: 使用Fastjson 是阿里提供的JSON库,可以实现二者的相互转化
使用:1.导入坐标
2.Java对象转JSON:String jsonStr = JSON.toJSONString(obj);
3.JSON转Java对象:User user = JSON.parseObject(jsonStr,User.class);
-----------------VUE
前端框架 简化书写
MVVM思想,实现数据的双向绑定,将编程的关注点放在数据上
-----------------------重写HttpServlet中的service方法
1.BaseServlet继承HttpServlet
2.获取请求路径
String uri = req.getRequestURI(); /brand-case/brand/selectAll
3.int index = uri.lastIndexOf('/');找到倒数第一个/的索引
String substring = uri.subString(index+1)截取倒数第一个/后的路径
index包含最后一个/ 所以index +1
4.获取方法对象
BrandServlet/UserServlet 字节码对象Class
//this:谁调用我(this所在方法),我(this)代表谁
所以BaseServlet中的this代表的是BrandServlet等等
Class<? extends BaseServlet> cls = this.getClass();
获取方法Method对象
Method method = cls.getMethod(methodName,HttpServletRequest.class,HttpServletResponse.class);
执行方法
method.invoke(this,req,resp);