2016-09-06 11 views
-1

Struts2をフレームワークとして使用してWebアプリケーションを構築しています。タイトルが示唆しているように、私はAJAXコールを使用してユーザ名の可用性をチェックしようとしています(同じ結果を達成するのが簡単なものがあれば、他の提案にもオープンしています)。ユーザー名可用性チェックStruts2とAJAXコールの使用

今私は2つの問題:

  • リクエストは私のdoPost関数ではnullです。
  • 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のモーダルボックスの上にあります。

+0

[This](http://stackoverflow.com/questions/10214723/jquery-ajax-post-data)は、ajax POSTのデータをフォーマットする方法を助けるかもしれません。 –

+1

あなたの問題は何ですか?私はあなたのコードにいくつかの問題があることに気が付きました...私は2つの** 1つの名前をつけます**あなたは 'struts2'を使っていますが、' ajax'呼び出しは 'struts2'の' action'ではなく 'servlet'によって処理されます* * 2。** 'ajax'の呼び出しでは' uname'として変数を送りますが、 'servlet'では' user.username'を受け取ることを期待しています。 – Plirkee

+1

Frankenstein !! :Dサーブレットの代わりにアクションを作成します。通常は、ActionSupportをexecute()メソッドで拡張したクラスです。 –

答えて

-1

解決策が見つかりました。私はAndreaの提案に基づいてActionSupportを拡張するためにJavaクラスを変更しました。私はストラットのアクション結果をタイプストリームに変更しました。

<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クラスに

private InputStream stream; 

public InputStream getStream() { 
     return stream; 
    } 

を以下のように追加して、次のように私のJavaScriptの成功の機能を変更:

success : function(msg) { 
    $(".status").html(msg); 
} 

は、すべての入力ありがとうございました。

関連する問題