20 SSM——Ajax的使用
引入
在AJAX技术之前,我们使用请求转发或是重定向来不断获取数据,这两种方式都是页面请求(每次请求获取一整个页面),它消耗的资源高。
现在我们使用ajax,ajax技术是正文请求,只更改网页的部分数据而不重新请求一个新的页面,可以使客户端效率更高。
json
我们将服务器需要返回给客服端的数据封装为json对象,便于传输。
一个json对象的格式如下:
json对象中可以包含字符串对象、数组对象、json对象。
{ “name”:“张三”, “skills”:["篮球","游泳"], "department":{ "id""1", "name":"人事部" } }
配置
引入jar包
maven项目中,在pom.xml文件中添加依赖坐标。此依赖用来对非基础数据类型的数据进行格式转化,在使用springmvc的方式返回对象后,会将返回的对象通过此jar包转化为json对象。
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.10.1</version> </dependency>
引入驱动
需要配置驱动才可使用上面的jar包,只需在springMVC的配置文件中添加下面的代码即可。
<!-- 注解驱动:加了它就能解析json --> <mvc:annotation-driven></mvc:annotation-driven>
使用
举个例子,我们验证一个登录网页传来的账号密码是否正确。
在Controller中:
@RequestMapping("login.do") @ResponseBody public JsonResult login(String username,String password) { JsonResult jr = new JsonResult(); if("root".equals(username)) { if("1234".equals(password)) { jr.setState(3);//登陆成功 }else { jr.setState(2);//密码不正确 } }else { jr.setState(1);//用户不存在 } return jr; }
其中的JsonResult是我们自定的一个类,用来封装返回的数据,由于它是非基础数据类型的数据,所以它将通过Jackson-databind.jar转化为json数据返回给客户端。
JsonResult类。
public class JsonResult { private Integer state; public Integer getState() { return state; } public void setState(Integer state) { this.state = state; } }
由于添加了@ResponseBody注解,在不使用ajax接收的情况下,我们将看到类似这样的返回页面:
可以看到java对象转为了json对象
使用AJAX
接下来,我们就使用ajax接收返回的数据。
- 首先,我们先引用jQuery。
- 再对登录页面的登录按钮设置login()方法(登录按钮的type属性改为button),用于ajax的示范。
- 然后使用$.ajax()进行请求与响应的数据接收和处理
下面的$.ajax({..})即ajax的常规固定写法,包含常用的五个参数:
- url:本次请求的url
- type:相当于form标签的method,取值:post,get
- date:向服务器发送的数据,键值对之间使用&拼接,我们可以使用form表单的id来调取各值自动拼接,假设form的id为from-id,则这里可写为:"data":$("#form-id").serialize()
- dateType:返回数据类型,非常重要。相当于content-Type,一般取值有html、text(返回文本)、json(返回json对象)等
- success:值为一个回调函数,只有当响应200状态码也就是成功时,才回执行回调函数。该函数的参数为服务器返回的数据对象,参数名可自定义。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script type="text/javascript" src="jquery-2.1.3.min.js"></script> <script type="text/javascript"> function login(){ let username = $("#username").val(); let password = $("#password").val(); $.ajax({ "url":"login.do", "type":"post", "data":"username="+username+"&password="+password,//推荐:“data”:$("#form-id").serialize(),但标签的name值需要与接收的对象属性保持一致 "dataType":"json", "success":function(result){//这里的result对象即为刚才的JsonResult被转为Json后的对象。 if(result.state==1){ alert("用户不存在"); }else if(result.state==2){ alert("密码错误"); }else{ alert("登陆成功"); } } }) } </script> </head> <body> <form id="form-id" action="login.do" method="post"> <table> <tr> <td>用户名:</td> <td><input type="text" id="username" name="username"></td> </tr> <tr> <td>密码:</td> <td><input type="text" id="password" name="password"></td> </tr> <tr> <td><input type="button" value="登录" onclick="login()"/></td> </tr> </table> </form> </body> </html>
演示