Javascript 使用Struts2和AJAX调用检查用户名可用性
我正在使用Struts2作为框架构建一个web应用程序。正如标题所示,我正试图使用AJAX调用检查用户名的可用性(如果有更简单的方法可以实现相同的结果,可以接受其他建议) 现在我有两个问题:Javascript 使用Struts2和AJAX调用检查用户名可用性,javascript,java,jquery,ajax,struts2,Javascript,Java,Jquery,Ajax,Struts2,我正在使用Struts2作为框架构建一个web应用程序。正如标题所示,我正试图使用AJAX调用检查用户名的可用性(如果有更简单的方法可以实现相同的结果,可以接受其他建议) 现在我有两个问题: 请求在my doPost函数中为空 即使我将uname设置为字符串,也不会发生任何事情 这是我的代码 Login.jsp <s:form action="login.action" method="post" data-parsley-validate=""> <
- 请求在my doPost函数中为空
- 即使我将uname设置为字符串,也不会发生任何事情
<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>
检查.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());
}
}
公共类检查扩展了HttpServlet{
私有静态最终长serialVersionUID=1L;
受保护的void doPost(HttpServletRequest请求、HttpServletResponse响应)
抛出ServletException、IOException{
ActionSupport connectionSupport=新的ActionSupport();
setContentType(“text/html;charset=UTF-8”);
PrintWriter out=response.getWriter();
试一试{
连接=空;
字符串URL=“172.ExampleIP”;
Class.forName(“com.mysql.jdbc.Driver”);
connection=DriverManager.getConnection(URL,“用户”,“传递”);
字符串uname=request.getParameter(“user.username”);
PreparedStatement ps=connection.prepareStatement(“从用户名=?”的用户中选择用户名”);
ps.setString(1,uname);
结果集rs=ps.executeQuery();
如果(!rs.next()){
out.println(“+uname+”可用”);
}否则{
out.println(“+uname+”已在使用”);
}
out.println();
}捕获(例外情况除外){
out.println(“错误->”+ex.getMessage());
}最后{
out.close();
}
}
公共无效数据集()
抛出ServletException,IOException{
doPost(ServletActionContext.getRequest(),ServletActionContext.getResponse());
}
}
Struts.xml
<action name="usernameCheck" class="java.com.my.package.check" method="doGet"></action>
我不确定这是否是重要信息,但表单位于JQuery模式框中 我找到了解决办法。根据Andrea的建议,我更改了java类以扩展ActionSupport。我将struts操作结果更改为stream类型
<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>
并将我的JavaScript成功函数更改为:
success : function(msg) {
$(".status").html(msg);
}
谢谢大家的意见 可能有助于如何格式化ajax帖子的数据。无法完全从描述中获得-您的问题到底是什么。我注意到你的代码有几个问题。。。我会说出两个1。您正在使用
struts2
但是,ajax
调用是由servlet
而不是struts2
操作处理的。在ajax
调用中,您将变量作为uname
发送,但在servlet
中,您希望收到user.username
Frankenstein!!:D创建一个操作而不是servlet。通常,使用execute()方法扩展ActionSupport的类。@Plirkee更改变量就可以做到这一点。代码按预期执行。但是,在执行check.java之后,GUI上不会显示任何消息。My status div被前面的“Checking availability…”消息卡住了。
private InputStream stream;
public InputStream getStream() {
return stream;
}
success : function(msg) {
$(".status").html(msg);
}