我需要为此组件显示FacesMessage
,如下所示,
问题是它在UI上多次显示,如下所示,
其次,输入的日期为40.06.2015
,这是无效的,因此FacesMessage
,但它已转换为10.07.2015
。我不知道如何防止这种情况。任何帮助都非常感谢。我知道可以使用setLenient()
类上的DateFormat
轻松处理它,但不知何故,在我提供后,UI组件会将其转换为下个月的日期。
附加到此组件的验证器如下:
那么,如何避免多次显示“请以正确的格式输入日期”?
我想过使用h:message
而不是h:messages
,并且在验证器方法的catch块中这样做
FacesContext.getCurrentInstance().addMessage("formId:aboveCompId", message);
但UI上没有显示任何内容。有什么建议吗?
答案 0 :(得分:4)
这种方法至少存在两个问题。
您将组件绑定到bean属性。症状表明bean不是请求作用域。这是一个非常糟糕的主意。 UI组件本质上是请求范围的,不应该在更广泛的范围内绑定为bean的属性,否则JSF将重用它们而不是创建新的。如果你继续这样做,所有标记处理程序(包括验证程序绑定)将在同一个bean上的请求之间在同一个UI组件实例上反复运行,从而在每次回发时累积(你会在每次回发时看到越来越多的消息)相同的视图,由同一个验证器重新连接到同一个组件实例引起。)
您在验证器中手动添加了一条面部消息,而不是在其中抛出一个ValidatorException
面部消息。因此,JSF生命周期在验证阶段后不正确地继续,而不会按照规范中止它。
回到具体的功能要求。
对于非宽松的日期转换,只需明确使用<f:convertDateTime>
即可。如有必要,可以通过输入组件的converterMessage
属性自定义转换器消息。
关于日期范围验证,请等到转换器完成后再抓取Date
作为value
,然后按Date#before()
或Date#after()
进行比较。
所以,简而言之,这应该为你做到:
private Date startDate;
private Date endDate;
<t:inputCalendar id="startDate" binding="#{startDateComponent}" value="#{bean.startDate}"
renderAsPopup="true" renderPopupButtonAsImage="true"
popupDateFormat="dd.MM.yyyy" popupTodayDateFormat="dd.MM.yyyy"
converterMessage="Please enter date in correct format"
>
<f:convertDateTime pattern="dd.MM.yyyy" />
</t:inputCalendar>
<t:inputCalendar id="endDate" value="#{bean.endDate}"
renderAsPopup="true" renderPopupButtonAsImage="true"
popupDateFormat="dd.MM.yyyy" popupTodayDateFormat="dd.MM.yyyy"
converterMessage="Please enter date in correct format"
>
<f:convertDateTime pattern="dd.MM.yyyy" />
<f:validator validatorId="dateRangeValidator" />
<f:attribute name="startDateComponent" value="#{startDateComponent}" />
</t:inputCalendar>
其中dateRangeValidator
是真实且可重复使用的@FacesValidator
,可以在第2个&#34;中找到&#34;下方链接。请注意,第一个组件绑定到视图,绝对不是到bean,并且验证不紧密耦合到辅助bean。