问题:前端用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. 设计模式学习笔记——State状态模式

    从一个类中,将有关状态的处理分离出来,独立成类,并面向接口编程.作用是可以简化代码,避免过多的条件判断:if-else-

  2. 3144: [Hnoi2013]切糕

    3144: [Hnoi2013]切糕 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1526  Solved: 827[Submit][Status] ...

  3. Javascript正则中的exec和match

    分几种情况说明 1.假设re中不是全局的也就是不带g var str = "cat3 hat4"; var re = /\w+\d/; var ex = re.exec(str); ...

  4. mysql_proxy

    mysql_proxy中间件实现:读写分离.负载均衡. mysql_proxy中间件实现:读写分离.负载均衡. 负载均衡:给多台数据库,看能不能均匀的分给不同的数据库. 客户端连的是proxy,此时的 ...

  5. Java 深拷贝浅拷贝 与 序列化

    一.浅拷贝.深拷贝 浅拷贝会对对象中的成员变量进行拷贝:如果是基本类型,拷贝的就是基本类型的值:如果属性是内存地址(引用类型),拷贝的就是内存地址 : 深拷贝,除了基本类型外,引用类型所引用的对象也会 ...

  6. HDU3652 B-number —— 数位DP

    题目链接:https://vjudge.net/problem/HDU-3652 B-number Time Limit: 2000/1000 MS (Java/Others)    Memory L ...

  7. 基于阿里云上实现全站https的正确姿势(一)

    对应的网址:https://yq.aliyun.com/articles/65199 摘要: 目前主流大厂的网站和服务都已经实现了全站https, 例如: baidu, taobao, jd等. 关于 ...

  8. 【转载】asp.net 后台弹出提示框

    感觉这种最好用: public void showMessage(string str_Message) { ClientScript.RegisterStartupScript(this.GetTy ...

  9. C++ main函数中参数argc和argv含义及用法

    argc 是 argument count的缩写,表示传入main函数的参数个数: argv 是 argument vector的缩写,表示传入main函数的参数序列或指针,并且第一个参数argv[0 ...

  10. flask中manage.py的用法

    flask中manage.py的用法#!/usr/bin/env pythonimport osfrom app import create_app, dbfrom app.models import ...