2012-09-24 20 views
7

Struts2 web uygulamasında (JQuery eklentisi ile) Ajax doğrulama kullanmaya çalışıyorum ve bir sorunum var.Struts 2 jsonValidationWorkflowStack ve Model Driven ile Ajax Validasyon

@Validations ek açıklamalarını kullanırken problemlerim vardı, bu yüzden validate() yöntemini geçersiz kıldım ve şimdi doğrulama sırasında tüm xhtml formlarım ile iyi çalışıyor. FieldsErrors iyi alınan ve gui yazdırılır. Gerçek şu ki, form doğrulandığında, eylemi başlatmak için sunucuya ikinci bir POST gönderilir. Ama neden bilmiyorum, çerçeve modelin niteliklerini belirlemiyor ve Eylemin yürütülmesinden sonra HTML yanıtının oluşturulması sırasında, çerçeve özniteliklere erişemiyor (sadece jsonValidationWorkflowStack kullandığımda).

Bir basit örnek oluşturduk:

Eylem

@Namespace("/actions") 
    @ParentPackage("actions") 
    @InterceptorRef(value = "jsonValidationWorkflowStack") 
    public class ActionTest extends ActionSupport implements 
     ModelDriven<ModelTest>, ParameterAware { 
    private static final long serialVersionUID = 1L; 

    private ModelTest model; 
    private Map<String, String[]> parameters; 

    public ActionTest() { 
     model = new ModelTest(); 
    } 

    @Action(value = "actionTest", results = { 
      @Result(name = SUCCESS, location = "/jsp/win.jsp"), 
      @Result(name = ERROR, location = "/jsp/loose.jsp"),   
    }) 
    public String executeAction1() throws Exception { 
     System.out.println("pass: "+getModel().getPass()); //the field is always null 
     if ("test".equals(getModel().getPass())) 
      return SUCCESS; 
     return ERROR; 
    } 

    @Override 
    public ModelTest getModel() { 
     return model; 
    } 

    @Override 
    public void validate() { 
     String field; 
     if (parameters.get("pass") != null) { 
      field = parameters.get("pass")[0]; 
      if (field == null || field.isEmpty()) 
       addFieldError("pass", "the field is not set"); 
      else if (!"test".equals(field)) 
       addFieldError("pass", "the password is \"test\""); 
     } 

    } 

    @Override 
    public void setParameters(Map<String, String[]> arg0) { 
     this.parameters = arg0; 

    } 
} 

Modeli

public class ModelTest { 

    private String pass; 
    public String getPass() { 
     return pass; 
    } 
    public void setPass(String pass) { 
     this.pass = pass; 
    } 
} 

Formu

Bu örnekte

<s:form action="actionTest" theme="xhtml"> 
<s:textfield name="pass"/> 
<sj:submit validate="true"/> 
</s:form> 
: - Hep şifre "test" ise bile loose.jsp yönlendirilir ediyorum - Bu eylem tarafından yönlendirilir başka jsp bir yazdırmak isterseniz, ben hiçbir şey (bile gördüm modelde varsayılan bir değer ayarladım).

Bana yardım edebilir misiniz lütfen?

PS: Benim kötü İngilizce için üzgünüm:/

+0

ne olacak ekleyerek? Neden bu engelleyiciyi kullanıyorsun biliyor musun? Tanımladığınız aynı kullanım tablosunu kullanıyorum ve her şey iyi çalışıyor mu? İşleminizi @valid yoluyla da doğrulayabilirsiniz. Model özellikleriyle iyi çalışır. –

+0

Sorun, bununla ilgili olabilir: http://stackoverflow.com/a/21021131/1654265 –

cevap

0

Aslında modele dayalı dinleyici defaultStack

<interceptor-stack name="defaultStack"> 
       <interceptor-ref name="exception"/> 
       <interceptor-ref name="alias"/> 
       <interceptor-ref name="servletConfig"/> 
       <interceptor-ref name="prepare"/> 
       <interceptor-ref name="i18n"/> 
       <interceptor-ref name="chain"/> 
       <interceptor-ref name="debugging"/> 
       <interceptor-ref name="profiling"/> 
       <interceptor-ref name="scopedModelDriven"/> 
       <interceptor-ref name="modelDriven"/> 
       <interceptor-ref name="fileUpload"/> 
       <interceptor-ref name="checkbox"/> 
       <interceptor-ref name="staticParams"/> 
       <interceptor-ref name="params"> 
        <param name="excludeParams">dojo\..*</param> 
       </interceptor-ref> 
       <interceptor-ref name="conversionError"/> 
       <interceptor-ref name="validation"> 
        <param name="excludeMethods">input,back,cancel,browse</param> 
       </interceptor-ref> 
       <interceptor-ref name="workflow"> 
        <param name="excludeMethods">input,back,cancel,browse</param> 
       </interceptor-ref> 
</interceptor-stack> 

ile gelir ve BEACUSE vermez jsonValidationWorkflowStack sadece basicStack

<interceptor-stack name="jsonValidationWorkflowStack"> 
       <interceptor-ref name="basicStack"/> 
       <interceptor-ref name="validation"> 
        <param name="excludeMethods">input,back,cancel</param> 
       </interceptor-ref> 
       <interceptor-ref name="jsonValidation"/> 
       <interceptor-ref name="workflow"/> 
</interceptor-stack> 

bu kapsamaktadır basicStack

<interceptor-stack name="basicStack"> 
       <interceptor-ref name="exception"/> 
       <interceptor-ref name="servletConfig"/> 
       <interceptor-ref name="prepare"/> 
       <interceptor-ref name="checkbox"/> 
       <interceptor-ref name="multiselect"/> 
       <interceptor-ref name="actionMappingParams"/> 
       <interceptor-ref name="params"> 
        <param name="excludeParams">dojo\..*,^struts\..*</param> 
       </interceptor-ref> 
       <interceptor-ref name="conversionError"/> 
</interceptor-stack> 

deneyin Eğer ParameterAware arayüzünü kaldırırsanız

@Namespace("/actions") 
    @ParentPackage("actions") 
    @InterceptorRefs({ 
     @InterceptorRef("jsonValidationWorkflowStack"), 
     @InterceptorRef("defaultStack") 
}) 
İlgili konular