2013-01-25 42 views
0

我有一個「新項目」的形式,要求日期的列表,由以下部分組成:驗證豐富:dataTable的值的大小對錶單提交

  • 一個<rich:calendar>輸入;
  • A <a4j:commandButton>將選定的日期添加到後臺bean中的List<Date> chosenDates;
  • A <rich:dataTable>與它的value設置爲List<Date> chosenDates屬性;
  • A <a4j:commandButton>每個dataTable行將其從List<Date> chosenDates中移除;

如何驗證(JSF的驗證階段)的chosenDates列表形式的大小提交(創建過程)?

RichFaces 4,JSF 2.1(Mojarra)。

+0

的說法你能得到你的填充你豐富的TableModel的/列表的大小:數據表。你可以在facelet/view上做到這一點。 – Mechkov

+0

對不起,我將「驗證」一詞改爲「檢查」。 。編輯的交 – kauedg

回答

1

我建議一個更乾淨的方法與JSF PhaseListener。如果驗證失敗,JSF處理將停止跳過其他階段。創建一個PhaseListener,它將在期間檢查列表的大小,並在模型更新/調用操作階段期間檢查驗證階段的大小。嘗試這樣的事情

  1. faces_config.xml文件的驗證階段創建階段偵聽

    public class TestPhaseListener implements PhaseListener { 
    
        @Override 
        public void afterPhase(PhaseEvent event) { 
         throw new UnsupportedOperationException("Not supported yet."); 
        } 
    
        @Override 
        public void beforePhase(PhaseEvent event) { 
    
         if(event.getPhaseId().equals(PhaseId.PROCESS_VALIDATIONS)){ 
         FacesContext ctx = event.getFacesContext(); 
         YourBeanClass theBeanClass = ctx.getApplication().evaluateExpressionGet(ctx, "#{someBean}", YourNeanClass.class); //obtain a reference to the backing bean containing the list 
    /* 
        inspect the size of the list here and based on that throw the exception below 
    */ 
         throw new ValidatorException(new FacesMessage("Too many dates","Too Many Dates")); 
         } 
        } 
    
        @Override 
        public PhaseId getPhaseId() { 
         throw new UnsupportedOperationException("Not supported yet."); 
        } 
    } 
    
  2. 註冊新的聽衆

    <lifecycle> 
        <phase-listener>your.package.structure.TestPhaseListener</phase-listener> 
    </lifecycle> 
    

編輯:基於您的作爲替代方案,您可以使用掛鉤組件的生命週期標籤和preValidatepostValidate事件(根據自己的喜好)

  1. 甲聽者標籤給組件

    <rich:dataTable> 
         <f:event type="preValidate" listener="#{yourBean.listener}"/> 
        </rich:dataTable> 
    
  2. 定義在支持bean收聽者的方法來按您的定義的事件中運行。該方法的簽名必須採取型ComponentSystemEvent

    public void preCheck(ComponentSystemEvent evt){ 
         //You're in your backing bean so you can do pretty much whatever you want. I'd advise you mark the request as validation failed and queue FacesMessages. Obtain a reference to FacesContext and: 
    
         facesContext.validationFailed(); 
    
    
        } 
    
+0

是的,我認爲這樣做,但我仍然不想混亂生命週期。這個類將運行每個表單提交或導航案例。我正在尋找一個使用JSF標籤的解決方案,比如''等。如果還有另一種方法來實現可以驗證的「列表添加」,我也會考慮。 – kauedg

+0

@ kauedg,根據標籤添加替代品 – kolossus

+0

不錯,這是迄今爲止最棒的一件事。有效。 – kauedg

0

做這樣的事情: #{yourBean.chosenDates.size()} 我假設你有一個名爲getChosenDates吸氣劑返回chosenDates列表。

0

關於你的「驗證擔憂」:

您可以創建在bean一個Validate方法和返回的ValidationMessages名單。下面是一個示例,我在代碼中使用了一個示例。

public List<ValidationMessage> validate() { 
    List<ValidationMessage> validations = new ArrayList<ValidationMessage>(); 
    int curSampleSize = sampleTable.getDataModel().getRowCount(); 

    if(getNumberOfSamples() != null) { 
     size += getNumberOfSamples(); 
    } else { 
     validations.add(new ValidationMessage("Please enter the no of samples to continue.")); 
     return validations; 
    }   

    return validations; 
} 

然後,在提交你可以檢查,如果您有任何ValidationMessages如下:

List<ValidationMessage> errs = validate(); 

if(errs.size()>0) { 
    FacesValidationUtil.addFacesMessages(errs); 
    return null; 
} 

希望這有助於!

+0

我使用驗證/轉換器都沒有問題,因爲其它輸入被正確驗證,由屬性'驗證=#{xxxValidator.validate}的手段「'我的問題是,'<豐富:的dataTable>'不具備這樣的屬性綁定到一個驗證器類,所以我需要將被綁定到驗證標籤,以檢查是否'名單 chosenDate'是不是空的形式提交(之前實際的'保存()'方法執行),希望現在我已經清楚了。 – kauedg

+0

怎麼樣綁定到一個JavaScript事件類似的onsubmit或的onClick。你可以返回一個true或false如果#{不是空myBean.chosenDate}也就是說,如果它不是空返真正的東西 - 假的你可以做到這一點的JavaScript上點擊您的提交按鈕(的commandButton) – Mechkov

+1

順便說一下我上面的解釋會導致如果大小爲零,不提交表單驗證所以,有效的,你可以使用驗證。 hal表格提交。 – Mechkov