使用 Struts2 和 AJAX 调用的用户名可用性检查
Username Availability Check Using Struts2 and AJAX Call
我正在使用 Struts2 作为框架构建网络应用程序。正如标题所暗示的那样,我正在尝试使用 AJAX 调用来检查用户名的可用性(如果有更简单的方法可以达到相同的结果,请接受其他建议。)
现在我有两个问题:
- 我的 doPost 函数中的请求为空。
- 即使我将 uname 设置为字符串,也没有任何反应。
这是我的代码。
Login.jsp
<s:form action="login.action" method="post" data-parsley-validate="">
<s:textfield name="user.username" key="Username" id="username" onchange="checkUsername()"/><span class="status"></span>
<s:submit method="doTheThing" align="center" onclick="hide()"/>
</s:form>
Javascript
function checkUsername(){
var uname = $(username).val();
if (uname.length > 3) {
$(".status").html("Checking availability...");
$.ajax({
type : "POST",
url : "usernameCheck.action",
data : "uname=" + uname,
success : function(msg) {
$(".status").ajaxComplete(
function(event, request, settings) {
$(".status").html(msg);
});
}
});
}
else {
$(".status").html("username should be at least 3 characters");
}
}
check.java
public class check extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ActionSupport connectionSupport = new ActionSupport();
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
Connection connection = null;
String URL = "172.ExampleIP";
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection(URL, "user","pass");
String uname = request.getParameter("user.username");
PreparedStatement ps = connection.prepareStatement("select username from users where username=?");
ps.setString(1, uname);
ResultSet rs = ps.executeQuery();
if (!rs.next()) {
out.println("<b>" + uname + "</b> is avaliable");
} else {
out.println("<font color=red><b>" + uname + "</b> is already in use</font>");
}
out.println();
} catch (Exception ex) {
out.println("Error ->" + ex.getMessage());
} finally {
out.close();
}
}
public void doGet()
throws ServletException, IOException {
doPost(ServletActionContext.getRequest(), ServletActionContext.getResponse());
}
}
Struts.xml
<action name="usernameCheck" class="java.com.my.package.check" method="doGet"></action>
我不确定这是否是重要信息,但表单位于 JQuery 模态框中。
我找到了我的解决方案。我根据 Andrea 的建议更改了 java class 以扩展 ActionSupport。我将 struts 操作结果更改为流类型。
<action name="usernameCheck" class="java.com.my.package.check" method="doGet">
<result type="stream">
<param name="contentType">text/html</param>
<param name="inputName">stream</param>
</result>
</action>
我将以下内容添加到我的 java class
private InputStream stream;
public InputStream getStream() {
return stream;
}
并将我的 JavaScript 成功函数更改为以下内容:
success : function(msg) {
$(".status").html(msg);
}
谢谢大家的意见。
我正在使用 Struts2 作为框架构建网络应用程序。正如标题所暗示的那样,我正在尝试使用 AJAX 调用来检查用户名的可用性(如果有更简单的方法可以达到相同的结果,请接受其他建议。)
现在我有两个问题:
- 我的 doPost 函数中的请求为空。
- 即使我将 uname 设置为字符串,也没有任何反应。
这是我的代码。
Login.jsp
<s:form action="login.action" method="post" data-parsley-validate="">
<s:textfield name="user.username" key="Username" id="username" onchange="checkUsername()"/><span class="status"></span>
<s:submit method="doTheThing" align="center" onclick="hide()"/>
</s:form>
Javascript
function checkUsername(){
var uname = $(username).val();
if (uname.length > 3) {
$(".status").html("Checking availability...");
$.ajax({
type : "POST",
url : "usernameCheck.action",
data : "uname=" + uname,
success : function(msg) {
$(".status").ajaxComplete(
function(event, request, settings) {
$(".status").html(msg);
});
}
});
}
else {
$(".status").html("username should be at least 3 characters");
}
}
check.java
public class check extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ActionSupport connectionSupport = new ActionSupport();
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
Connection connection = null;
String URL = "172.ExampleIP";
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection(URL, "user","pass");
String uname = request.getParameter("user.username");
PreparedStatement ps = connection.prepareStatement("select username from users where username=?");
ps.setString(1, uname);
ResultSet rs = ps.executeQuery();
if (!rs.next()) {
out.println("<b>" + uname + "</b> is avaliable");
} else {
out.println("<font color=red><b>" + uname + "</b> is already in use</font>");
}
out.println();
} catch (Exception ex) {
out.println("Error ->" + ex.getMessage());
} finally {
out.close();
}
}
public void doGet()
throws ServletException, IOException {
doPost(ServletActionContext.getRequest(), ServletActionContext.getResponse());
}
}
Struts.xml
<action name="usernameCheck" class="java.com.my.package.check" method="doGet"></action>
我不确定这是否是重要信息,但表单位于 JQuery 模态框中。
我找到了我的解决方案。我根据 Andrea 的建议更改了 java class 以扩展 ActionSupport。我将 struts 操作结果更改为流类型。
<action name="usernameCheck" class="java.com.my.package.check" method="doGet">
<result type="stream">
<param name="contentType">text/html</param>
<param name="inputName">stream</param>
</result>
</action>
我将以下内容添加到我的 java class
private InputStream stream;
public InputStream getStream() {
return stream;
}
并将我的 JavaScript 成功函数更改为以下内容:
success : function(msg) {
$(".status").html(msg);
}
谢谢大家的意见。