第七章:Ajax和JSON
第一节:实现Ajax方式
1.1 Ajax概念
Ajax:ASynchronous JavaScript And XML
:异步的JavaScript和XML,是一种在无需重新加载整个页面的情况下,能够更新部分网页的技术。通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新,这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。传统的网页如果需要更新内容,必须重新加载整个页面
作用:提升用户的体验
**异步和同步:**建立在客户端和服务器端相互通信的基础上
**同步:**客户端必须等待服务器端的响应,在等待的期间客户端不能做其他操作
**异步:**客户端不需要等待服务器端的响应,在等待的期间客户端可以做其他操作
1.2 实现方式
- 原生的JS实现方式(了解)
//定义方法
function fun(){
//发送异步请求
//1.创建核心对象
var xmlhttp;
//兼容性
if (window.XMLHttpRequest){
//IE7+,Firefox,Chrome,Safari
xmlhttp=new XMLHttpRequest();
}
else {
//IE6,IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP")
}
//2.建立连接
/*
参数:1.请求方式:get、post
get方式,请求参数在url中拼接,send方法为空参
post方式,请求参数在send方法中定义
2.请求的url路径
3.同步或异步请求(true:异步 false:同步)
* */
xmlhttp.open("GET","test1.txt",true)
//3.发送请求
xmlhttp.send()
//4.接收并处理来自服务器的响应结果
//获取方式:xmlhttp.responseText
//什么时候获取?当服务器响应成功后再获取
//当xmlhttp对象的就绪状态改变时触发事件onreadystatechange
xmlhttp.onreadystatechange=function (){
//判断readystate就绪状态是否为4,判断status响应状态码是否为200
if (xmlhttp.readyState==4&&xmlhttp.status==200){
//获取服务器的响应结果
var responseText=xmlhttp.responseText;
alert(responseText)
}
}
-
Jquery实现方式
-
$.ajax()
语法:
$.ajax(url,[settings])
一般使用$.ajax({})
$.ajax({ url:"ajaxServlet",//请求路径 type:"post",//请求方式 //第一种data:"username=jack&&age=23"//请求参数 data:{"username":"jack","age":"23"},//推荐这种格式 success:function (data){ alert(data) },//响应成功后的回调函数 error:function(){ alert("出错了。。。") },//表示如果请求出现错误,会执行的函数 dataType:"text"//设置接收到的响应数据的格式 })
-
$.get()
语法:
$.get(url,[data],[callback],[type])
参数:
url:
请求路径data:
请求参数信息callback
:回调函数type
:响应结果的类型
$.get("ajaxServlet",{username: "rose"},function (data){ alert(data) },"text")
-
$.post()
$.post("ajaxServlet",{username: "rose"},function (data){ alert(data) },"text")
-
第二节:JSON基础语法
2.1 概念
JSON:JavaScript Object Notation
JavaScript对象表示法
JSON 现在多用于存储和交换文本信息的语法,进行数据的传输。类似 XML。
JSON 比 XML 更小、更快,更易解析。
2.2 语法
-
基本规则
数据在名称/值对中:Json数据是由键值对构成的
- 键用引号引起来,单双都行,也可以不使用引号
- 值的取值类型:
- 数字(整数或浮点数)
- 字符串(在双引号中)
- 逻辑值(true或false)
- 数组(在方括号中)
- 对象(在花括号中)
{"address",{"province":"陕西",...}}
- null
**数据由逗号分隔:**多个键值对由逗号分隔
花括号保存对象:使用{}定义json格式
方括号保存数组:[]
//1.定义基本格式 var Person={"name":"张三",age:20,"gender":true} alert(Person) //2.嵌套格式 {}-->[] var persons={ "person":[ {name:"张三",age:23,gender:true}, {name:"李四",age:24,gender:true}, {name:"王五",age:25,gender:false} ] }; //3. 嵌套格式 []-->{} var ps=[ {name:"张三",age:23,gender:true}, {name:"李四",age:24,gender:true}, {name:"王五",age:25,gender:false} ]
-
获取数据
- json对象.键名
- json对象[“键名”]
- 数组对象[索引]
//获取name的值 var name=Person.name; var name2=Person["name"]; var name3=persons.person[2].name;
-
遍历
- 集合遍历
var persons={ "person":[ {name:"张三",age:23,gender:true}, {name:"李四",age:24,gender:true}, {name:"王五",age:25,gender:false} ] }; //遍历 //获取persons对象中所有的键和值 for (var i = 0; i < persons.length; i++) { var p=persons[i]; for (var pKey in p) { alert(pKey+":"+p[pKey]) } }
- 对象遍历
var ps=[ {name:"张三",age:23,gender:true}, {name:"李四",age:24,gender:true}, {name:"王五",age:25,gender:false} ] for (var psKey in ps) { ps[psKey] }
2.3 Json数据和Java对象的相互转换
Json解析器:
- 常见的解析器:
Jsonlib
,Gson
,fastjson
,jackson
-
Json转为Java对象
-
导入
jackson
的相关jar包 -
创建Jackson核心对象
ObjectMapper
-
调用
ObjectMapper
的相关方法进行转换readValue(json字符串数据,Class)
//1.初始化json字符串 String json="{\"gender\":\"男\",\"name\":\"张三\",\"age\":\"23\"}"; //2.创建ObjectMapper对象 ObjectMapper mapper=new ObjectMapper(); Person person=mapper.readValue(json,Person.class); System.out.println(person);
-
-
Java对象转为Json
-
使用步骤
-
导入
jackson
的相关jar包 -
创建Jackson核心对象
ObjectMapper
-
调用
ObjectMapper
的相关方法进行转换-
转换方法:
writeValue(参数1,参数2):
- 参数1:File:将obj对象转换为JSON字符串,并保存到指定文件中
- Writer:将obj对象转换为JSON字符串,并将JSON数据填充到字符输出流中
- OutputStream:将obj对象转换为JSON字符串,并将JSON数据填充到字节输出流中
- writeValueAsString(obj):将对象转为json字符串
-
注解:
-
@JsonIgnore
:排除属性 -
@JsonFormat
:属性值的格式化@JsonFormat(pattern="yyyy-MM-dd")
-
复杂的Java对象转换
- **List:**数组
- **Map:**对象格式一致
-
-
//1.创建Person对象 Person person=new Person("张三",23,"男"); //2.创建Jackson的核心对象 ObjectMapper ObjectMapper mapper=new ObjectMapper(); //3.调用方法转换 /** * 转换方法: * writeValue(参数1,参数2): * 参数1:File:将obj对象转换为JSON字符串,并保存到指定文件中 * Writer:将obj对象转换为JSON字符串,并将JSON数据填充到字符输出流中 * OutputStream:将obj对象转换为JSON字符串,并将JSON数据填充到字节输出流中 * writeValueAsString(obj):将对象转为json字符串 */ String json=mapper.writeValueAsString(person); System.out.println(json); //writeValueAsString(obj) 将数据写到D://a.txt中 mapper.writeValue(new File("d://a.txt"),person); //writeValueAsString(obj) 将数据关联到Write中 mapper.writeValue(new FileWriter("d://b.txt"),person); //@JsonIgnore @JsonFormat(pattern = "yyyy-MM-dd") private Date birthday;
-
-
案例:
校验用户名是否存在
- 服务器响应的数据,在客户端使用时,要想当作json数据格式使用
$.get(type)
:将最后一个参数type指定为"json"- 在服务器端设置MIME类型:
response.setContentType("application/json;charset=utf-8");
第八章:Redis
第一节: Redis环境搭建
1.1 概念
Redis:是一种高性能的NOSQL系列的非关系型数据库,用作缓存
关系型数据库:
- 数据之间有关联关系
- 数据存储在硬盘的文件上
非关系型数据库:
- 数据之间没有关系
- 数据存储在内存中
1.2 下载安装
-
官网:
http://redis.io
-
中文网:
http://www.redis.net.cn/
-
解压直接可以使用
redis.windows.conf
:配置文件redis-cli.exe
:redis的客户端redis-server.exe
:redis的服务器端
1.3 命令操作
-
redis的数据结构
redis存储的是:
key,value
格式的数据,其中key都是字符串,value有5种不同的数据结构value的数据结构:
- 字符串类型:
string
- 哈希类型:
hash
:map格式 - 列表类型 :
list
:linkedlist格式 - 集合类型:
set
:hashset格式 - 有序集合类型:
sortedset
- 字符串类型:
-
字符串类型 string
- 存储:
set key value
- 获取:
get key
- 删除:
del key
- 存储:
-
哈希类型 hash
-
存储:
hset field value
field:字段
-
获取:
hget key field
:获取指定的field对应的值
hgetall key
:获取所有的field和value -
删除:
hdel key field
-
-
列表类型 List:可以添加一个元素到列表头部(左边)或者尾边(右边)
-
添加:
lpush key value
:将元素加入列表左边rpush key value
:将元素加入列表右边
-
获取:
lrange key start end
:范围获取lrange key 0 -1
:获取全部 -
删除:
lpop key
:删除列表最左边的元素,并将元素返回rpop key
:删除列表最右边的元素,并将元素返回
-
-
集合类型 set:不允许重复
- 存储:
sadd key value
- 获取:
smembers key
:获取set集合中所有元素 - 删除:
srem key value
:删除set集合中的某个元素
- 存储:
-
有序集合 sortedset:不允许重复且元素有序
- 存储:
zadd key score value
: - 获取:
zrange key start end [withscores]
- 删除:
zrem key value
- 存储:
-
通用命令
keys *
:查询所有的键type key
:获取键对应的value类型del key
:删除指定的key、value键值对
第二节:redis持久化
redis是一个内存数据库,当redis服务器重启,或者电脑重启,数据会丢失,我们可以将redis内存中的数据持久化保存到硬盘的文件中
2.1 redis持久化机制
-
**RDB:**默认方式,不需要进行配置,默认使用这种机制
在一定的时间间隔中,检测key的变化情况,然后持久化数据
使用步骤:
-
编辑redis.windows.conf文件
#after 900 sec (15min) if at least 1 key changed save 900 1 #after 300 sec (5min) if at least 10 keys changed save 300 10 #after 60 sec (1min) if at least 10000 keys changed save 60 10000
-
重新启动redis服务器并指定配置文件名称
redis-server.exe redis.windows.conf
-
-
**AOF:**日志记录的方式,可以记录每一条命令的操作,可以每一次命令操作后持久化数据
-
编辑redis.windows.conf文件
appendonly no(关闭AOF)---->appendonly yes(开启AOF)
#appendfsync always //每一次操作都进行持久化 #appendfsync everysec//每隔一秒进行一次持久化(m) #appendfsync no//
-
第三节:Jedis代码操作
3.1 Jedis快速入门
**Jedis:**一款Java操作数据库的工具,类似JDBC
使用步骤:
-
下载Jedis的jar包
-
使用
//1.获取连接 Jedis jedis=new Jedis("localhost",6379);//如果使用空参构造,默认值"localhost",6379 //2. 操作 jedis.set("username","zhangsan"); //获取 String u //3.关闭连接 jedis.close();
3.2 Jedis操作
-
字符串类型 String
set
get
-
哈希类型 hash:map格式
hset
hget
hgetAll
:获得所有键值对,返回一个map集合 -
列表类型 list:linkedlist格式。支持重复元素
lpush/rpush
lpop/rpop
lrange start end
:范围获取 -
集合类型 set:不允许重复元素
sadd
smembers:
获取所有元素 -
有序集合类型 sortedset:不允许重复元素,且元素有顺序
zadd
zrange
3.3 连接池
jedis连接池:JedisPool
使用:
- 创建
JedisPool
连接池对象 - 调用方法
getResource()
方法获取jedis对象
//创建一个配置对象
JedisPoolConfig config=new JedisPoolConfig();
config.setMaxTotal(50);//最大允许连接数
config.setMaxIdle(10);//最大的空闲连接
//创建连接池对象
JedisPool jedisPool=new JedisPool(config,"localhost",6379);
//2.获取连接
Jedis jedis=jedisPool.getResource();
//3.使用
jedis.set("hehe","haha");
//4.关闭(归还到连接池中)
jedis.close();
Jedis连接工具类
public class JedisPoolUtils {
/*
* JedisPool工具类
* 加载配置文件,配置连接池的参数
* 提供获取链接的方法
* */
private static JedisPool jedisPool;
static {
//读取配置文件
InputStream is=JedisPoolUtils.class.getClassLoader().getResourceAsStream("jedis.properties");
//创建Properties对象
Properties pro=new Properties();
//关联文件
try {
pro.load(is);
} catch (IOException e) {
e.printStackTrace();
}
//获取数据,设置到Jedis
JedisPoolConfig config=new JedisPoolConfig();
config.setMaxTotal(Integer.parseInt(pro.getProperty("maxTotal")));
config.setMaxIdle(Integer.parseInt(pro.getProperty("maxIdle")));
//初始化JedisPool
jedisPool=new JedisPool(config,pro.getProperty("host"), Integer.parseInt(pro.getProperty("port")));
}
//获取连接的方法
public static Jedis getJedis(){
return jedisPool.getResource();
}
}
public class JedisPoolTest {
@Test
public void test1(){
//1.通过连接工具类获取
Jedis jedis=JedisPoolUtils.getJedis();
//2.使用
jedis.set("hehe","haha");
//3.归还
System.out.println(jedis.get("hehe"));
jedis.close();
}
}
3.4 案例
案例需求:
- 提供
index.html
页面,页面中有一个省份 下拉列表 - 当 页面加载完毕后,发送ajax请求,加载所有省份
注意:使用redis缓存一些不经常变化的数据
数据库中的数据一旦发生改变,则需要更新缓存
数据库的表执行 增删改等相关操作,需要将redis缓存数据情况,再次存入
在service对应的增删改方法中,将redis数据删除
第九章:Maven介绍
第一节:Maven基本概念
1.1 概述
**Maven:**是一个项目管理工具,它包含了一个项目对象模型(POM:Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑
1.2 Maven能解决什么问题
- 我们需要引用各种 jar 包,尤其是比较大的工程,引用的 jar 包往往有几十个乃至上百个, 每用到一种 jar 包,都需要手动引入工程目录,而且经常遇到各种让人抓狂的 jar 包冲突,版本冲突。
- 我们辛辛苦苦写好了 Java 文件,可是只懂 0 和 1 的白痴电脑却完全读不懂,需要将它编译成二进制字节码。好歹现在这项工作可以由各种集成开发工具帮我们完成,Eclipse、IDEA 等都可以将代码即时编译。当然,如果你嫌生命漫长,何不铺张,也可以用记事本来敲代码,然后用 javac 命令一个个地去编译,逗电脑玩。
- 世界上没有不存在 bug的代码,计算机喜欢 bug就和人们总是喜欢美女帅哥一样。为了追求美为了减少 bug,因此写完了代码,我们还要写一些单元测试,然后一个个的运行来检验代码质量。
- 再优雅的代码也是要出来卖的。我们后面还需要把代码与各种配置文件、资源整合到一起,定型打包,如果是 web项目,还需要将之发布到服务器,供人蹂躏
1.3 Maven依赖管理的概念
**依赖管理:**maven工程对jar包的管理过程 代码可重用
1.4 Maven仓库种类和彼此关系
仓库分为3类:本地仓库、远程仓库【私服】、中央仓库
第二节:maven标准目录结构和常用命令
2.1 maven标准目录结构
src/main/java
目录 核心代码部分
src/main/resources
目录 配置文件部分
src/test/java
目录 测试代码部分
src/test/resources
目录 测试配置文件
src/main/webapp
目录 页面资源,js,css,图片等
2.2 maven常用命令
maven clean
:对项目进行清理,删除target目录下编译的内容maven compile
:编译项目源代码maven test
:对项目进行运行测试maven package
:打包文件并存放到项目的target目录下,打包好的文件通常都是编译后的class文件maven install
:在本地仓库生成仓库的安装包,可供其他项目引用,同时打包后的文件放到项目的target目录下maven deploy
:发布
常用命令使用场景举例:
-
mvn clean package依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)等7个阶段,package命令完成了项目编译、单元测试、打包功能,但没有把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库
-
mvn clean install依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)、install等8个阶段,install命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库,但没有布署到远程maven私服仓库
-
mvn clean deploy依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)、install、deploy等9个阶段,deploy命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库
常见问题:
1. mvn clean install 和 mvn install 的区别
-
根据maven在执行一个生命周期命令时,理论上讲,不做mvn install 得到的jar包应该是最新的,除非使用其他方式修改jar包的内容,但没有修改源代码
-
平时可以使用mvn install ,不使用clean会节省时间,但是最保险的方式还是mvn clean install,这样可以生成最新的jar包或者其他包
2.maven两种跳过单元测试方法的区别
-
mvn package -Dmaven.test.skip=true
不但跳过了单元测试的运行,同时也跳过了测试代码的编译
-
mvn package -DskipTests
跳过单元测试,但是会继续编译。如果没时间修改单元测试的bug,或者单元测试编译错误,则使用第一种,不要使用第二种
第三节:maven生命周期和概念模型图
3.1 maven生命周期
执行后面的一定会包含前面的
3.2 maven概念模型图
第四节: maven高级应用
4.1 maven基础知识回顾
maven:是一个项目管理工具
主要功能:
-
**依赖管理:**maven对项目中jar包的管理过程。传统工程我们直接把jar包放在项目中,maven工程真正的jar包放置在仓库中,项目中只用放jar包的坐标
**仓库的种类:**本地仓库、远程仓库(私服)、中央仓库
**仓库之间的关系:**当我们启动一个maven工程的时候,maven工程会通过pom文件中jar包的坐标去本地仓库找对应jar包,默认情况下,如果本地仓库没有对应jar包,maven工程会自动去中央仓库下载jar包到本地仓库。在公司中,如果本地没有对应jar包,会从私服先下载jar包。如果私服没有jar包,可以从中央仓库下载,也可以从本地上传
-
**一键构建:**maven自身集成了tomcat插件,可以对项目进行编译,测试,打包,安装,发布等操作
**maven常用命令:**clean,compile,test,package,install,deploy
**maven三套生命周期:**清理生命周期、默认生命周期、站点生命周期
4.2 maven导入jar包时冲突的解决
maven工程要导入jar包的坐标,就必须要考虑解决jar包冲突
解决jar包冲突的方式:
-
**第一声明优先原则:**哪个jar包的坐标在靠上的位置,这个jar包就是先声明的。先声明的jar包坐标下的依赖包,可以优先进入项目中
-
**路径近者优先原则:**直接依赖路径比传递依赖路径近,那么最终项目进入的jar包会是路径近的直接依赖
**直接依赖:**项目中直接导入的jar包,就是该项目的直接依赖包
**传递依赖:**项目中没有直接导入的jar包可以通过项目直接依赖jar包传递到项目中
-
**直接排除法【推荐使用】:**当我们要排除某个jar包下的依赖包,在配置
<exclusion>
标签的时候,内部可以不写版本号,因为此时依赖包使用的版本号默认和本jar包一样
4.3 pom文件内标签的讲解
<dependencyManagement>
**作用:**锁定jar包版本
maven工程可以是分父子依赖关系的。凡是依赖别的项目后,拿到的别的项目的依赖包,都属于传递依赖。
比如:当前A项目,被B项目依赖,那么我们A项目中所有的jar包都会传递到B项目中,B项目开发者,如果再在B项目中导入一套ssm框架的jar包,对于B项目是直接依赖,那么直接依赖的jar包就会把我们A项目传递过去的jar包覆盖掉。
为了防止以上的情况出现,我们可以把A项目中主要jar包的坐标锁住,那么其它依赖该项目的项目中,即便是有同名jar包直接依赖,也无法覆盖
4.4 maven工程拆分与聚合的思想
4.5 工程和模块的关系以及继承和依赖的概念
工程和模块的区别
工程不等于完整的项目,模块也不等于完整的项目,一个完整的项目看的是代码,代码完整,就可以说是这是一个完整的项目,和此项目是工程或模块没有关系
工程天生只能使用自己内部资源,工程是独立的,后天可以和其他工程和模块建立关联关系
模块天生不是独立的,模块天生是属于父工程的,模块一旦创建,所有父工程的资源都可以使用
父子工程之间关系
子模块天生继承父工程,可以使用父工程所有资源
子模块之间天生是没有任何关系的
父子工程之间不用建立关系,继承关系是先天的,不需要手动建立
平级之间的引用叫做依赖,依赖不是先天的,依赖是需要后天建立的