我正在学习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:因此,网络应用程序一直工作到“添加”的$ ajax发送正确请求的程度。 JS功能运行良好。请求具有与属性对应的正确值。但是,在调用/ InsertServlet URL时,似乎Web应用程序只是忽略了servlet,而getParameter方法在doPost方法中都返回null。
编辑2:Tomcat版本:7.0.61。 JDK版本:1.7.0_45。 Servlet版本:3.0
答案 0 :(得分:8)
您的错误出现在dataType
选项的data
和$.ajax()
属性中:
$.ajax({
type:"POST",
url:"InsertServlet",
dataType:"json",
data: {
name: nameIn,
ssn: ssnIn,
birth: birthIn,
xxxx: xxxxIn
},
// ...
根据the $.ajax()
documentation,dataType
属性指示jQuery将以什么格式返回响应(在您的情况下,仅通过HTML表示{ {1}}并且绝对不是text/html
所指示的JSON。它并不代表您错误预期的请求参数的格式。并且,application/json
属性必须表示URL编码的HTTP请求查询字符串符合data
内容类型,因此不是JSON对象。
这解释了为什么请求参数为application/x-www-form-urlencoded
。
删除null
属性。你不需要它,jQuery足够智能,可以根据响应的dataType
标题自动检测它。
将Content-Type
属性修复为真正的URL编码HTTP请求查询字符串。您可以通过以下任一方式执行此操作:
在表单上使用$.serialize()
。给定data
:
<form id="yourFormId">
在JSON对象上使用$.param()
:
data: $("#yourFormId").serialize(),
手动撰写URL编码的HTTP请求查询字符串。
data: $.param({
name: nameIn,
ssn: ssnIn,
birth: birthIn,
xxxx: xxxxIn
}),
使用data: "name=" + encodeURIComponent(nameIn)
+ "&ssn=" + encodeURIComponent(ssnIn)
+ "&birth=" + encodeURIComponent(birthIn)
+ "&xxxx=" + encodeURIComponent(xxxxIn),
以及正确的内容类型。
JSON.stringify()
这只需要在servlet中进行更改:它必须将请求主体解析为JSON,而不是使用contentType: "application/json",
data: JSON.stringify({
name: nameIn,
ssn: ssnIn,
birth: birthIn,
xxxx: xxxxIn
}),
等。由于这很繁琐,您最好通过JAX-RS Web服务替换servlet,该服务提供内置工具来透明地处理它。
$.post()
代替getParameter()
来解决具体问题无关会减少样板代码。
$.ajax()