Spring MVC 使用注解无法获取 Ajax的post方式提交的数据 的解决方法

直接上 我的 纯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() 取值方式是不一样。

致此,该问题的解决方式,就写完了。

如果哪里写的不严谨,或不正确。 欢迎各位可以留言。谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值