Filter、JSON、AJAX
JavaWeb--Filter过滤器
FIlter是JavaWeb的三大组件之一,它的主要作用是拦截请求,他是JavaEE的规范,是一个接口。
Filter的定义
<filter> <!--Filter的别名--> <filter-name>LoginFilter</filter-name> <!--Filter的路径--> <filter-class>xwl.com.Filter.LoginFilter</filter-class> </filter> <!--配置Filter的拦截路径--> <filter-mapping> <!--表示当前的拦截路径由哪个filter-name代表的过滤器拦截--> <filter-name>LoginFilter</filter-name> <!--拦截路径 / 表示web目录下 --> <!--表示拦截访问user目录下所有资源的请求--> <url-pattern>/user/*</url-pattern> </filter-mapping>
FIlter的生命周期
public class LoginFilter implements Filter { public LoginFilter() { System.out.println("Filter的构造器方法"); } @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("Filter的初始化方法"); Filter.super.init(filterConfig); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("Filter的doFilter方法"); System.out.println("线程名 :" +Thread.currentThread().getName()); // Filter链中所有filter都公用一个request HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; Object username = httpServletRequest.getSession().getAttribute("username"); servletRequest.setAttribute("username",username); if (username == null){ servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse); }else { // filterChain.doFilter这个方法是用来指示过滤器通过后的操作 // 如果后面还有过滤器就会执行下一个过滤器,没有就会执行用户请求的资源 filterChain.doFilter(servletRequest,servletResponse); } } @Override public void destroy() { System.out.println("Filter的的story方法,服务器关闭时调用"); Filter.super.destroy(); } }
在FIlter的doFilter方法中最重要的是这句filterChain.doFilter,它是用来放行去请求访问的目标资源的或者去往这个请求所请求的下一个过滤器
过滤器链
多个过滤器可以针对某一个资源做多个多滤器来拦截访问请求,在这个过程中,所有过滤器和目标资源都是在同一线程下工作,并且共用一个request对象。
Filter的三种配置方式
一种是指定目标拦截
<filter-mapping> <filter-name>LoginFilter1</filter-name> <!--根据类型拦截请求,Filter不管会不会有这个页面资源存在,只管请求资源的后缀,有就会调用过滤器,类型拦截别加 / --> <url-pattern>a.jsp</url-pattern> </filter-mapping>
一种是拦截指定后缀,这个路径设置时不加 /
<filter-mapping> <filter-name>LoginFilterDxx</filter-name> <!--根据类型拦截请求,Filter不管会不会有这个页面资源存在,只管请求资源的后缀,有就会调用过滤器,类型拦截别加 / --> <url-pattern>*.html</url-pattern> </filter-mapping>
一种是拦截目录下的资源请求
<filter-mapping> <filter-name>LoginFilter1</filter-name> <!--根据类型拦截请求,Filter不管会不会有这个页面资源存在,只管请求资源的后缀,有就会调用过滤器,类型拦截别加 / --> <url-pattern>/user/*</url-pattern> </filter-mapping>
JSON
json全称是JavaScript Object Notation,是一种轻量级的数据交换格式
轻量级是指和xml文件比较是轻量级
数据交换是在客户端和服务器之间进行的数据交换传递格式
JSON在HTML页面的定义使用
<script type="text/javascript"> //script中定义json //json中的数据就像键值对一样对应起来表示赋值关系 //json中可以定义多个变量属性,值也可以是多种类型,变量之间用 , 隔开 //json中的变量里也能加入json对象 var jsonObject = { "json1" : 12, "json2" : "123dsa", "json3" : "a", "json4" : true, "json5" : [ 12,"121","opoopo" ], "json6" : { "json6-1" : "hello", "json6-2" : 123 }, "json7" : [ { "json6-1" : "hello", "json6-2" : "world" },{ "json6-1" : "hello", "json6-2" : 1 } ] }; alert("hahahaahh") alert(jsonObject.json1) alert(jsonObject.json2) alert(jsonObject.json3) alert(jsonObject.json4) alert(jsonObject.json5) alert(jsonObject.json6) for (var i = 0; i < jsonObject.json7.length; i++) { alert(jsonObject.json7[i]) } //json是一个对象 //取出json中定义的数据可以用 . 取出 //如果想取出json中定义的数组里面的元素可以使用操作数组思想,具体告诉成需要操作的数组对象的下标,再通过 . 取出给数组元素中的值 //通过输出发现json中的数组中的元素都是object类型的,就能通过操作object类型的方法进行操作 alert(jsonObject.json6["json6-1"]) alert(jsonObject.json6["json6-2"]) alert(jsonObject.json7[0]) var json7Element = jsonObject.json7[0]; alert(json7Element["json6-1"]) alert(json7Element["json6-2"]) var json7Element1 = jsonObject.json7[1]; alert(json7Element1["json6-2"]) alert(json7Element1["json6-1"]) </script>
JSON在java类中的使用
首先要导包【gson-2.8.5.jar】
使用
public void changeToJavaBean(){ User user = new User(1,"Ms_jin"); User user2 = new User(2,"Ms_qin"); Gson gson = new Gson(); // toJson能将任意数值类型转换成json字符串类型 String s = gson.toJson(user); String s1 = gson.toJson(user2); System.out.println(s1); System.out.println(s); // fromJson方法能将json字符串转换成指定类型,这个方法有两个参数,第一个是将要转换的json数值类型,第二个参数是json数值将要转换的数据类型 User user1 = gson.fromJson(s, User.class); System.out.println(user1); } public void changeToList(){ List<User> userList = new ArrayList<>(); userList.add(new User(1,"Mr_jin")); userList.add(new User(2,"Mr_qin")); Gson gson = new Gson(); // 使用toJson方法将list数据类型转换成json字符串后发现输出的是字符串数组 String s = gson.toJson(userList); System.out.println(s); // 在实际开发过程中不能总是频繁的建类来实现数据转换,可以直接通过匿名内部类的形式实现 // 直接使用TypeToken类的实例并将想要转换的类型< 参数 >,后面加上大括号,实现getType方法 Object o = gson.fromJson(s, new TypeToken<ArrayList <User>>(){}.getType()); System.out.println(o); } public void changeToMap(){ Map<Integer,User> userMap = new HashMap<>(); userMap.put(1,new User(1,"Ms_jin")); userMap.put(2,new User(2,"Mr_qin")); Gson gson = new Gson(); String s = gson.toJson(userMap); System.out.println(s); // 在将Json数据转换成list数据时发现此时转换回去的并不是list类型而是map类型会报错 // 而且当想将数据类型转换成泛型时就不能像操作javabean那样直接转换 // 此时就需要用到TypeToken这个类,使用时只要建立一个类继承他,然后在中写入TypeToken<想要转换的目标类型< 参数 >(JavaBean类型)> // 然后在fromJson的第二个参数处创建这个类的实例,并记得调用getType(),因为这个参数需要的时type(Type typeOft)类型不是实例对象 Object o = gson.fromJson(s, new UtilChangeMap().getType()); System.out.println(o); }
AJAX
Ajax是一种浏览器通过js发送异步请求实现页面的局部更新的技术 局部 就是Ajax请求发送后只修改页面部分内容,不会更改整个页面内容 异步请求 就是页面中Ajax内容之后的元素执行速度并不受Ajax请求的影响 当修改了open的最后一个参数为false,Ajax请求会变成同步请求,后面代码执行就会受到Ajax的代码的影响,他不执行后面的就不能执行
用之前一些问题,首先要创建一个文件夹,不然有些文件图片、jquery文件找不到,然后把文件分开装好,然后再进行请求,不然就会报错,不要让资源文件赤裸在外面要装到文件夹里
AJAX的使用
<script type="text/javascript" src="../jquery/jquery-3.6.0.js"></script>
<script type="text/javascript">
function ajaxRequest() {
//首先创建XMLHttpRequest
var ajaxrequest = new XMLHttpRequest;
//调用open方法,有method、url、是否是异步请求三个参数
ajaxrequest.open("GET", "http://localhost:8080/Summerbook/ajaxServlet?action=ajaxHttp", true)
//在send方法前绑定onreadstatuschange函数,经过对status响应码和readyStatus的值的判断,判断响应的状态是否执行
ajaxrequest.onreadystatechange = function () {
if (ajaxrequest.status == 200 && ajaxrequest.readyState == 4) {
var innerHTML = JSON.parse(ajaxrequest.responseText);
document.getElementById("ajax01div").innerHTML = "用户号:" + innerHTML.id + ",用户名: " + innerHTML.username
}
}
//send()方法发送请求
ajaxrequest.send()
}
function AjaxClick() {
$.ajax({
// 请求地址
url: "http://localhost:8080/Summerbook/ajaxServlet",
//参数
// data: "action=ajaxHttpfunc",
data: {action: "ajaxHttpfunc"},
//设置请求方法
type: "GET",
//响应成功回调函数
success: function (data) {
$("#ajax01div").html("ajax 用户号:" + data.id + ",用户名: " + data.username)
},
//设置返回参数类型
dataType: "json"
})
}
//get方法中有四个参数,url是请求的地址,data是参数,callback是请求成功后的回调函数,type是返回参数的类型
function getClick() {
$.get("http://localhost:8080/Summerbook/ajaxServlet", "action=getAjaxHttpFunc", function (data) {
$("#ajax01div").html("GET 用户号:" + data.id + ",用户名: " + data.username)
}, "json")
}
function postClick() {
$.post("http://localhost:8080/Summerbook/ajaxServlet", "action=postAjaxHttpFunc", function (data) {
$("#ajax01div").html("Post 用户号:" + data.id + ",用户名: " + data.username)
}, "json")
}
//getJSON有三个参数,url表示请求地址,callback是请求成功后回调函数,data表示参数
function JSONClick() {
$.getJSON("http://localhost:8080/Summerbook/ajaxServlet", "action=JSONAjaxHttpFunc", function (data) {
$("#ajax01div").html("JSON 用户号:" + data.id + ",用户名: " + data.username)
})
}
//serialize方法能够将表单中的信息转换成key:value形式的字符串
function serialize(){
$.getJSON("http://localhost:8080/Summerbook/ajaxServlet", "action=serializeAjaxHttpFunc&",function (data){
alert($("#form1").serialize())
$("#ajax01div").html("serializeAjaxHttpFunc 用户号:" + data.id + ",用户名: " + data.username)
})
}
</script>
AJAX在Java文件中使用
public void ajaxHttp(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("ajax请求发送过来了"); User user = new User(1,"Ms_jin"); Gson gson = new Gson(); String s = gson.toJson(user); resp.getWriter().write(s); }
将JavaBean中的数据转换为json对象,再进行响应输出,页面接收到相应参数,就会执行回调函数执行相应的语句

浙公网安备 33010602011771号