全名:Asynchronous Javasrcript and xml
也就是说,它是异步的javascript 与 xml
下面说一下异步与同步
AJAX就是一种无需重新加载整个网页的情况下,能够更新部分网页的技术
AJAX利用一个构建到所有现代浏览器内部的对象-XMLHttpRequest-来实现发送和接收HTTP请求与响应信息。可以通过window.XMLHttpRequest对象来判断这个对象是否存在,现在的浏览器基本上都会存在这样一个名叫XMLHttpRequest对象,在最早的IE里面他叫ActiveHttpRequest对象。
这个对象可以去设置是以同步还是异步的方式来发送这个请求。
怎么来实现ajax这样一个过程这里可以参考w3school手册,下面来简要的说一说
现在我们要通过前端页面去访问一个servlet并传入一个参数过去
稍微看一下目录结构
先来一个前端页面
demo1.html
Title
再来看servlet页面
AjaxServlet1.java
package pxx.web.servlet; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/ajaxServlet1") public class AjaxServlet1 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //通过ajax来访问到了一下这个页面 //直接可以来拿到参数 String name = request.getParameter("name"); //在服务器打印一下这个名字 System.out.println("名字是:" + name); //这里给客户端做出响应 response.getWriter().write("你好 " + name); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } }
上面就会在服务器打印一个名字:
上面就是利用ajax向服务器发送了一个请求,那么我们如何来看异步与同步的情况呢?
我们把服务器Servlet的代码重新修改一下
package pxx.web.servlet; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/ajaxServlet1") public class AjaxServlet1 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //通过ajax来访问到了一下这个页面 //直接可以来拿到参数 String name = request.getParameter("name"); //在这个位置让服务器停几秒 try { Thread.sleep(6000); } catch (InterruptedException e) { e.printStackTrace(); } //在服务器打印一下这个名字 System.out.println("名字是:" + name); //这里给客户端做出响应 response.getWriter().write("你好 " + name); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } }
中间我们让服务器页面停留了几秒,也就是让这个程序没有处理完毕,如果前端页面按照同步的方式发送数据,那么就会出现必须等待这个程序执行完之后,才可以执行其他操作,下面我们分别写一个同步与异步处理的按钮,分别看一下什么情况
demo1.html
Title
前端页面展示如下:
如果我们点发送异步请求,右边的输入框是可以持续输入的
如果我们点同步发送请求,右边的输入框在服务器的页面没有处理完之前是不能输入的
上面重点说了一下如何发送请求,与同步、异步的一个展示问题,下面我们还要去处理服务器给我们响应的结果啊,这个也可以去查手册找到对应的方法
看一下这个readState状态码
我们来改善一下代码
Title
运行结果:
如何用jquery的方式来实现ajax
先来查一下手册
下面说一下$.ajax、$.get、$.post的用法
$.ajax
Title
$.get
Title
$.post
json的数据格式Title
什么是json呢
全称就是 javascript object notation,也就是说它是javascript的对象表示法
json主要是用于存储、交换、传输文本信息,它有点类似于XML,但是比XML更快、更小、更容易解析
说一下json的语法格式
话不多说,直接上代码
如何获取json数据Title
话不多说,直接上代码
JSON数据的遍历Title
其实直接采用for in循环就可以了
json数据和java对象相互转换Title
先来看一下json的常见解析器:
Jsonlib、fastjson、jackson等等这些包
下面我们要用到的就是jackson这个包
先来说将Java对象转为json字符串数据
这里来说一下它的步骤
1.导入Jackson的相关jar包
2.创建jackson的核心对象ObjectMapper
3.调用ObjectMapper的相关方法进行转换
这里来说一下ObjectMapper中的核心方法
现在来说一下上面两个方法,第一个writeValue这个方法是做了一个重载,如下: 也就是说这个参数1有三种类型可选,基本就是说把这个对象的数据传入到参数1指定的某一个文件当中。
第二个方法就是直接把java对象变成json字符串形式。
下面来看一个简单的转换形式
先来看一个对象Person
package pxx.domain; public class Person { private String name; private int age; private String gender; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } @Override public String toString() { return "Person{" + "name='" + name + ''' + ", age=" + age + ", gender='" + gender + ''' + '}'; } }
然后写一个Jackson测试类
JacksonTest.java
package pxx.test; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.Test; import pxx.domain.Person; import java.io.File; import java.io.FileOutputStream; import java.io.FileWriter; public class JacksonTest { //java对象转为json字符串 @Test public void test1() throws Exception { //创建一个java对象 Person p = new Person(); p.setAge(20); p.setGender("男"); p.setName("张哈哈"); //创建jackson核心对象 ObjectMapper objectMapper = new ObjectMapper(); //直接利用writeValueAsString()方法把对象变成json字符串 String res = objectMapper.writeValueAsString(p); //会向这个文件写入内容,把writeValue这几个重载的方法都调用一下 objectMapper.writeValue(new File("D://a.txt"),p); objectMapper.writeValue(new FileWriter("D://a1.txt"),p); objectMapper.writeValue(new FileOutputStream("D://a2.txt"),p); System.out.println(res); } }
先来看控制台的运行结果
再去看这几个文件
这几个文件都是如下:
下面说一下注解的使用,假如我们在开发过程中,我们不想去转换某个属性或者说,我想把这个属性按照一个好看的格式打印出来,那么就要用到如下两个注解
比如上面代码做一些修改
给gender添加了一个@JsonIgnore注解,就表示忽略这个属性,那么打印的时候,就会忽略
在来看@JsonFormat,还是把这个Person做一些修改,添加一个birthday属性,并且为其指定打印格式
我们想要按照我们想要的格式进行打印,先设置
然后打印
下面说一下集合java对象转成JSON数据怎么转
先看List集合对象
package pxx.test; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.Test; import pxx.domain.Person; import java.io.File; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.Date; import java.util.List; public class JacksonTest { //java对象转为json字符串 @Test public void test1() throws Exception { //创建一个java对象 Person p = new Person(); p.setAge(20); p.setGender("男"); p.setName("张哈哈"); p.setBirthday(new Date()); //创建jackson核心对象 ObjectMapper objectMapper = new ObjectMapper(); //直接利用writeValueAsString()方法把对象变成json字符串 String res = objectMapper.writeValueAsString(p); //会向这个文件写入内容,把writeValue这几个重载的方法都调用一下 objectMapper.writeValue(new File("D://a.txt"),p); objectMapper.writeValue(new FileWriter("D://a1.txt"),p); objectMapper.writeValue(new FileOutputStream("D://a2.txt"),p); System.out.println(res); } @Test public void test2() throws IOException { //我们先做两个对象,然后放到集合里 //创建一个java对象 Person p1 = new Person(); p1.setAge(20); p1.setGender("男"); p1.setName("张哈哈"); p1.setBirthday(new Date()); //创建一个java对象 Person p2 = new Person(); p2.setAge(20); p2.setGender("男"); p2.setName("张哈哈"); p2.setBirthday(new Date()); Listlist =new ArrayList (); list.add(p1); list.add(p2); //创建json核心对象 ObjectMapper objectMapper = new ObjectMapper(); //变成json对象,然后输出到文件里面 objectMapper.writeValue(new File("D://b.txt"),list); //直接打印到控制台 String str = objectMapper.writeValueAsString(list); System.out.println(str); } }
运行结果:
文件里面去看看
上面就明显会把List集合对象中的数据变成一个数组的形式存放
再来看一下map集合
package pxx.test; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.Test; import pxx.domain.Person; import java.io.File; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.util.*; public class JacksonTest { //java对象转为json字符串 @Test public void test1() throws Exception { //创建一个java对象 Person p = new Person(); p.setAge(20); p.setGender("男"); p.setName("张哈哈"); p.setBirthday(new Date()); //创建jackson核心对象 ObjectMapper objectMapper = new ObjectMapper(); //直接利用writeValueAsString()方法把对象变成json字符串 String res = objectMapper.writeValueAsString(p); //会向这个文件写入内容,把writeValue这几个重载的方法都调用一下 objectMapper.writeValue(new File("D://a.txt"),p); objectMapper.writeValue(new FileWriter("D://a1.txt"),p); objectMapper.writeValue(new FileOutputStream("D://a2.txt"),p); System.out.println(res); } @Test public void test2() throws IOException { //我们先做两个对象,然后放到集合里 //创建一个java对象 Person p1 = new Person(); p1.setAge(20); p1.setGender("男"); p1.setName("张哈哈"); p1.setBirthday(new Date()); //创建一个java对象 Person p2 = new Person(); p2.setAge(20); p2.setGender("男"); p2.setName("张哈哈"); p2.setBirthday(new Date()); Listlist =new ArrayList (); list.add(p1); list.add(p2); //创建json核心对象 ObjectMapper objectMapper = new ObjectMapper(); //变成json对象,然后输出到文件里面 objectMapper.writeValue(new File("D://b.txt"),list); //直接打印到控制台 String str = objectMapper.writeValueAsString(list); System.out.println(str); } @Test public void test3() throws JsonProcessingException { //Map集合直接整成键值对 //1.创建map对象 Map map = new HashMap (); map.put("name","王大麦子"); map.put("age",520); map.put("gender","男"); //2.转换 ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(map); System.out.println(json); } }
运行结果:
下面简要说一下,json数据对象怎么变成java对象
1. 还是导入json的包
2.创建核心对象ObjectMapper对象
3.调用方法readValue(json字符串数据,类的Class对象)
话不多说,直接上代码
package pxx.test; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.Test; import pxx.domain.Person; import java.io.File; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.util.*; public class JacksonTest { //java对象转为json字符串 @Test public void test1() throws Exception { //创建一个java对象 Person p = new Person(); p.setAge(20); p.setGender("男"); p.setName("张哈哈"); p.setBirthday(new Date()); //创建jackson核心对象 ObjectMapper objectMapper = new ObjectMapper(); //直接利用writeValueAsString()方法把对象变成json字符串 String res = objectMapper.writeValueAsString(p); //会向这个文件写入内容,把writeValue这几个重载的方法都调用一下 objectMapper.writeValue(new File("D://a.txt"),p); objectMapper.writeValue(new FileWriter("D://a1.txt"),p); objectMapper.writeValue(new FileOutputStream("D://a2.txt"),p); System.out.println(res); } @Test public void test2() throws IOException { //我们先做两个对象,然后放到集合里 //创建一个java对象 Person p1 = new Person(); p1.setAge(20); p1.setGender("男"); p1.setName("张哈哈"); p1.setBirthday(new Date()); //创建一个java对象 Person p2 = new Person(); p2.setAge(20); p2.setGender("男"); p2.setName("张哈哈"); p2.setBirthday(new Date()); Listlist =new ArrayList (); list.add(p1); list.add(p2); //创建json核心对象 ObjectMapper objectMapper = new ObjectMapper(); //变成json对象,然后输出到文件里面 objectMapper.writeValue(new File("D://b.txt"),list); //直接打印到控制台 String str = objectMapper.writeValueAsString(list); System.out.println(str); } @Test public void test3() throws JsonProcessingException { //Map集合直接整成键值对 //1.创建map对象 Map map = new HashMap (); map.put("name","王大麦子"); map.put("age",520); map.put("gender","男"); //2.转换 ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(map); System.out.println(json); } //JSON数据变成java对象 @Test public void test4() throws IOException { //先来看json数据 String json = "{"gender":"男","name":"张三","age":23}"; ObjectMapper objectMapper = new ObjectMapper(); Person person = objectMapper.readValue(json,Person.class); System.out.println(person); } }
运行结果:
验证用户名是否存在的实际案例先来看一下百度的这个注册页面
当我输入一个用户名,它就会发送一个ajax的请求呢, 也就是说,他会对页面进行部分刷新,因为要去请求服务器。OK,那么他就会去判断你这个用户名是否存在数据库当中,如果说,你这个用户名存在,那么当鼠标失去焦点的时候,就会提示如下信息
那么如果可以用,就不会提示
那么,我还想说一点,上面服务器给我们返回的是不是一个键呢,json数据格式,然后客户端就会去根据这个键值来进行一个判断,比如百度这个键值就是下面这个
存在就是1,不存在就是0
上面就说明了一下大致的逻辑步骤,下面直接上代码
先看一个前端注册页面register.html
Title
然后再去看服务器页面FindUserServlet.java
package pxx.web.servlet; import com.fasterxml.jackson.databind.ObjectMapper; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.HashMap; import java.util.Map; @WebServlet("/findUserServlet") public class FindUserServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("application/json;charset=utf-8"); //还是拿到参数,同过ajax进行的一个异步请求 String username = request.getParameter("username"); //这里做一个map集合,存放数据,等会也方便我们把map集合变成json数据发送给客户端 Mapmap = new HashMap (); //然后这里就去连接数据库,查询用户存在否,那么这里我就模拟好了 if("pxx".equals(username)) { //用户存在,这个键为true map.put("userExsit",true); //提示一个信息 map.put("userInfo","用户已存在"); } else { map.put("userExsit",false); map.put("userInfo","恭喜"); } //将map对象转为json数据格式传给客户端 ObjectMapper objectMapper = new ObjectMapper(); objectMapper.writeValue(response.getWriter(),map); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } }
运行结果:
我这里是除了pxx之外,都可以注册
输入pxx
好了,说到这