2013-07-04 95 views
2

如何在struts2中實現AJAX驗證,讓您知道用戶名是否可用onblur?這是我到目前爲止管理,但文檔不清晰:struts2 onblur服務器端ajax驗證

JSP:

<%@ page 
    language="java" 
    contentType="text/html; charset=ISO-8859-1" 
    pageEncoding="ISO-8859-1"%> 
<%@ taglib 
    prefix="s" 
    uri="/struts-tags"%> 
<%@ taglib 
    prefix="sj" 
    uri="/struts-jquery-tags"%> 

<!DOCTYPE html> 
<html> 
<head> 
<sj:head jqueryui="true" /> 
<!-- Don't forget these 2 files!! --> 
<script 
    src="${pageContext.request.contextPath}/struts/utils.js" 
    type="text/javascript"></script> 
<script 
    src="${pageContext.request.contextPath}/struts/css_xhtml/validation.js" 
    type="text/javascript"></script> 
<script 
    type="text/javascript" 
    src="js/register.js"></script> 
<title>Register</title> 
</head> 

<s:url 
    action="loginLink" 
    var="loginHREF" /> 
<s:url 
    action="forgotPasswordLink" 
    var="forgotPasswordHREF" /> 
<s:url 
    action="Register" 
    var="registerHREF" /> 
<body> 

    <s:form 
     theme="css_xhtml" 
     action="Register" 
     onsubmit="return myValidate()"> 
     <s:textfield 
      name="user.username" 
      label="Username" 
      id="uname" 
      required="true" 
      pattern="[a-zA-Z0-9_-]{5,12}" 
      title="5-12 Alphanumeric characters required" /> 
     <s:textfield 
      name="user.email" 
      label="Email" 
      required="true" /> 
     <s:password 
      id="pass1" 
      name="user.password" 
      label="Password" 
      required="true" 
      pattern="{5,12}" 
      title="5-12 characters" /> 
     <s:password 
      id="pass2" 
      label="Confirm Password" 
      required="true" 
      pattern="{5,12}" /> 
     <s:textfield 
      name="user.firstName" 
      label="First Name" 
      required="true" /> 
     <s:textfield 
      name="user.lastName" 
      label="Last Name" /> 
     <sj:datepicker 
      yearRange='-90:-3' 
      changeYear="true" 
      name="user.birthDate" 
      readonly="true" 
      label="Date of Birth" /> 
     <s:submit value="Register" /> 
    </s:form> 
    <s:a href="%{loginHREF}">Login</s:a> 
    <s:a href="%{forgotPasswordHREF}">Forgot Password</s:a> 

    <script> 
     $("#uname").blur(function() { 

      var fieldData = $("#uname").serialize(); 
      fieldData = fieldData.slice(5); 
      //do the POST thingies 
      $.ajax({ 

       type : "POST", 
       url : "ValidateUsername", 
       cache : false, 
       data : fieldData, 
       dataType : "json", 
       complete : function(request) { 
        alert("In complete"); 
        var form = $('form'); 

        //clear previous validation errors, if any 
        //StrutsUtils.clearValidationErrors(form); 

        //get errors from response 
        var text = request.responseText; 
        alert(text); 
        var errorsObject = StrutsUtils.getValidationErrors(text); 

        //show errors, if any 
        if (errorsObject.fieldErrors) { 
         StrutsUtils.showValidationErrors(form, errorsObject); 
        } 

       } 
      }); 

      return false; 
     }); 
    </script> 

</body> 
</html> 

操作:

@Action("ValidateUsername") 
@Results(value = { @Result(name = "success", type = "json"), @Result(name = "input", type = "json") }) 
@ParentPackage("default") 
@InterceptorRef("jsonValidationWorkflowStack") 
public class ValidateUsername extends ActionSupport { 

    private String username; 

    @Override 
    public String execute() { 
     return SUCCESS; 
    } 

    @Override 
    public void validate() { 
     UserService service = new UserService(); 
     User isTaken = service.findByUsername(username); 
     service.close(); 
     if (isTaken != null) 
      addFieldError("user.username", "That username is taken"); 
    } 

    public String getUsername() { 
     return username; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 

} 

該文檔使它看起來像struts2的將處理它如果你只是簡單地在sx:submit標記中添加json攔截器並設置validate =「true」。 在register.js中,我檢查密碼和確認密碼是否匹配。 基本上我希望在按下提交按鈕前進行驗證。現在提交驗證它像任何其他正常形式。

編輯:另外,有沒有工作方法,而不是使用dojo?它似乎阻止我所有的客戶端驗證,包括所需的屬性,JS等。

Edit2:我放棄了dojo插件,學習了一些js並設法將我現在擁有的東西放在一起。現在唯一剩下的就是顯示一個錯誤。警告響應文本將顯示一個僅包含用戶名鍵值對的json字符串。我應該向操作添加另一個成員並處理它以顯示錯誤消息嗎?因爲StrutsUtils js不起作用。 addFieldError("user.username", "That username is taken");不會修改json結果。

基本上,我該如何添加fielderrors到我的json響應?

編輯:我得到了我的行動,我場的錯誤添加到JSON響應通過修改註解如下:

@Action("ValidateUsername") 
@Results(value = { 
     @Result(name = "success", type = "json"), 
     @Result(name = "input", type = "json", params = { "ignoreHierarchy", 
       "false", "includeProperties", 
       "actionErrors.*,actionMessages.*,fieldErrors.*" }) }) 
@ParentPackage("default") 
@InterceptorRef("jsonValidationWorkflowStack") 

現在唯一的問題是: //明確先前驗證錯誤,如果有的話

**//StrutsUtils.clearValidationErrors(form);** 

         //get errors from response 
         var text = request.responseText; 
         alert(text); 
         **var errorsObject = StrutsUtils.getValidationErrors(text);** 

         //show errors, if any 
         if (errorsObject.fieldErrors) { 


StrutsUtils.showValidationErrors(form, errorsObject); 
         } 

沒有一個StrutsUtils函數正在工作。當我取消註釋clearValidationErrors它什麼也不做,並打破了其餘的JS代碼。 errorsObject是空的,並且即使在打印我的jon響應時,showValidation也不做任何事情,我可以看到帶有消息的字段錯誤。 我如何獲得StrutsUtils的工作?

另外,有沒有更好的方法來實現我的用例?我從來沒有學過jquery/ajax,這是我的第一個struts2應用程序。

回答

0

Struts可用於服務器端。您正試圖在客戶端撥打

var errorsObject = StrutsUtils.getValidationErrors(text);

StrutsUtils是一類,在客戶端/ javascript上不可用。

您可以通過多種方式發送錯誤。

請參考我在下面的鏈接中的回答,瞭解如何在使用struts2時處理ajax請求&響應。

How to get Ajax response in Struts2