当使用带有JSON对象的$ .ajax作为数据时,request.getParameter()返回null
我正在学习Java servlet,我为“GET”和“POST”编写了两个单独的servlet。 当向服务器发送“GET”请求时,servlet访问数据库并检索所有内容并将结果转换为Google Charts可识别的格式。 当向服务器发送“POST”请求时,servlet获取参数并将它们添加到Java对象,然后DAO将数据添加到数据库。 但是,当我在输入后点击“添加”按钮时,Web应用程序根本找不到servlet。 它只是“跳过”ajax函数并继续。 所以这是插入的servlet:
@WebServlet("/InsertServlet") public class InsertServlet extends HttpServlet { private static final long serialVersionUID = 1L; private EmployeeDao dao; public InsertServlet() throws SQLException { super(); dao = new EmployeeDao(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("doPost"); Employee e = new Employee(); e.setName(request.getParameter("name")); e.setSSN(request.getParameter("ssn")); e.setDob(request.getParameter("birth")); e.setIncome(request.getParameter("xxxx")); dao.addEmployee(e); response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); out.println("Data Entry Added
"); out.println(""+request.getParameter("name")+"
"); out.println(""+request.getParameter("ssn")+"
"); out.println(""+request.getParameter("birth")+"
"); out.println(""+request.getParameter("xxxx")+"
"); out.flush(); out.close(); } }
这是index.html:
$("#add").click(function() { var nameIn = $('#name').val(); var ssnIn = $('#ssn').val(); var birthIn = $('#birth').val(); var xxxxIn = $('#xxxx').val(); if (validate(nameIn, ssnIn, birthIn, xxxxIn) === true) { xxxxIn = "\$" + xxxxIn; var ssn1 = ssnIn.substring(0, 3); var ssn2 = ssnIn.substring(3, 5); var ssn3 = ssnIn.substring(5); ssnIn = ssn1 + '-' + ssn2 + '-' + ssn3; $.post("InsertServlet", $("#inputForm").serialize(), function(responseHtml) { $('#state').html(responseHtml); }); window.setTimeout(redraw, 1000); redraw(); } });
编辑1:因此,Web应用程序一直工作到“add”的$ ajax发送正确请求的位置。 JSfunction运行良好。 请求具有与属性对应的正确值。 但是,在调用/ InsertServlet URL时,似乎Web应用程序只是忽略了servlet,而getParameter方法在doPost方法中都返回null。
编辑2:Tomcat版本:7.0.61。 JDK版本:1.7.0_45。 Servlet版本:3.0
您的错误在$.ajax()
选项的dataType
和data
属性中:
$.ajax({ type:"POST", url:"InsertServlet", dataType:"json", data: { name: nameIn, ssn: ssnIn, birth: birthIn, xxxx: xxxxIn }, // ...
根据$.ajax()
文档 , dataType
属性指示jQuery以何种格式返回响应 (在你的情况下,就像text/html
所指示的那样只是HTML,而不是application/json
指示的application/json
)。 它并不代表您错误预期的请求参数的格式。 并且, data
属性必须表示URL编码的HTTP请求查询字符串符合application/x-www-form-urlencoded
内容类型,因此不是JSON对象。
这解释了为什么请求参数为null
。
删除dataType
属性。 你在这里不需要它,jQuery足够聪明,可以根据响应的Content-Type
标头自动检测它。
将data
属性修复为真正的URL编码的HTTP请求查询字符串。 您可以通过以下方式之一执行此操作:
-
在表单上使用
$.serialize()
。 给定:
data: $("#yourFormId").serialize(),
-
在JSON对象上使用
$.param()
:data: $.param({ name: nameIn, ssn: ssnIn, birth: birthIn, xxxx: xxxxIn }),
-
手动编写URL编码的HTTP请求查询字符串。
data: "name=" + encodeURIComponent(nameIn) + "&ssn=" + encodeURIComponent(ssnIn) + "&birth=" + encodeURIComponent(birthIn) + "&xxxx=" + encodeURIComponent(xxxxIn),
-
使用
JSON.stringify()
以及适当的内容类型。contentType: "application/json", data: JSON.stringify({ name: nameIn, ssn: ssnIn, birth: birthIn, xxxx: xxxxIn }),
这只需要在servlet中进行更改:它必须将请求体解析为JSON,而不是使用
getParameter()
等。 由于这很繁琐,您最好用JAX-RS Web服务替换servlet,它提供内置工具来透明地处理这个问题。
与具体问题无关 ,使用$.post()
而不是$.ajax()
会减少样板代码。
$.post("InsertServlet", $("#yourFormId").serialize(), function(responseHtml) { $('#state').html(responseHtml); });
也可以看看:
- 如何使用Servlets和Ajax?