Spring MVC 处理 ajax请求
这儿 记录 ajax请求的情况,主要涉及到Spring MVC的两个注解 @RequestBody 和 @ResponseBody
1.@RequestBody 注解
如果get或post请求中 参数是 application/x-www-form-urlencoded编码方式,@RequestBody 可以处理;如果参数是application/json,application/xml等 格式的数据,必须使用@RequestBody来处理。
2.@ResponseBody 表示该方法的返回结果直接写入HTTP response body中
Spring MVC项目中 使用@RequestMapping后,方法返回结果通常解析为跳转路径。 加上@ResponseBody后,方法返回结果不会被解析为跳转路径,而是直接写入Http repsonse body中。所以说@ResponseBody注解一般用在异步获取数据时使用, 比如异步获取json数据,加上@responsebody后,会直接返回json数据。
3.例子,如下 ajax请求 提交传递数据是application/json格式,所以controller方法中用@RequestBody注解来接收参数
.jsp文件 ajax请求提交
<html>
<body>
<form>
<div>
<input type="button" onclick="ajaxSubmit()" value="ajaxSubmit" />
</div>
</form>
<script type="text/javascript">
//创建 XMLHttpRequest 对象
var xmlHttp;
function createXMLHttpRequest() {
if (window.XMLHttpRequest) { // code for all new browsers
xmlHttp = new XMLHttpRequest();
} else if (window.ActiveXObject) { // code for IE5 and IE6
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
console.log("xmlHttp===", xmlHttp);
}
function ajaxSubmit() {
//创建 XMLHttpRequest 对象
createXMLHttpRequest();
//需要传到后台的参数,json对象
var jsonData = {
name : 'no name',
tel : 18355556666,
psw : 123456
};
//把json对象转为字符串
var strJsonData = JSON.stringify(jsonData);
console.log("jsonData", jsonData);
//mapping 到 controller 中 方法上
var url = "/SpringMVCDemo/ajax/ajaxSubmit"; //重要:这个要加/
//接收返回值
xmlHttp.onreadystatechange = function() {
if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
console.log("xmlHttp.responseText==",xmlHttp.responseText);
var json = JSON.parse(xmlHttp.responseText); //把字符串转为json对象
console.log("json.result==",json.result); //通过key值 获取json对象的value值
}
}
//以post方法提交参数
xmlHttp.open("POST", url, true);
xmlHttp.send(strJsonData);
}
</script>
</body>
</html>
java文件 用 @ResponseBody返回数据 @RequestBody接收数据
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletResponse;
import org.json.JSONObject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("ajax")
public class AjaxController {
@ResponseBody
@RequestMapping(value = "/ajaxSubmit", method = RequestMethod.POST)
public String ajaxSubmit(@RequestBody String strData) throws IOException {
System.out.println("ajaxSubmitForm 收到的参数 strData==" + strData);
// 把string类型的参数 转为 jsonObject对象
JSONObject jsonObject = new JSONObject(strData);
System.out.println("jsonObject====" + jsonObject.toString());
// 根据key值获取value值
System.out.println("tel===" + jsonObject.getLong("tel"));
// retrun data
JSONObject json = new JSONObject();
json.put("result", "@ResponseBody test success");
json.put("remark", "so happy @ResponseBody works!");
return json.toString();
}
//或者用HttpServletResponse返回数据
@RequestMapping(value = "/ajaxSubmit2", method = RequestMethod.POST)
public String ajaxSubmit2(@RequestBody String strData, HttpServletResponse response) throws IOException {
System.out.println("ajaxSubmitForm 收到的参数 strData==" + strData);
// retrun data
JSONObject json = new JSONObject();
json.put("result", "success");
json.put("remark", "can tranfer data ");
PrintWriter writer = response.getWriter();
response.setContentType("application/json;charset=utf-8");
writer.print(json.toString());
writer.close();
return null;
}
}
其实点击ajaxSubmit请求,其实它的请求方式,请求头,请求体如下。