在表单提交上验证rich:dataTable值大小

时间:2013-01-25 13:57:30

标签: jsf jsf-2 richfaces

我有一个“新项目”表单,需要一个日期列表,其中包含以下组件:

  • <rich:calendar>输入;
  • <a4j:commandButton>,将所选日期添加到辅助bean中的List<Date> chosenDates;
  • <rich:dataTable>,其中value设置为List<Date> chosenDates属性;
  • 每个dataTable行<a4j:commandButton>,从List<Date> chosenDates移除日期;

如何验证(JSF的验证阶段)表单提交(创建过程)上chosenDates列表的大小?

RichFaces 4,JSF 2.1(Mojarra)。

3 个答案:

答案 0 :(得分:1)

我建议使用JSF PhaseListener进行更清洁的方法。如果验证失败,JSF处理将停止跳过其他阶段。创建一个PhaseListener,在验证阶段期间检查列表的大小,而不是在模型更新/调用操作阶段。试试这样的事情

  1. 为验证阶段

    创建阶段侦听器
    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. faces_config.xml文件

    中注册新的侦听器
    <lifecycle>
       <phase-listener>your.package.structure.TestPhaseListener</phase-listener>
    </lifecycle>
    
  3. 编辑:根据您的评论,您可以使用<f:event/>代码和preValidatepostValidate事件(取决于您的偏好)来加入组件的生命周期< / p>

    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();
      
      
           }
      

答案 1 :(得分:0)

执行以下操作: #{yourBean.chosenDates.size()} 我想你有一个名为getChosenDates的getter,它返回selectedDates列表。

答案 2 :(得分: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;
}

希望这有帮助!