Filter+Ajax
Filter是什么—过滤器
1、是Java Web 三大组件之一(Servlet 程序+Listener+Filter)
2、是Java EE规范,即接口
3、作用:拦截请求、过滤响应
场景:
1、权限检查
2、日记操作
3、事务管理
……等等
初体验:
Filter 过滤器的使用步骤:
- 编写一个类去实现 Filter 接口
- 实现过滤方法 doFilter()
- 到 web.xml 中去配置 Filter 的拦截路径
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpservletRequest = (HttpServletRequest) servletRequest;
HttpSession session = httpservletRequest.getSession();
Object user = session.getAttribute("user");//从数据域拿那边存好的user
//如果为null,说明还没有登录
if(user == null){
servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
return;
}else{//登录成功
//让程序继续往下,访问用户的目标资源
filterChain.doFilter(servletRequest,servletResponse);
//已经有权限了,但是不知道要查询啥内容、啥文件
}
}
意思就是:先检查一遍,如果检查通过了再继续往下走。
如若不合格,就跳转到指定界面(比如强制要求登录:这里就是login.jsp)
xml的小变化:
<!--filter 标签用于配置一个 Filter 过滤器-->
<filter>
<!--给 filter 起一个别名-->
<filter-name>AdminFilter</filter-name>
<!--配置 filter 的全类名-->
<filter-class>com.lyp.AdminFilter</filter-class>
</filter>
<!--filter-mapping 配置 Filter 过滤器的拦截路径-->
<filter-mapping>
<!--filter-name 表示当前的拦截路径给哪个 filter 使用-->
<filter-name>AdminFilter</filter-name>
<!--url-pattern 配置拦截路径
/ 表示请求地址为:http://ip:port/工程路径/ 映射到 IDEA 的 web 目录
/admin/* 表示请求地址为:http://ip:port/工程路径/admin/*
-->
<url-pattern>/admin/*</url-pattern>
</filter-mapping>
完整的用户登录
Filter生命周期
Filter 的生命周期包含几个方法
1、构造器方法
2、init 初始化方法
第 1,2 步,在 web 工程启动的时候执行(Filter 已经创建)
3、doFilter 过滤方法
第 3 步,每次拦截到请求,就会执行
4、destroy 销毁
第 4 步,停止 web 工程的时候,就会执行(停止 web 工程,也会销毁 Filter
FilterConfig类
FilterConfig 类见名知义,它是 Filter 过滤器的配置文件类。
Tomcat 每次创建 Filter 的时候,也会同时创建一个 FilterConfig 类,这里包含了 Filter 配置文件的配置信息。
FilterConfig 类的作用是获取 filter 过滤器的配置内容
1、获取 Filter 的名称 filter-name 的内容
2、获取在 Filter 中配置的 init-param 初始化参数
3、获取 ServletContext 对
<!--filter 标签用于配置一个 Filter 过滤器-->
<filter>
<!--给 filter 起一个别名-->
<filter-name>AdminFilter</filter-name>
<!--配置 filter 的全类名-->
<filter-class>com.atguigu.filter.AdminFilter</filter-class>
<init-param>
<param-name>username</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost3306/test</param-value>
</init-param>
</filter>
多个过滤器的整体
Filter 的拦截路径
什么是Json
JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。JSON
采用完全独立于语言的文本格式,而且很多语言都提供了对 json 的支持(包括 C, C++, C#, Java, JavaScript, Perl, Python
等)。 这样就使得 JSON 成为理想的数据交换格式。
json 是一种轻量级的数据交换格式。
轻量级指的是跟 xml 做比较,数据交换指的是客户端和服务器之间业务数据的传递格式。
JSON 在 JavaScript 中的使用。
Json的定义
json的访问
接送本身是一个对象,json中的key,我们可以理解为是对象中的一个属性。
json中的key访问,就跟访问对象的属性一样:json对象.key
json的两个常用方法
json常用对象:
- 对象形式:我们叫他Json对象 一般操作json之中的数据的时候,用对象形式
- 字符串形式:我们把他叫做json字符串 一般要在客户端、服务器之间进行数据交换 的时候,使用json字符串
可以互相转化
对象 字符串
JSON.stringify () <-----> JSON.parse()
// 把 json 对象转换成为 json 字符串
var jsonObjString = JSON.stringify(jsonObj); // 特别像 Java 中对象的 toString
alert(jsonObjString)
// 把 json 字符串。转换成为 json 对象
var jsonObj2 = JSON.parse(jsonObjString);
alert(jsonObj2.key1);// 12
alert(jsonObj2.key2);// ab
JSON在java中使用
记得导包:gson.jar
一般最常用三个:
javaBean 和 json 的
List 和 json
@Test
public void test2() {
List<Person> personList = new ArrayList<>();
personList.add(new Person(1, "国哥"));
personList.add(new Person(2, "康师傅"));
Gson gson = new Gson();
// 把 List 转换为 json 字符串
String personListJsonString = gson.toJson(personList);
System.out.println(personListJsonString);
List<Person> list = gson.fromJson(personListJsonString, new PersonListType().getType());
System.out.println(list);
Person person = list.get(0);
System.out.println(person);
}
map 和 json
// 1.2.3、map 和 json 的互转
@Test
public void test3(){
Map<Integer,Person> personMap = new HashMap<>();
personMap.put(1, new Person(1, "国哥好帅"));
personMap.put(2, new Person(2, "康师傅也好帅"));
Gson gson = new Gson();
// 把 map 集合转换成为 json 字符串
String personMapJsonString = gson.toJson(personMap);
System.out.println(personMapJsonString);
// Map<Integer,Person> personMap2 = gson.fromJson(personMapJsonString, new
PersonMapType().getType());
Map<Integer,Person> personMap2 = gson.fromJson(personMapJsonString, new
TypeToken<HashMap<Integer,Person>>(){}.getType());
System.out.println(personMap2);
Person p = personMap2.get(1);
System.out.println(p);
}
从Json
转换成 常见类型的集合需要:
Gson.jar
包内部提供了一个类:TypeToken
需要手动继承一个这个类的 子类,然后啥也不用干
public class PersonListType extends TypeToken<ArrarList<Person>>{}
Ajax
是什么
AJAX 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种创建交互式网页应用的网页开发
技术。
ajax 是一种浏览器通过 js 异步发起请求,局部更新页面的技术。
Ajax 请求的局部更新,浏览器地址栏不会发生变化
局部更新不会舍弃原来页面的内容
异步:
本质上来说,就是彼此互不干扰,打破了原来线性的阻塞。
原生JS里面的ajax示例
ajax本身也是服务器,也是Servlet
也需要到web.xml
里面配置
<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">
function ajaxRequest() {
// 1、我们首先要创建XMLHttpRequest
var xmlhttprequest = new XMLHttpRequest();
// 2、调用open方法设置请求参数
xmlhttprequest.open("GET","http://localhost:8080/16_json_ajax_i18n/ajaxServlet?action=javaScriptAjax",true);
// 4、在send方法前绑定onreadystatechange事件,处理请求完成后的操作。
xmlhttprequest.onreadystatechange = function (){
if(xmlhttprequest.readyState==4&&xmlhttprequest.status ==200){
var jsonObj = JSON.parse(xmlhttprequest.responseText);
//写在页面上
document.getElementById("div01").innerHTML="编号:"+jsonObj.id+",姓名"+jsonObj.name;
}
}
// 3、调用send方法发送请求
xmlhttprequest.send()
}
</script>
</head>
<body>
<button onclick="ajaxRequest()">ajax request</button>
<div id="div01">
</div>
</body>
jQuery 里面的ajax请求
最常用的五个方法
url 表示请求的地址
type 表示请求的类型 GET 或 POST 请求
data 表示发送给服务器的数据
格式有两种:
一:name=value&name=value
二:{key:value}
success 请求成功,响应的回调函数
dataType 响应的数据类型
常用的数据类型有:
text 表示纯文本
xml 表示 xml 数据
json 表示 json 对象
ajax方法
// ajax请求
$("#ajaxBtn").click(function(){
$.ajax({
url:"http://localhost:8080/16_json_ajax_i18n/ajaxServlet",
data:"action=javaScriptAjax",
type:"GET",
success:function (data){
alert("服务器返回了:"+data);
//var jsonObj = JSON.parse(data);
$("#msg").html("编号:"+data.id + ",姓名:"+data.name);
},
dataType:"json" //这里直接使用json对象更加方便,不用转化
});
alert("ajax btn");
});
get post方法
参数少了个type="GET"
// ajax--get 请求
$("#getBtn").click(function(){
$.get("http://localhost:8080/16_json_ajax_i18n/ajaxServlet","action=jQueryGet",function (data)
{
$("#msg").html(" get 编号:" + data.id + " , 姓名:" + data.name);
},"json");
});
// ajax--post 请求
$("#postBtn").click(function(){
$.post("http://localhost:8080/16_json_ajax_i18n/ajaxServlet","action=jQueryPost",function (data)
{
$("#msg").html(" post 编号:" + data.id + " , 姓名:" + data.name);
},"json");
});
getjson
//ajax-getJson请求
$("#getJSONBtn").click(function(){
$.getJSON("http://localhost:8080/16_json_ajax_i18n/ajaxServlet","action=jQueryGetJSON",function
(data) {
$("#msg").html(" getJSON 编号:" + data.id + " , 姓名:" + data.name);
});
});
表单序列化
// ajax 请求
$("#submit").click(function(){
// 把参数序列化
$.getJSON("http://localhost:8080/16_json_ajax_i18n/ajaxServlet","action=jQuerySerialize&" +
$("#form01").serialize(),function (data) {
$("#msg").html(" Serialize 编号:" + data.id + " , 姓名:" + data.name);
});
});