Filter过滤器
使用步骤
编写一个类去实现Filter接口
实现过滤方法doFilter()
到web.xml中去配置Filter的拦截路径
生命周期
构造器方法
init 初始化方法
第1,2步, 在web工程启动的时候执行(Filter已经创建)
doFilter 过滤方法
第3步, 每次拦截到请求就会执行
destroy 销毁
第4步, 停止web工程的时候,就会执行(停止web工程, 也会销毁Filter过滤器)
FilterConfig类
见名知义, 它是Filter过滤器的配置文件类
Tomcat 每次创建Filter的时候, 也会同时创建一个FilterConfig类, 这里包含了Filter配置文件的配置信息
FilterConfig类的作用是获取Filter过滤器的配置内容:
- 获取Filter的名称
filter-name
的内容
就是xml文件中`filter-name`的值
获取在Filter中配置的
init-param
初始化参数就是xml文件中自定义的’init-param’初始化参数
获取
ServletContext
对象获取ServletContext对象
FilterChain过滤器链
Filter: 过滤器
Chain: 链, 链条
FilterChain: 就是过滤器链(多个过滤器如何一起工作)
程序执行顺序:
Filter的拦截路径
- 精确匹配
<url-pattern>/target.jsp</url-pattern>
以上配置的路径, 表示请求地址必须为: http://ip:port/工程路径/target.jsp
目录匹配
/admin/* 以上配置的路径, 表示请求地址必须为: http://ip:port/工程路径/admin/*
后缀名匹配
*.html 以上配置的路径, 表示请求地址必须以 .html结尾才会拦截到
Filter过滤器只关心请求的地址是否匹配,不关心请求的资源是否存在
ThreadLocal 的使用
ThreaLocal 的作用,它可以解决多线程的数据安全问题
ThreaLocal 它可以给当前线程关联一个数据(可以是普通变量,可以是对象,也可以是数组,集合)
ThreadLocal 的特点
ThreadLocal 可以为当前线程关联一个数据. (它可以像Map一样存取数据, Key为当前线程)
每一个ThreadLocal对象, 只能为当前线程关联一个数据, 如果要为当前线程关联多个数据, 就需要使用多ThreadLocal对象实例
每个ThreadLocal对象实例定义的时候, 一般都是static 类型
ThreadLocal中保存的数据, 在线程销毁后. 会由JVM虚拟机自动释放.
*使用Filter过滤器统一给所有的 Service 方法都加上try-catch *
将所有异常都统一交给Tomcat,让Tomcat展示友好的错误信息页面
在web.xml中我们可以通过错误页面配置来进行管理。
JSON
JSON是一种轻量级的数据交换格式。易于人阅读和编写,同时也易于机器解析和生成。JSON采用完全独立于语言的文本格式,而且很多语言都提供了对JSON的支持。
JSON是一种轻量级的数据交换格式, 轻量级指的是跟xml做比较.
数据交换指的是客户端和服务器之间业务数据的传递格式.
JSON的定义
JSON是由键值对组成, 并且由大括号包围, 每个键用引号引起来, 键和值之间使用冒号进行分隔, 多组键值对之间使用逗号进行分隔.
JSON的访问
json本身是一个对象, json中的key我们可以理解为是对象中的一个属性, json中的key 访问就跟访问对象的属性一样: json对象.key
JSON 在 JAVA 中的应用
javabean 和 json 的互转
自定义一个
Javabean
, 创建一个示例对象.1
Person person = new Person(1, "aaa!");
创建
Gson
对象, 并使用toJson
方法将person
对象转换成json
对象.1
2
3Gson gson = new Gson();
String personJsonString = gson.toJson(person);
System.out.println(personJsonString);输出为:
同样可以将字符串转换回
Person
对象1
2
3
4
5// fromJson把json字符串转换回Java对象
// 第一个参数是json字符串
// 第二个参数是转换回去的Java对象
Person person1 = gson.fromJson(personJsonString, Person.class);
System.out.println(person1);输出为:
可以看出格式是使用了Person
类的toString
格式, 说明已经转回.
List 和 json 的互传
还是使用
Person
类, 定义多个示例对象放入List
中1
2
3
4List<Person> personList = new ArrayList<>();
personList.add(new Person(1, "lxb"));
personList.add(new Person(2, "cx"));创建
Gson
对象, 依然使用toJson
的方法1
2
3
4Gson gson = new Gson();
String personListJsonString = gson.toJson(personList);
System.out.println(personListJsonString);输出为:
转回
Person
列表时, 还是使用fromJson
方法, 但是第二个形参需要注意, 不是personList.getClass()
, 那该将什么作为列表的格式呢.gson包自带了一个
TypeToken
类, 使用这个类可以解决困惑首先创建一个新的类
PersonListType
, 然后继承TypeToken
类, 注意填入的泛型为需要转回的类型:这个类放在这里就可以了.
我们去看一下
TypeTokken
的源码, 可以看到一个关键的方法1
2
3public final Type getType() {
return this.type;
}这个方法返回的就是我们所需要的格式, 因为是继承了这个类, 直接使用就可以了. 这样就解决了
fromJson()
方法中第二个形参写什么的问题.
1
2List<Person> list = gson.fromJson(personListJsonString, new PersonListType().getType());
System.out.println(list);输出为:
Map 和 json 的互转
创建哈希表, 然后将
Person
示例对象添加进去1
2
3
4Map<Integer, Person> personMap = new HashMap<>();
personMap.put(1, new Person(1, "lxb"));
personMap.put(2, new Person(2, "cx"));创建
Gson
对象, 使用toJson
方法1
2
3Gson gson = new Gson();
String personMapJsonString = gson.toJson(personMap);
System.out.println(personMapJsonString);输出为:
这里就要注意与
List
互换的区别了.List
转换成json
对象时, 是将多个json
对象放到一个列表中, 而Map
转过去之后, 变成了嵌套的形式.转回
Map
形式, 方法与上面类似, 也是定义一个继承TypeToken
的类, 然后将其放入fromJson
方法的第二个形参中.1
2HashMap<Integer, Person> map = gson.fromJson(personMapJsonString, new PersonMapType().getType());
System.out.println(map);输出为:
使用匿名内部类进行代码优化
在与List
和Map
结构进行互换时, 都有专门定义一个类, 但都只是在声明时使用了一次, 所以可以使用匿名内部类来优化代码.以转回Map
为例:
1 | HashMap<Integer, Person> map = gson.fromJson(personMapJsonString, new TypeToken<HashMap<Integer, Person>>(){}.getType()); |
JSON vs XML
JSON 和 XML 都用于接收 web 服务端的数据, 在写法上有所不同
Json实例:
1 | { |
XML实例:
1 | <sites> |
两者的相同之处:
- JSON 和 XML 数据都是 “自我描述” ,都易于理解。
- JSON 和 XML 数据都是有层次的结构
- JSON 和 XML 数据可以被大多数编程语言使用
两者不同之处:
- JSON 不需要结束标签
- JSON 更加简短
- JSON 读写速度更快
- JSON 可以使用数组
最大的不同之处:
XML 需要使用 XML 解析器来解析,JSON 可以使用标准的 JavaScript 函数来解析。
JSON.parse()
: 将一个 JSON 字符串转换为 JavaScript 对象。JSON.stringify()
: 于将 JavaScript 值转换为 JSON 字符串。
AJAX
AJAX定义
AJAX即”Asynchronous Javascript And XML”(异步 JavaScript和XML), 是指一种创建交互式网页应用的网页开发技术.
AJAX是一种浏览器通过js异步发起请求, 局部更新页面的技术
异步请求能大大提升用户体验, 不同请求各自响应, 不需要排队等候
AJAX请求局部更新, 浏览器地址栏不会发生变化, 局部更新不会舍弃原来页面的内容
原生AJAX实例
编写
AjaxServlet
类, 让它继承BaseServlet
类。然后在
web.xml
文件中修改配置在
ajax.html
页面中编写js代码设置ajax
请求, 这里要用到.open()
方法, 然后用.send()
方法来发送请求.注释中写明了具体的步骤.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24<head>
<meta http-equiv="pragma" content="no-cache" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="Expires" content="0" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
// 在这里使用JavaScript语言发起Ajax请求, 访问服务器AjaxServlet中的javaScriptAjax
function ajaxRequest() {
// 1、我们首先要创建XMLHttpRequest
var xmlhttprequest = new XMLHttpRequest();
// 2、调用open方法设置请求参数
xmlhttprequest.open("Get", "http://localhost:8080/json_ajax_i18n/ajaxServlet?action=javaScriptAjax", true)
// 3、调用send方法发送请求
xmlhttprequest.send();
// 4、在send方法前绑定onreadystatechange事件,处理请求完成后的操作。
}
</script>
</head>
<body>
<button onclick="ajaxRequest()">ajax request</button>
<div id="div01">
</div>
</body>然后在
AjaxServlet
中编写请求处理方法.1
2
3
4protected void javaScriptAjax(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Ajax请求过来了");
}点击
html
页面的请求按钮之后, 控制台输出为:说明能够正确接收到网页发送的
ajax
请求.向客户端发送信息, 采用
json
字符串的形式. 如果需要获取来自服务器的相应, 使用XMLHttpRequest
对象的responseText
或responseXML
属性.属性 描述 responseText 获得字符串形式的响应数据 responseXML 获得XML形式的响应数据 当请求被发送到服务器时, 需要执行一些基于响应的任务. 每当
readyState
改变时, 就会触发onreadystatechange
事件.readyState
属性存有XMLHttpRequest
的状态信息下面是
XMLHttpRequest
对象的三个重要属性:属性 描述 onreadystatechange 存储函数(或函数名), 每当readyState属性改变时, 就会调用该函数 readyState 存有XMLHttpRequest的状态.从0到4发生变化 status 200:”OK”, 404:”未找到页面” 其中
readyState
的值表达的含义为:- 0: 请求未初始化
- 1: 服务器连接已建立
- 2: 请求已接收
- 3: 请求处理中
- 4: 请求已完成, 且响应已就绪
也就是说我们从客户端向服务器发送了请求, 服务器处理完成后发出了响应, 这个过程中都伴随着这三个属性的变化.
对服务器响应所执行的任务我们写在
onreadystatechange
事件中, 这里理所应当地添加上状态已就绪的条件:1
2
3
4
5xmlhttprequest.onreadystatechange = function () {
if (xmlhttprequest.readyState == 4 && xmlhttprequest.status == 200) {
alert(xmlhttprequest.responseText);
}
}需要注意的是,
onreadystatechange
事件要在send()
方法之前绑定.这里传给客户端的信息为一个
Person
实例, 在AjaxServlet
程序中编写:1
2
3
4
5
6
7
8
9
10protected void javaScriptAjax(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Ajax请求过来了");
Person person = new Person(1, "lxb");
// json格式的字符串
Gson gson = new Gson();
String personJsonString = gson.toJson(person);
resp.getWriter().write(personJsonString);
}页面输出为:
把返回的数据显示在页面上:
1
2
3
4
5xmlhttprequest.onreadystatechange = function () {
if (xmlhttprequest.readyState == 4 && xmlhttprequest.status == 200) {
document.getElementById("div01").innerHTML = xmlhttprequest.responseText;
}
}页面为:
对返回的
json
对象进行操作, 提取对象中的值:1
2
3
4
5
6xmlhttprequest.onreadystatechange = function () {
if (xmlhttprequest.readyState == 4 && xmlhttprequest.status == 200) {
let jsonObj = JSON.parse(xmlhttprequest.responseText);
document.getElementById("div01").innerHTML = "编号: "+ jsonObj.id + ", 姓名: "+ jsonObj.name;
}
}页面为:
jQuery 中的 AJAX 请求
一般不会写原生的AJAX请求, 更多的是依托与框架.
$.ajax
方法
属性 | 描述 |
---|---|
url | 表示请求的地址 |
type | 表示请求的类型GET或POST |
data | 表示发送给服务器的数据 |
success | 请求响应, 响应的回调函数 |
dataType | 响应的数据类型, 常用的类型有: text 表示纯文本, xml 表示xml数据 , json 表示json对象 |
在html
页面中添加相应的函数
1 | // ajax请求 |
需要注意的是success
后跟的function
括号中要写入服务器返回的数据.
在AjaxServlet
类中编写请求处理方法, 为了区别于上面的原生AJAX
实例, 再写一个jQueryAjax
方法.
1 | protected void jQueryAjax(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { |
输出结果为:
依然是对返回的JSON
字符串进行操作, 使它显示得更直观.
在页面中合适的地方添加<div></div>
块, 然后修改success
属性:
1 | success: function (data) { |
输出为:
如果dataType
属性填的是json
, 会自动转为json
对象, 不需要再手动转换.
$.get
方法和 $.post
方法
这两个方法本质就是把上面的方法中的
type
属性固定下来
$.get方法
通过远程 HTTP GET 请求载入信息
这是一个简单的GET请求功能以取代复杂的$.ajax
. 请求成功时可调用回调函数. 如果需要在出错时执行函数, 需要使用$.ajax
属性 | 描述 |
---|---|
url | 请求的地址 |
data | 发送的数据 |
callback | 成功的回调函数 |
type | 返回的数据类型 |
比$.ajax
少了type
属性, 因为方式已经确定
在html
页面中编写:
1 | // ajax--get请求 |
在AjaxServlet
类中编写get
请求处理方法:
1 | protected void jQueryGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { |
输出结果为:
$.post方法
函数调用的属性与get
一模一样, 直接贴出代码:
1 | // ajax--post请求 |
1 | protected void jQueryPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { |
输出结果为:
$.getJSON
方法
通过 GET 请求载入 JSON 数据
本质上就是
$.get
方法中的dataType
属性被固定成json
属性 | 描述 |
---|---|
url | 请求的地址 |
data | 发送的数据 |
callback | 成功的回调函数 |
直接贴代码:
1 | // ajax--getJson请求 |
1 | protected void jQueryGetJson(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { |
输出结果为:
serialize()
方法
可以把表单中所有表单项的内容都获取到, 并以 name=value&name=value 的形式进行拼接.
首先创建一个表单:
1 | <form id="form01"> |
表单效果为:
之前的做法是将整个表单都提交, 现在只需要提交键值即可.
在按钮的单击事件中添加:
1 | alert($("#form01").serialize()); |
然后随便填写表单, 输出结果为:
已经获取参数并拼接好.
修改客户端代码将所有参数都发给服务器:
1 | $.getJSON( |
然后在服务器端接收:
1 | protected void jQuerySerialize(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { |
随便填写表单, 输出为:
i18n
国际化三要素: