我有一个“新项目”表单,需要一个日期列表,其中包含以下组件:
<rich:calendar>
输入; <a4j:commandButton>
,将所选日期添加到辅助bean中的List<Date> chosenDates
; <rich:dataTable>
,其中value
设置为List<Date> chosenDates
属性; <a4j:commandButton>
,从List<Date> chosenDates
移除日期; 如何验证(JSF的验证阶段)表单提交(创建过程)上chosenDates
列表的大小?
RichFaces 4,JSF 2.1(Mojarra)。
答案 0 :(得分:1)
我建议使用JSF PhaseListener进行更清洁的方法。如果验证失败,JSF处理将停止跳过其他阶段。创建一个PhaseListener
,在验证阶段期间检查列表的大小,而不是在模型更新/调用操作阶段。试试这样的事情
为验证阶段
创建阶段侦听器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.");
}
}
在faces_config.xml
文件
<lifecycle>
<phase-listener>your.package.structure.TestPhaseListener</phase-listener>
</lifecycle>
编辑:根据您的评论,您可以使用<f:event/>
代码和preValidate
或postValidate
事件(取决于您的偏好)来加入组件的生命周期< / p>
组件的侦听器标记
<rich:dataTable>
<f:event type="preValidate" listener="#{yourBean.listener}"/>
</rich:dataTable>
在您的支持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;
}
希望这有帮助!