需求是想做一个注册页面。当用户输入用户名或者邮箱时,能够异步的请求数据,来验证此用户名或者邮箱是否已经被注册,即注册验证。
前端采用jquey的$ajax方法进行参数的传递,这里以输入用户名为例进行记录,代码如下。
// 验证用户名是否被使用
$("#name").blur(function() {
var name = $("#name").val();
//发送异步请求
$.ajax({
url : "checkUserameServlet",
type : "post",
contentType : "application/json; charset=utf-8",
data : "name=" + name,
success : function(data) { // 会将服务器返回的数据保存到data中
if (data == 0) {
$("#name_regist_span").html("用户名可以使用");
usernameFlag = true;
} else {
$("#name_regist_span").html("用户名不可以使用");
}
}
});
});
首先,在输入ls来验证时,信息提示该用户名可以使用,但是此用户名在数据库中已经存在了,这与预期不符。
检查浏览器所接收的请求数据时发现,接受的请求正文是Request payload,看似是接收到了前台的数据。
然而在后台,Servlet想要接收ajax传来的参数,并且通过这个参数访问数据库,但是通过调试发现,这里的username获取到的值却是null,所以从后台找不到数据,所以前台就得不到正确的响应,代码如下。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置编码
request.setCharacterEncoding("utf-8");
// 获取参数
String username = request.getParameter("name");
boolean flag = loginService.checkUsername(username);
String msg = "";
// 如果没有查到,则能够使用
if (!flag) {
// 用户名可以使用
msg = "0";
} else {
msg = "1";
}
response.setContentType("text/html;charset=utf-8");
response.getWriter().println(msg); }
这个问题最开始让我认为是Dao层的逻辑出现了问题,最终发现是ajax中请求头的设置出现问题,导致了Servlet接收不了参数。去掉请求头的设置,问题得以解决。
contentType : "application/json; charset=utf-8",