处理AJAX
1. 实例
- 下载jQuery
在网上下载jquery.js添加到js包中
- 编写html文件ajax.xml并引用jQuery库
<html>
<head>
<title>处理ajax</title>
<script src="${pageContext.request.contextPath}/js/jquery.js">
</script>
<script>
$(function () {
$('#btn').click(function () {
$.post('${pageContext.request.contextPath}/ajax/test1',function (data) {
console.log(data);
})
})
})
</script>
</head>
<body>
<button id="btn">发送AJAX请求</button>
</body>
</html>
注意:$('#btn')
不要忘了写#
- Controller
新建一个文件夹ajax,并添加AjaxController.java
@Controller
@RequestMapping("/ajax")
public class AjaxController {
@RequestMapping("/test1")
public void test1(HttpServletResponse response) throws IOException {
response.getWriter().write("success");
}
@RequestMapping("/test2")
@ResponseBody //将返回值写到返回体中,并不是跳转视图
public String test2(){
return "success2";
}
}
- 运行
运行后,无论url是/test1
还是/test2
,控制台都会报错
作为一个小白的我,以为是jQuery库有问题,就换了好几个版本的jQuery库都不行。难道是我jquery方法写错了?于是又耗费了好久都没解决问题。崩溃
就在网上漫无目的的查找出错原因,我突然意识到是不是AjaxController
中的注解没有生效。
果然,我新建了一个包ajax,但是并没有把这个包添加进核心配置xml文件中
于是在springmvc.xml中把这个包给加上<context:component-scan base-package="controller,ajax"/>
,果然问题就解决了。
2. @ResponseBody
观察test1和test2,test2使用了@ResponseBody
注解,比test1简单多了
-
@ResponseBody
一般是作用在方法上的,加上该注解表示该方法的返回结果直接写到Httpresponse Body中,常用在ajax异步请求中, -
在RequestMapping中return返回值默认解析为跳转路径,如果你此时想让Controller返回一个字符串或者对象到前台 就会报404 not response的错误。
-
当加上
@ResponseBody
注解后不会解析成跳转地址,会解析成相应的json格式的对象、集合、字符串或者xml等直接返回给前台,可以通过 ajax 的“success”:fucntion(data){} data直接获取到
3. 返回JSON
如果ResponseBody中的数据为自定义类型的数据,则需要通过适当的HttpMessageConverter将其转换为指定格式后(如:json格式),写入到Response对象的body数据区。
返回JSON格式的三种方式
- jackson,SpringMVC默认支持
- gson,SpringMVC默认支持,google开发
- fastjson,SpringMVC默认不支持,alibaba开发
3.1 使用jackson
步骤一:添加jar包
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
步骤二:配置消息转换器
由于SpringMVC默认支持jackson,所以消息转换器可以不用配置
如果需要配置的话,需要在核心配置文件springmvc.xml中添加如下代码:
<!--mvc的注解驱动,用来简化配置,默认会加载内置的类型转换器-->
<mvc:annotation-driven conversion-service="conversionService">
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
</mvc:message-converters>
</mvc:annotation-driven>
步骤三:测试
自定义一个User类,并通过@ResponseBody
写入Httpresponse Body中
- User类
public class User {
private String name;
private Integer age;
...
}
- AjaxController中添加测试方法
@RequestMapping("/showUser")
@ResponseBody
public User showUser(){
User user = new User("wql", 20);
return user;
}
- jsp页面不要忘了修改url路径
<script>
$(function () {
$('#btn').click(function () {
$.post('${pageContext.request.contextPath}/ajax/showUser',function (data) {
console.log(data);
})
})
})
</script>
测试结果如下:
3.2 使用gson
gson的使用与jackson使用类似
步骤一:添加jar包
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
步骤二:配置消息转换器
由于SpringMVC默认支持gson,所以消息转换器也不用配。
如果需要配置的话,在核心配置文件里加入如下代码
<!--mvc的注解驱动,用来简化配置,默认会加载内置的类型转换器-->
<mvc:annotation-driven conversion-service="conversionService">
<mvc:message-converters>
<!-- <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>-->
<bean class="org.springframework.http.converter.json.GsonHttpMessageConverter"/>
</mvc:message-converters>
</mvc:annotation-driven>
3.3 使用fastjson
fastjson是阿里公司提供的,SpringMVC对其不是默认支持的,所以需要配置消息转换器。步骤同上
步骤一:添加jar包
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.58</version>
</dependency>
步骤二:配置消息转换器
使用fastjson必须要配置消息转换器
<mvc:annotation-driven conversion-service="conversionService">
<mvc:message-converters>
<!-- <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>-->
<!-- <bean class="org.springframework.http.converter.json.GsonHttpMessageConverter"/>-->
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="supportedMediaTypes" value="application/json"/>
</bean>
</mvc:message-converters>