2014-07-04 162 views
1

我有一個問題,struts2驗證器(我新的struts2)。Struts 2驗證器

我在我的頁面上有2個按鈕,每個按鈕驗證2個常用規則,第二個按鈕添加另一個特定規則。

這裏是我的配置:

我的行爲是VPJ001Action.java

struts.xml配置文件是這樣的:

<action name="VPJ001" class="VPJ001Action"> 
    <result>/jsp/test.jsp</result> 
</action> 
<action name="VPJ001ValidationAction" method="validation" class="VPJ001Action"> 
    <result name="PAGE_VPJ002" type="chain">VPJ002!execute</result> 
    <result>/jsp/test1.jsp</result> 
</action> 
<action name="VPJ001DiffusionMailAction" method="diffusionMail" class="VPJ001Action"> 
    <result>/jsp/test.jsp</result> 
</action> 

我的第一個按鈕調用VPJ001ValidationAction,第二個調用VPJ001DiffusionMailAction

我的驗證器配置:

VPJ001Action-validation.xml包含2個公共規則:

<validators> 
    <field name="bassin"> 
     <field-validator type="required"> 
     <message key="validation.bassin.requis"/> 
     </field-validator> 
    </field> 
    <field name="moisAValider"> 
     <field-validator type="required"> 
      <message key="validation.mois.requis"/> 
     </field-validator> 
    </field> 
</validators> 

VPJ001Action-VPJ001DiffusionMailAction-validation.xml包含的具體規則:

<validators> 
<field name="moisAValider"> 
    <field-validator type="regex" short-circuit="true"> 
      <param name="expression">.*[\*]$</param> 
      <message key="validation.mois.valide"/> 
    </field-validator> 
</field> 
</validators> 

下面是結果:

當我點擊2個按鈕,我有一個2 commons規則彈出,因爲我不選擇任何東西在頁面上,它的工作正常。

當我選擇一個臉盆和一個moisAValider如果我上的驗證按鈕點擊,一切正常,IM重定向良好的網頁

,當我選擇一個臉盆,如果我點擊diffusionMailbutton一個moisAValider,頁面刷新和彈出與我的具體規則(正則表達式不尊重)打開,但頁面已被重新加載!

我想有這樣的場景:

如果我在沒有任何選擇的驗證按鈕點擊,我想不尊重

的2條公共規則彈出,如果我點擊diffusionMailButton沒有選擇任何東西,我想要一個不尊重2共同規則的彈出窗口,並且具體的規則,

是否有可能?

我希望驗證的具體規則將在客戶端完成,而不是在服務器端,因爲如果它在服務器端完成,頁面重新加載,我所有的列表都是空的...我需要重新加載所有列表和它不是必要的,如果所有驗證器都可以在客戶端完成...

感謝您的幫助!

+0

如何在同一時間點擊2個按鈕? –

+0

你在哪裏看到我想同時點擊2個按鈕?我講兩個不同的按鈕。驗證按鈕和擴散郵件按鈕;),每個人都有2個公共驗證器在第二個另一個驗證 –

+0

我沒有看到他們中的任何一個,你也可以改變這個問題,這將是一個按鈕? –

回答

0

我已經找到我的解決方案。

由於驗證器不做我想做的事情,我只爲2個按鈕添加2個驗證器(那些驗證器是客戶端驗證),並且我使用<field-validator type="expression">添加了一個驗證器來調用java方法。此方法檢查請求的操作並在需要時返回true或false。

最後一點是當此方法返回false時,我被重定向到jsp,並且所有的選擇框都被刷新併爲空,這是因爲當我提交表單時,所有列表都不會傳遞給服務器。我需要在列表中添加隱藏的輸入。因爲我用列表我已經做到了序列化結果的轉換器只有一個隱藏輸入這樣的:

<input type="hidden" name="listeBassinSurveillance" id="formulaireVPJ_listeBassinSurveillance" value="H4sIAAAAAAAAAJ2WS4/bVBTHbzJ5dR5tmCmdMtMBS0gVCCWTGdJ....."> 

,當我提交表單,該值被反序列化,所有值都投入在列表行動,所以當我刷新jsp時,我所有的列表都不是空的!

這看起來很複雜,但很容易實現和清晰。

謝謝大家!

0

對我來說,你想要客戶端驗證爲什麼你不使用JavaScript或jQuery的相同,你的問題將得到解決。 我可以評論但我不能。以下是供您參考的鏈接。

javascript form validation

jquery example

有在Struts2的方式使用JavaScript AJAX

在struts.xml中可以定義方法的結果: -

<result type="stream"> 
    <param name="contentType">text/html</param> 
    <param name="inputName">inputStream</param> 
</result> 

,然後在你的操作方法中,你可以檢查你想檢查的任何東西,然後如果驗證是正確的,那麼設置如下: -

this.setInputStream(new ByteArrayInputStream(SUCCESS.getBytes())); 

,如果驗證failes然後

this.setInputStream(new ByteArrayInputStream(ERROR.getBytes())); 

這一切都從支柱側。 在您的表單提交在Java腳本,你可以做有點像這

$.ajax({ 
         traditional: true, 
         type: "POST", 
         url : ctxPath + "/yourActionName", 
         data : "yourField="+value, 
         dataType: "text", 
         success : function(data, success) { 
          if(data.indexOf("success")==-1){ 
           alert("Action returned Error"); 
           return false; 
          }else{ 
           alert("Action returned Success"); 

          } 
         }, 
        }); 
+0

我看不到你的觀點,但如果struts給了我這樣做的可能性,我想重新使用相同的彈出窗口顯示錯誤消息,並且所有錯誤消息都使用相同的架構。如果我可以nt我會嘗試與jquery –

+0

我已編輯我的答案 – vikash