1.概念:Extensible Markup Language 可扩展标记语言
可扩展:标签都是自定义的
功能
xml与html的区别
2.基本语法:
3.组成部分
作为xml文档的书写规则
分类:
DTD:一种简单的约束技术
<!ELEMENT students (student*) >
<!ELEMENT student (name,age,sex)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST student number ID #REQUIRED>
引入dtd文档到xml文档中
内部dtd:将约束规则定义在xml文档中
外部dtd:将约束的规则定义在外部的dtd文件中
本地:
网络:
Schema:一种复杂的约束技术
引入: 1.填写xml文档的根元素
2.引入xsi前缀. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3.引入xsd文件命名空间. xsi:schemaLocation="http://www.itcast.cn/xml student.xsd"
4.为每一个xsd约束声明一个前缀,作为标识 xmlns="http://www.itcast.cn/xml"
<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.itcast.cn/xml"
xsi:schemaLocation="http://www.itcast.cn/xml student.xsd"
>
操作xml文档,将文档中的数据读取到内存中
操作xml文档
解析xml的方式:
xml常见的解析器:
入门步骤:
对象的使用:
Jsoup:工具类,可以解析html或xml文档,返回Document
Document:文档对象。代表内存中的dom树,可以来获取Element对象
Elements:元素Element对象的集合。可以当做 ArrayList
获取子元素对象,Element:元素对象
getElementById(String id):根据id属性值获取唯一的element对象
getElementsByTag(String tagName):根据标签名称获取元素对象集合
getElementsByAttribute(String key):根据属性名称获取元素对象集合
getElementsByAttributeValue(String key, String value):根据对应的属性名和属性值获取元素对象集合
获取属性值
Node:节点对象
快捷查询方式: 1. selector:选择器 * 使用的方法:Elements select(String cssQuery) * 语法:参考Selector类中定义的语法 2. XPath:XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集) 文档中某部分位置的语言
概念:运行在服务器端的小程序
被创建:执行init方法,只执行一次
默认情况下,第一次访问时,Servlet被创建
可以在web.xml里
第一次访问时创建
<load-on-startup>的值为负数
在服务器启动时创建
<load-on-startup>的值为0或正数
Servlet的init方法,只执行一次,说明Servlet在内存中村中只存在一个对象,Servlet是单例的
提供服务:执行service方法,执行多次
被销毁:执行destroy方法,只执行一次
在类上使用注解进行配置
Servlet(接口)---->GenericServlet(抽象类)---->HttpServlet(抽象类)
请求行
请求方式 请求url 协议/版本
GET/POST 地址 HTTP/1.1
请求头:客户端浏览器告诉服务器一些信息
格式:请求头名称:请求头值
User-Agent:浏览器告诉服务器,我访问你使用的浏览器版本信息
Referer:告诉服务器,当前请求从哪里来 作用:1.放盗链 2.统计工作
请求空行
请求体(正文)
响应行
协议/版本 响应状态码 状态码描述
HTTP/1.1 200 ok
响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态
响应头
响应空行
响应体:传输的数据
request和response对象是由服务器创建的
获取请求消息数据
其他功能
简化数据封装
概念:代表整个web应用,可以和程序的容器(服务器)来通信
获取:
功能
HTTP 协议是一种无状态协议
,即每次服务端接收到客户端的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录;Session 和 Cookie 的主要目的就是为了弥补 HTTP 的无状态特性
Web Cookie
和浏览器 Cookie
,它是服务器发送到 Web 浏览器的一小块数据。服务器发送到浏览器的 Cookie,浏览器会进行存储,并与下一个请求一起发送到服务器。通常,它用于判断两个请求是否来自于同一个浏览器,例如用户保持登录状态。概念:客户端请求服务端,服务端会为这次请求开辟一块内存空间
,这个对象便是 Session 对象,存储结构为 ConcurrentHashMap
。Session 弥补了 HTTP 无状态特性,服务器可以利用 Session 存储客户端在同一个会话期间的一些操作记录
步骤:
实现原理:
服务器第一次接收到请求时,开辟了一块 Session 空间(创建了Session对象),同时生成一个 sessionId ,并通过响应头的 **Set-Cookie:JSESSIONID=XXXXXXX **命令,向客户端发送要求设置 Cookie 的响应; 客户端收到响应后,在本机客户端设置了一个 **JSESSIONID=XXXXXXX **的 Cookie 信息,该 Cookie 的过期时间为浏览器会话结束
其他:
当客户端关闭,服务器不关闭,两次获取的session对象
客户端不关闭,服务器关闭,两次获取的session对象
存活时间
服务器关闭
session对象调用**invalidate()**自杀
session默认失效时间为30分钟
选择性配置修改
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<%指令名称 属性名1=属性值1 属性名2=属性值2 ...%>
概念:JavaServer Pages Tag Library JSP标准标签库
步骤:
导入jstl相关jar包
引入标签库:
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
常用的JSTL标签
if
<c:if test=""></c:if>
test为必须属性,接受boolean表达式
choose
<c:choose>
<c:when test=""></c:when>
<c:otherwise></c:otherwise></c:choose>
foreach
<c:forEach begin="1" end="10" var="i" step="1" varStatus="s">
${i} ${s.index} ${s.count}<br></c:forEach>
begin:开始值
end:结束值
items:容器对象
var:临时变量
step:步长
varStatus:
执行顺序:如果有两个过滤器:
1.过滤器1
2.过滤器2
3.资源执行
4.过滤器2
5.过滤器1
执行先后
$.ajax({键值对});
$.ajax({
url:"" , //请求路径
type:"POST/GET" , //请求方式
data:{"username":"jack","age":23},//请求参数
success:function (data) {//响应成功后的回调函数
alert(data);
},
error:function () {//表示如果请求响应出现错误,会执行的回调函数
alert("出错啦...")
},
dataType:"text"//设置接受到的响应数据的格式
});
$.get():发送get请求
$.post():发送post请求
json数据是由键值对构成的
键用引号(单双都行)引起来,也可以不使用引号
数据由逗号分隔:多个键值对由逗号分隔
方括号保存数组:[]
获取数据:
Java对象转换JSON
使用步骤:
转换方法:
writeValue(参数1,obj)
writeValueAsString(obj):将对象转为json字符串
属性注解:
复杂java对象转换
JSON转为Java对象
JSON转JavaScript
JavaScript转JSON
redis的数据结构:
持久化
redis持久化机制:
RDB:默认方式,不需要进行配置,默认就使用这种机制,在一定的间隔时间中,检测key的变化情况,然后持久化数据
编辑redis.windwos.conf文件
#after 900 sec (15 min) if at least 1 key changed
save 900 1
#after 300 sec (5 min) if at least 10 keys changed
save 300 10
#after 60 sec if at least 10000 keys changed
save 60 10000
在文件目录下打开cmd窗口,重新启动redis服务器,并指定配置文件名称
redis-server.exe redis.windows.conf
AOF:日志记录的方式,可以记录每一条命令的操作。可以每一次命令操作后,持久化数据
编辑redis.windwos.conf文件
appendonly no(关闭aof) --> appendonly yes (开启aof)
# appendfsync always : 每一次操作都进行持久化
# appendfsync everysec : 每隔一秒进行一次持久化
# appendfsync no : 不进行持久化
导入jar包:commons-pool2-2.3.jar
创建jedis.properties配置
#最大活动对象数
redis.pool.maxTotal=1000
#最大能够保持idel状态的对象数
redis.pool.maxIdle=100
#最小能够保持idel状态的对象数
redis.pool.minIdle=50
#当池内没有返回对象时,最大等待时间
redis.pool.maxWaitMillis=10000
#当调用borrow Object方法时,是否进行有效性检查
redis.pool.testOnBorrow=true
#当调用return Object方法时,是否进行有效性检查
redis.pool.testOnReturn=true
#“空闲链接”检测线程,检测的周期,毫秒数。如果为负值,表示不运行“检测线程”。默认为-1.
redis.pool.timeBetweenEvictionRunsMillis=30000
#向调用者输出“链接”对象时,是否检测它的空闲超时;
redis.pool.testWhileIdle=true
# 对于“空闲链接”检测线程而言,每次检测的链接资源的个数。默认为3.
redis.pool.numTestsPerEvictionRun=50
#redis服务器的IP
redis.ip=127.0.0.1
#redis服务器的Port
redis1.port=6379
public class JedisPoolUtils {
private static JedisPool jp;
static {
//读取配置文件
InputStream is = JedisPoolUtils.class.getClassLoader().getResourceAsStream("jedis.properties");
//创建Properties
Properties pro = new Properties();
try {
pro.load(is);
} catch (IOException e) {
e.printStackTrace();
}
//创建JedisPoolConfig对象
JedisPoolConfig jpc = new JedisPoolConfig();
//获取数据,设置到JedisPoolConfig中
jpc.setMaxTotal(Integer.parseInt(pro.getProperty("redis.pool.maxTotal")));
jpc.setMaxIdle(Integer.parseInt(pro.getProperty("redis.pool.maxIdle")));
//初始化JedisPool
jp = new JedisPool(jpc, pro.getProperty("redis.ip"), Integer.parseInt(pro.getProperty("redis1.port")));
}
//获取连接方法
public static Jedis getJedis() {
return jp.getResource();
}
}