2013-01-15 28 views
1

我一直在尝试几天,使Struts2 AJAX验证工作,但我不能解决最后一个问题。我使用的是struts2jquery插件异步提交我的形式:Struts2 AJAX验证不保留在页面

<div id="result"></div> 
    <s:form action="RegisterUser" theme="xhtml" method="post"> 
     <s:textfield key="firstname" label="First name" size="35" 
      required="true" /> 
     <s:textfield key="lastname" label="Last name" size="35" 
      required="true" /> 
     <s:textfield key="address" label="Address" size="35" 
      required="true" /> 
     <s:textfield key="phone" label="Phone number" size="35" /> 
     <s:textfield key="username" label="Username" size="35" 
      required="true" /> 
     <s:password key="password" label="Password" size="35" 
      required="true" /> 
     <s:textfield key="email" label="E-mail address" size="35" 
      required="true" /> 
     <sj:submit key="Inregistrare" targets="result" align="right" 
      button="true" validate="true" onSuccessTopics="notifyRegistration" /> 
    </s:form> 

我已经包括所需的脚本:

<script type="text/javascript" src="./js/registerScript.js"></script> 
<!-- This files are needed for AJAX Validation of XHTML Forms --> 
<script src="${pageContext.request.contextPath}/struts/utils.js" type="text/javascript"></script> 
<script src="${pageContext.request.contextPath}/struts/xhtml/validation.js" 
type="text/javascript"></script> 

和标签:

<sj:head jqueryui="true" /> 

的onSuccess处理程序:

$(document).ready(function(){ 
$.subscribe('notifyRegistration', function(event,data) { 
    var registrationStatus = event.originalEvent.data.registrationStatus; 
    if(registrationStatus == 'SUCCESS'){ 
     alert('Contul dumneavoastra a fost creat cu success!'); 
     window.location.href = "./index.html";  
    } else { 
     alert('Contul dumneavoastra nu a putut fi creat. Va rugam incercati din nou.'); 
    } 
}); 
}); 

M Ÿ配置是这样的:

<action name="RegisterUser" class="actions.Register" method="execute"> 
     <interceptor-ref name="jsonValidationWorkflowStack"/> 
     <result name="input">/pages/Register.jsp</result> 
     <result type="json"/> 
</action> 

而且执行我的动作类的方法:

public String execute() throws Exception { 

    if (isInvalid(getUsername()) || isInvalid(getPassword()) 
      || isInvalid(getEmail())) { 
     registrationStatus = REGISTRATION_ERROR; 
    } 

    if (registerUser()) { 
     registrationStatus = REGISTRATION_SUCCESS; 
     return SUCCESS; 
    }else {  
     registrationStatus = REGISTRATION_ERROR; 
    } 
    return SUCCESS; 
} 

registerUser()方法使实际插入到数据库中。验证XML被称为Register-Validation.xml。 验证工作正常 - 如果某些字段未填写,则会显示错误标签而不刷新页面。我的问题是,即使是返回SUCCESSERROR的动作,浏览器也会显示它在另一个页面上发送的JSON,../Register.action。我不知道为什么它不会进入我的onSuccess处理程序。我已经成功地在其他表单上使用了AJAX,这里唯一的区别是我使用验证xml和jsonValidationWorkflowStack拦截器。为什么会发生这种情况,我如何避免重定向?为什么请求不到onSuccess处理程序?

回答

0

你的Action中是否有getters for registrationStatus?

我会在您的notifyRegistration回调函数中放一个alert(event.originalEvent.data.registrationStatus);,看看它的价值。

顺便说一句,好像你已经混

Struts2-jQuery Plugin AJAX Form Validation with Struts2 XHTML Theme

Struts2-jQuery Plugin: Remote Link that handle an JSON Result with an onSuccessTopic

AFAIK(但我从来没有用过这种特定类型的验证),验证不应该在execute()中处理,而应该在validate()中处理,或者通过XML或者Annotations处理。 Struts2-jQuery插件展示中的示例使用Annotations,但您可以轻松地将其转换为XML并尝试展示。

根据示例,您完全不需要使用javascript函数或onSuccessTopic。

您可以在showcase太运行它,Forms -> Forms with Validation下(但坚持的代码的文件,因为在展示的代码似乎错过了一些碎片......例如针对“测试”密码验证)。