Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Struts2和AJAX调用检查用户名可用性_Javascript_Java_Jquery_Ajax_Struts2 - Fatal编程技术网

Javascript 使用Struts2和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=""> <

我正在使用Struts2作为框架构建一个web应用程序。正如标题所示,我正试图使用AJAX调用检查用户名的可用性(如果有更简单的方法可以实现相同的结果,可以接受其他建议)

现在我有两个问题:

  • 请求在my 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>
检查.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);
}