我正在学习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("<h2>Data Entry Added</h2><br>"); out.println("<h2>"+request.getParameter("name")+"</h2>"); out.println("<h2>"+request.getParameter("ssn")+"</h2>"); out.println("<h2>"+request.getParameter("birth")+"</h2>"); out.println("<h2>"+request.getParameter("xxxx")+"</h2>"); out.flush(); out.close(); } }
这是index.html:
<form id="inputForm"> <table style="width:80%;border:3px;"> <tr> <td align="center"><input type="text" name="name" id="name" placeholder="First Last"></td> <td align="center"><input type="text" name="ssn" id="ssn" placeholder="111111111"></td> <td align="center"><input type="text" name="birth" id="birth" placeholder="MM/DD/YYYY"></td> <td align="center"><input type="text" name="xxxx" id="xxxx" placeholder="12345"></td> <td align="center"><button type="button" name="add" id="add" >Add</button></td> <td align="center"><button type="button" name="delete" id="delete">Delete</button></td> </tr> </table> </form> $("#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应用程序一直运行到“添加”的$ajax发送适当请求的地步。JS函数运行良好。该请求具有与属性相对应的正确值。但是,当调用/InsertServlet URL时,Web应用程序似乎只是忽略了servlet,而getParameter方法在doPost方法中都返回null。
编辑2:Tomcat版本:7.0.61。JDK版本:1.7.0_45。Servlet版本:3.0
您的错误在于选项的dataType和data属性$.ajax():
dataType
data
$.ajax()
$.ajax({ type:"POST", url:"InsertServlet", dataType:"json", data: { name: nameIn, ssn: ssnIn, birth: birthIn, xxxx: xxxxIn }, // ...
按照该$.ajax()文件,该dataType物业在什么格式指示jQuery的 响应 将返回(这是你的情况的方式只是HTML作为以表示text/html绝对不是JSON所指示application/json)。它不代表您错误预期的请求参数格式。并且,该data属性必须表示URL编码的HTTP请求查询字符串符合application/x-www-form-urlencoded内容类型,因此不能是JSON对象。
text/html
application/json
application/x-www-form-urlencoded
这就解释了为什么请求参数为null。
null
删除dataType属性。您在这里不需要它,而jQuery足够聪明,可以根据响应的Content-Type标头自动检测到它。
Content-Type
将data属性修复为真实的URL编码的HTTP请求查询字符串。您可以通过以下两种方式之一进行操作:
$.serialize()在表格上使用。给定一个<form id="yourFormId">:
$.serialize()
<form id="yourFormId">
data: $("#yourFormId").serialize(),
使用$.param()JSON对象上:
$.param()
data: $.param({ name: nameIn, ssn: ssnIn, birth: birthIn, xxxx: xxxxIn }),
手动编写URL编码的HTTP请求查询字符串。
data: "name=" + encodeURIComponent(nameIn)
使用JSON.stringify()适当的内容类型一起。
JSON.stringify()
contentType: "application/json", data: JSON.stringify({ name: nameIn, ssn: ssnIn, birth: birthIn, xxxx: xxxxIn }),
这仅需要更改servlet:它必须将请求正文解析为JSON,而不使用getParameter()诸如此类。由于这很繁琐,因此最好用JAX-RS Web服务替换Servlet,该Web服务提供内置的功能来透明地处理此问题。
getParameter()
与 具体问题 无关 ,使用$.post()代替$.ajax()可以减少样板代码。
$.post()
$.post("InsertServlet", $("#yourFormId").serialize(), function(responseHtml) { $('#state').html(responseHtml); });