问题:前端用Ajax的post方式想servlet传递参数,servlet的getParameter()方法无法获取参数。

前端代码:

$.ajax({
url: '/TestWeb/addBook',
type: 'post',
data: JSON.stringify($('#addBookForm').serializeJSON()),//jQuery的json序列化函数
//data: $('#addBookForm').serialize(),
dataType: "json",//返回的数据类型
headers : {
'Content-Type' : 'application/json;charset=utf-8'
}
success: function () {
$('#addModelClose').click();
layer.msg('添加新书成功!');
} });

想传入json数据,所以一开始 设置'Content-Type' : 'application/json;charset=utf-8'  ,然后发现servlet那边req.Parameter()获取的都为null。百度相关信息后发现,HTML中的form表单有一个关键属性 enctype=application/x-www-form-urlencoded ,Servlet的API提供了对这种编码方式解码的支持,只需要调用ServletRequest 类中的getParameter()方法就可以得到表单中提交的数据。

然后百度知道jQuery的Ajax的post方法默认的ContentType就是这种,于是把之前的content-Type注释掉,重新运行,发现还是不行。然后我想可能是既然没有设置成json,servlet不识别json数据,于是把data改成普通的数据请求格式,即 id=123&cx=lklj 这种格式。

然后就成功在servlet用getParameter()获得数据。

附:

把前端表单数据转化成json字符串:

方法1:

JSON.stringify($('#addBookForm').serializeJSON())可以直接把表单的内容格式化为json数据格式,但这个方法需要相对应的jquery插件(serializeJson要插件,然后这个函数是把表单数据变成一个js对象,再用stringify把js对象变成json字符串)

顺便提一下:  $('#addBookForm').serialize()可以直接把表单内容格式化为普通请求格式,像 id=123&cx=lklj

方法2:

<script type="application/javascript">
//发送表单ajax请求
$(':submit').on('click',function(){
$.ajax({
url:"buy",
type:"POST",
data:JSON.stringify($('form').serializeObject()),
contentType:"application/json", //缺失会出现URL编码,无法转成json对象
       dataType: "json",
success:function(){
alert("成功");
}
});
}); /**
* 自动将form表单封装成json对象
*/
$.fn.serializeObject = function() {
var o = {};
var a = this.serializeArray();
$.each(a, function() {
if (o[this.name]) {
if (!o[this.name].push) {
o[this.name] = [ o[this.name] ];
}
o[this.name].push(this.value || '');
} else {
o[this.name] = this.value || '';
}
});
return o;
};
</script>

tips:

更改源码的js或者html后浏览器没反应,可以试着用ctrl+F5来更新。

req.getParameter()无法获取参数(附前端json序列化)的更多相关文章

  1. request.getParameter("name")获取参数为null和空字符串的区别

    1.获取到的值为空字符串 当url里有name属性,但是没有值的时候,后台用request.getParameter("name")获取到的是空字符串 2.获取到的值为null 当 ...

  2. Servlet获取参数

    package action; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.Servlet ...

  3. nodejs Express 4.x req.body req.query req.params 三种获取参数的方法

    第一种情况:http://localhost:3000/1,我们可以用req.params.(应该是跟路由有关,待) 第二种情况:http://localhost:3000/?id=1,用req.qu ...

  4. axios发送post请求node服务器无法通过req.body获取参数

    问题: 项目前端使用Vue框架,后端使用node.js搭建本地服务器.前端通过 axios 方式请求后端数据的过程中,发现如果是 get 请求,服务器端能够通过 req.query 获取前端传递的参数 ...

  5. servlet获取参数时,request.getParameter("id")参数获取失败

    servlet获取参数时,request.getParameter("id")参数获取失败,这里的参数是“index”里面href中的参数 要注意,取不到值,是不是要取的参数有没有 ...

  6. setCharacterEncoding 是在request.getParameter获取参数之前 设置request的编码格式 一步到位

    setCharacterEncoding 是在request.getParameter获取参数之前 设置request的编码格式 一步到位

  7. Servlet生命周期以及获取参数

    1. 创建Servlet几种方式  1) 实现Servlet接口     控制Servlet的生命周期       构造器       init()       service()       des ...

  8. WebApi Post 后台无法获取参数的解决方案

    事件回放: 之前一段时间,公司里前端用的Angularjs 发送http请求也是用的ng的组件,后台是.Net的WebApi 前端 var data = { PArgs: { PageIndex: 0 ...

  9. Jquery发送ajax请求以及datatype参数为text/JSON方式

    Jquery发送ajax请求以及datatype参数为text/JSON方式 1.方式一:datatype:'text' 2.方式二:datatype:'JSON' 3.使用gson-1.5.jar包 ...

随机推荐

  1. http权威指南(一)-Http概述

    Http概述 在Web中,不管是浏览器还是server都是通过Http相互通信的.那么Http是怎样工作的呢? 首先,client向server发送Http请求,server会在Http响应中回送所请 ...

  2. 关于Cascading

    Cascading是一个开源的Java库和应用程序编程接口(API),它为MapReduce提供了一个抽象层.它允许开发者构建出能在Hadoop集群上运行的复杂的.关键任务的数据处理应用. Casca ...

  3. java序员必备的十大技能

    想成为一名出色的Java程序员么?本文将为大家重点介绍程序员必备的十大技能,成就您的梦想.       1.语法:必须比较熟悉,在写代码的时候IDE的编辑器对某一行报错应该能够根据报错信息知道是什么样 ...

  4. 在Android Studio中修改应用包名

    紧凑模式下(包名中的每个字段紧贴在一起,例如),右键单击包名,Refactor -> Rename,只能修改包名最外层的字段 分离模式下(点击设置,将Hide Empty Middle Pack ...

  5. Handler有何作用?怎样使用?

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012974916/article/details/24580405 一  Handler作用和概念 ...

  6. js数据类型简单介绍

    JS数据类型 ECMAScript中有5种简单的数据类型:Undefined,Null,Boolean,Number,String.还有一种复杂的数据类型--Object(本质上是由一组无序的名值对组 ...

  7. git apply、git am打补丁.diff 和 .patch【转】

    本文转载自:https://www.jianshu.com/p/e5d801b936b6 前提: 生成patch: git format-patch -M master 生成指定patch,0163b ...

  8. chmod更改文件的权限

    #include "apue.h" int main(int argc,char *argv[]) { struct stat stabuf; ) err_sys("st ...

  9. POJ3126 Prime Path —— BFS + 素数表

    题目链接:http://poj.org/problem?id=3126 Prime Path Time Limit: 1000MS   Memory Limit: 65536K Total Submi ...

  10. codeforces 673C C. Bear and Colors(暴力)

    题目链接: C. Bear and Colors time limit per test 2 seconds   memory limit per test 256 megabytes input s ...