【问题标题】:How to avoid displaying of FacesMessage multiple times?如何避免多次显示 FacesMessage?
【发布时间】:2015-08-16 13:44:45
【问题描述】:

我需要为这个组件显示一个FacesMessage,如下所示,

问题是它多次显示在 UI 上,如下所示,

其次,输入的日期是40.06.2015,这是无效的,因此是FacesMessage,但它被转换为10.07.2015。我不知道如何防止这种情况。非常感谢任何帮助。我知道在DateFormat 类上使用setLenient() 可以轻松处理它,但不知何故,在我在后台可以使用它之前,UI 组件将其转换为下个月的日期。

附加到这个组件的验证器如下:

那么,如何避免多次显示“请输入正确格式的日期”?

我想过使用h:message而不是h:messages,并且在验证器方法的catch块中这样走

FacesContext.getCurrentInstance().addMessage("formId:aboveCompId", message);

但 UI 上没有显示任何内容。有什么建议吗?

【问题讨论】:

  • 我几乎忽略了这个问题,因为您将代码发布为屏幕截图而不是文本。请将它们修复为真正的代码 sn-ps。屏幕截图中文本的最大问题是它不是 searchbot 可索引的,因此对于尝试搜索线索/解决方案的具有相同问题的其他人来说,该问题是无法找到的。

标签: jsf-2


【解决方案1】:

这种方法至少存在两个问题。

  1. 您将组件绑定到 bean 属性。这些症状表明 bean 不是请求范围的。这是一个非常糟糕的主意。 UI 组件本质上是请求范围的,不应将其绑定为更广泛范围内的 bean 的属性,否则 JSF 将重用它们而不是创建新的。如果您继续这样做,所有标签处理程序(包括验证器绑定)将在同一个 UI 组件实例上在同一个 bean 上的请求中反复运行,因此每次回发都会累积(您会在每次回发时看到越来越多的消息)相同的视图,由相同的验证器重新附加到相同的组件实例引起)。

  2. 您正在验证器中手动添加人脸消息,而不是在其中抛​​出带有人脸消息的ValidatorException。因此,JSF 生命周期在验证阶段之后错误地继续,而没有按照规范中止它。

另见:


回到具体的功能需求。

  1. 至于非宽松日期转换,直接使用<f:convertDateTime>即可。如有必要,可以通过输入组件的converterMessage 属性自定义转换器消息。

  2. 至于日期范围验证,只需等到转换器完成并抓住右边的Datevalue,然后通过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,可以在下面的第二个“另见”链接中找到。请注意,第一个组件绑定到视图,绝对不绑定到 bean,并且验证与支持 bean 紧密耦合。

另见:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    • 2021-10-20
    • 2021-10-16
    • 1970-01-01
    • 2020-06-28
    • 2016-01-23
    相关资源
    最近更新 更多