War*_*007 2 ajax jquery servlets
我正在学习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();
}
}
Run Code Online (Sandbox Code Playgroud)
这是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();
}
});
Run Code Online (Sandbox Code Playgroud)
编辑1:因此,Web应用程序一直工作到"add"的$ 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()选项:
$.ajax({
type:"POST",
url:"InsertServlet",
dataType:"json",
data: {
name: nameIn,
ssn: ssnIn,
birth: birthIn,
xxxx: xxxxIn
},
// ...
Run Code Online (Sandbox Code Playgroud)
按照该$.ajax()文件,该dataType物业在什么格式指示jQuery的响应将返回(这是在你的情况下,通过由指定的方式只是HTML text/html,绝对不是JSON所指示application/json).它并不代表您错误预期的请求参数的格式.并且,该data属性必须表示URL编码的HTTP请求查询字符串符合application/x-www-form-urlencoded内容类型,因此不是JSON对象.
这解释了为什么请求参数null.
删除dataType属性.你在这里不需要它,jQuery足够智能,可以根据响应的Content-Type标题自动检测它.
将该data属性修复为真正的URL编码的HTTP请求查询字符串.您可以通过以下方式之一执行此操作:
$.serialize()在表格上使用.鉴于<form id="yourFormId">:
data: $("#yourFormId").serialize(),
Run Code Online (Sandbox Code Playgroud)使用$.param()JSON对象上:
data: $.param({
name: nameIn,
ssn: ssnIn,
birth: birthIn,
xxxx: xxxxIn
}),
Run Code Online (Sandbox Code Playgroud)手动编写URL编码的HTTP请求查询字符串.
data: "name=" + encodeURIComponent(nameIn)
+ "&ssn=" + encodeURIComponent(ssnIn)
+ "&birth=" + encodeURIComponent(birthIn)
+ "&xxxx=" + encodeURIComponent(xxxxIn),
Run Code Online (Sandbox Code Playgroud)使用JSON.stringify()适当的内容类型一起.
contentType: "application/json",
data: JSON.stringify({
name: nameIn,
ssn: ssnIn,
birth: birthIn,
xxxx: xxxxIn
}),
Run Code Online (Sandbox Code Playgroud)
这只需要在servlet中进行更改:它必须将请求主体解析为JSON而不是使用getParameter()等等.由于这很繁琐,您最好用JAX-RS Web服务替换servlet,它提供内置工具来透明地处理这个问题.
与具体问题无关,使用$.post()而不是$.ajax()减少样板代码.
$.post("InsertServlet", $("#yourFormId").serialize(), function(responseHtml) {
$('#state').html(responseHtml);
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8586 次 |
| 最近记录: |