0

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

  • 一个<rich:calendar>输入;
  • A<a4j:commandButton>将所选日期添加到List<Date> chosenDates支持 bean 中的 a ;
  • A<rich:dataTable>将其value设置为List<Date> chosenDates属性;
  • 从;<a4j:commandButton>中删除其日期的每个 dataTable 行List<Date> chosenDates

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

RichFaces 4,JSF 2.1 (Mojarra)。

4

3 回答 3

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>
    

编辑:根据您的评论,作为替代方案,您可以使用<f:event/>标签和preValidateorpostValidate事件挂钩组件的生命周期(取决于您的偏好)

  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();
    
    
         }
    
于 2013-01-26T15:47:14.083 回答
0

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

于 2013-01-25T14:08:52.733 回答
0

关于您的“验证问题”:

Validate您可以在 bean中创建一个方法并返回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;
}

希望这可以帮助!

于 2013-01-25T15:22:51.587 回答