$.ajax()post方式请求参数无法传递,request.getParameter()无法获取

$.ajax()post方式请求参数无法传递,request.getParameter()无法获取

 

在前台页面中

$.ajax({

                    url : "${ctx}/rediscluster/delete.do",

                    data : {"rname":rname},

                    type : "post",

                    dataType:"text",

content-type: "application/json",

                    success : function(data) {

                     alert("data");

                    },

error:function(XMLHttpRequest, textStatus, errorThrown){

alert(errorThrown);

}

                });

在后台中,用java+spring mvc

@ResponseBody

    @RequestMapping(value="/delete.do",produces = {"application/json;charset=utf-8"})

    public String deletenode(@RequestParam("rname")String rname) throws GeneralException{

        SqlSession sqlsession = sqlsessionfactory.openSession();

        try {

            RedisClusterDao dao = sqlsession.getMapper(RedisClusterDao.class);

            dao.deletenode(rname);

        } catch (Exception e) {

            log.error(e.getMessage(), e);

        } finally {

            sqlsession.close();

        }

        log.info("delete 集群:{}", rname);

        return"OK";

    }

 

特别注意,这里我用的是@RequestParam接收。

 

运行后,提示String parameter ' rname ' is not present。即:后台接收不到前台传递的rname参数。考虑到可能是spring mvc在接受参数时出现问题,所以,将deletenode(@RequestParam("rname")String rname)方法修改成deletenode(HttpServletRequest request),然后在后台中又用request.getParameter("rname")的方式取数,结果一直显示null.

ajaxtype参数改成get,别的不变,结果,两中方式都可以正常的接收。

 

chrome浏览器,可以看到get方式的请求

这里正常的显示参数。

 

post方式contenttype设置成applicatio/json时:

浏览器提示400,Required String parameter 'rname' is not present.

 

Post方式contenttype不设置成application/json的request header如下:

当我们的content-type是application/x-www-form-urlencoded的时候,前台传递的参数是可以传到后台的@RequestParamrequest.getParameter都可以,事实上,这两种都是一样的,但是当我再前台设置的content-typeapplication/json的时候,后台就无法接收到参数,两种都不行。

 

如果是二进制数据传输,像文件上传等,需要设置content-Type multipart/form-data.

 

特别注意:

ajaxJSON时设置的contenttype 如果是application/json或者text/json时,JAVArequest.getParameter("")怎么也接收不到数据。这是因为,TomcatHttpServletRequest类的实现类为org.apache.catalina.connector.Request(实际上是org.apache.coyote.Request

post请求不是application/x-www-form-urlencoded的,全部直接返回,不作处理,即不会解析表单数据来放到request parameter map中。所以通过request.getParameter(name)是获取不到的。只能使用最原始的方式,读取输入流来获取。


无论是在spring mvc中,还是再struts中,都是一样的。contentType : "application/json"的时候,用post方式提交数据,后台request.getParameter方法接收到的始终是null.

 

那么,ajax post方式contenttype设置成applicatio/json时,在后台到底有没有办法接收传递的参数呢?肯定是有的,可以看看我的另一篇文章:ajax post方式contenttype设置成applicatio/json时 spring mvc接收参数

 

展开阅读全文

没有更多推荐了,返回首页