直接上 我的 纯Js 的Ajax代码
function callBackPost() {
var url="/PaiLeN/user/logA";
if (xmlHttp==null) {
xmlHttp = createXMLHttpRequest();
}
xmlHttp.onreadystatechange=processRequestPost;
xmlHttp.open("POST",url,true);
//var data="{uname:'papa',pwd:'19'}";
//var data1="{uname='papa',pwd='19'}";
//var data2="uname=papa&pwd=19";
var data3="uname=papa&pwd=19";
xmlHttp.send(data3);
}
然后上我的 spring Controller类的代码
/**
* 这个方法中,传入的 HttpServletRequest对象,是为了把前端传过来的数据,打印出来看看。
*
* @param uname
* @param pwd
* @param request
* @return
*/
@RequestMapping(value={"/loginA","/logA"},method=RequestMethod.POST)
public String loginPostA(
@RequestParam(value="uname") String uname,
@RequestParam String pwd,
HttpServletRequest request) {
System.out.println(request.getContentType()+"-----------------------");
BufferedReader br;
try {
//获取 request的输入流
br = request.getReader();
String str, wholeStr = "";
//循环 读出数据
while((str = br.readLine()) != null){
wholeStr += str;
}
//输出页面的 数据
System.out.println("页面的传入数据:"+wholeStr);
} catch (IOException e) {
e.printStackTrace();
}
//打印页面的传入参数值
System.out.println("Spring MVC 注解 的值(Post) :: uname :"+uname+"/n pwd :"+pwd);
//打印 request 中的 参数值
String unameR=request.getParameter("uname");
String pwdR=request.getParameter("pwd");
System.out.println("request 中的 uname是:"+unameR+"pwd: "+pwdR);
return "dataIndex";
}
运行上面的结果:
在spring 解析注解的的时候,就已经报错了,所以这样,无法查看request对象的内容,然后,我修改代码,将注解的参数去掉,
使用request取参数值。代码如下:
/**
* 这个方法中,传入的 HttpServletRequest对象,是为了把前端传过来的数据,打印出来看看。
*
* @param uname
* @param pwd
* @param request
* @return
*/
@RequestMapping(value={"/loginA","/logA"},method=RequestMethod.POST)
public String loginPostA(/*
@RequestParam(value="uname") String uname,
@RequestParam String pwd,*/
HttpServletRequest request) {
System.out.println(request.getContentType()+"-----------------------");
BufferedReader br;
try {
//获取 request的输入流
br = request.getReader();
String str, wholeStr = "";
//循环 读出数据
while((str = br.readLine()) != null){
wholeStr += str;
}
//输出页面的 数据
System.out.println("页面的传入数据:"+wholeStr);
} catch (IOException e) {
e.printStackTrace();
}
//打印页面的传入参数值
// System.out.println("Spring MVC 注解 的值(Post) :: uname :"+uname+"/n pwd :"+pwd);
//打印 request 中的 参数值
String unameR=request.getParameter("uname");
String pwdR=request.getParameter("pwd");
System.out.println("request 中的 uname是:"+unameR+"pwd: "+pwdR);
return "dataIndex";
}
运行结果如下:
这结果上,发现,request 的 reader流,能读出页面传过来的 参数,但是request 的getParameter()方法却无法获得值。
然后通过查找资料,发现。request .getParameter() 与request.getReader() 的取值方式是不一样的。
request .getParameter() 仅支持 enctype=”application/x-www-form-urlencoded”是的编码方式,
request.getReader() 支持enctype=”multipart/form-data”的编码方式。
所以,这样就找到了问题的所在。 就是 javascript的 ajax 传输数据的编码方式,不被 request .getParameter()所支持,那就设置一下ajax的 contentType属性值。【**从这里可以知道,spring MVC注解的方式,也是通过 request .getParameter() 取得**】
解决方法,就是在 ajax 代码上加上一句话,指明数据传输 内容的 类型。即设置 Content-Type 参数。
网上很多代码,都是用jquery 的ajax实现的。而我的例子是 纯 javascript 实现ajax,所以相应的格式也就不一样。
废话不多说,直接上代码。
function callBackPost() {
var url="/PaiLeN/user/logA";
if (xmlHttp==null) {
xmlHttp = createXMLHttpRequest();
}
xmlHttp.onreadystatechange=processRequestPost;
xmlHttp.open("POST",url,true);
//添加这句话
xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
//var data="{uname:'papa',pwd:'19'}";
//var data1="{uname='papa',pwd='19'}";
//var data2="uname=papa&pwd=19";
var data3="uname=papa&pwd=19";
xmlHttp.send(data3);
}
注意: xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
必须写在 xmlHttp.open("POST",url,true);后面,不然会无法进入Controller类,而后台控制台又没有报错。(这个错误,我一度以为是我的java 代码写错了,各种被折磨。 后来用 按F12 查看浏览器的代码,才发现错误)
错误提示如下:
Failed to execute 'setRequestHeader' on 'XMLHttpRequest': The object's state must be OPENED
意思就是,setRequestHeader 必须在open 后面。
修改代码后,最后输出的结果是:
注意:这里我们 已经取到了 页面的传来的 参数。 request对象的getContentType 值,也是我们在 前端页面中,写明的数据传输的内容类型。
然后,我们通过request 的reader 是没有读取到任何内容。这也验证了 前面所说的,request.getReader()与request .getParameter() 取值方式是不一样。
致此,该问题的解决方式,就写完了。
如果哪里写的不严谨,或不正确。 欢迎各位可以留言。谢谢!