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
国际化三要素:
