Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 2 如何避免多次显示FacesMessage?_Jsf 2 - Fatal编程技术网

Jsf 2 如何避免多次显示FacesMessage?

Jsf 2 如何避免多次显示FacesMessage?,jsf-2,Jsf 2,我需要显示此组件的FacesMessage,如下所示, 问题是它在UI上多次显示,如下所示, 其次,输入的日期是40.06.2015,该日期无效,因此FacesMessage,但它被转换为10.07.2015。我不知道如何防止这种情况。非常感谢您的帮助。我知道在DateFormat类上使用setLenient()可以很容易地处理它,但是在备份中对我可用之前,UI组件会将它转换为下个月的日期 连接到此组件的验证程序如下所示: 那么,如何避免多次显示“请以正确的格式输入日期” 我想到了使用h:

我需要显示此组件的
FacesMessage
,如下所示,

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

其次,输入的日期是
40.06.2015
,该日期无效,因此
FacesMessage
,但它被转换为
10.07.2015
。我不知道如何防止这种情况。非常感谢您的帮助。我知道在
DateFormat
类上使用
setLenient()
可以很容易地处理它,但是在备份中对我可用之前,UI组件会将它转换为下个月的日期

连接到此组件的验证程序如下所示:

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

我想到了使用
h:message
而不是
h:messages
,在validator方法的catch块中这样做

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

但在UI上什么也没有显示。有什么建议吗?

这种方法至少有两个问题

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

  • 您在验证程序中手动添加了一条faces消息,而不是抛出一个带有faces消息的
    ValidatorException
    。因此,JSF生命周期在验证阶段之后将不正确地继续,而没有按照规范中止它

  • 另见:

    回到具体的功能需求

  • 对于非宽松日期转换,只需显式使用
    。如有必要,可通过输入组件的
    converterMessage
    属性自定义转换器消息

  • 至于日期范围验证,只需等待转换器完成,并抓取右侧的
    date
    As
    value
    ,然后通过
    date\before()
    date\before()
    进行比较

  • 因此,简而言之,这应该可以帮助您:

    private Date startDate;
    private Date endDate;
    
    
    
    其中,
    dateRangeValidator
    是一个真实的、可重用的
    @FacesValidator
    ,可以在下面的第二个“请参见”链接中找到。请注意,第一个组件绑定到视图,绝对不绑定到bean,并且验证与支持bean紧密耦合

    另见:

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

  • 您正在将组件绑定到一个bean属性。症状表明该bean没有请求范围。这是一个非常糟糕的主意。UI组件本质上是请求范围,不应该绑定为范围更广的bean的属性,否则JSF将重用它们,而不是创建一个新的。如果继续这样做,所有标记处理程序(包括验证器绑定)将在同一个bean上的请求之间在同一个UI组件实例上反复运行,从而随着每次回发而累积(您将在同一视图上的每次回发上看到越来越多的消息,这是由于同一验证器重新连接到同一个组件实例造成的)

  • 您在验证程序中手动添加了一条faces消息,而不是抛出一个带有faces消息的
    ValidatorException
    。因此,JSF生命周期在验证阶段之后将不正确地继续,而没有按照规范中止它

  • 另见:

    回到具体的功能需求

  • 对于非宽松日期转换,只需显式使用
    。如有必要,可通过输入组件的
    converterMessage
    属性自定义转换器消息

  • 至于日期范围验证,只需等待转换器完成,并抓取右侧的
    date
    As
    value
    ,然后通过
    date\before()
    date\before()
    进行比较

  • 因此,简而言之,这应该可以帮助您:

    private Date startDate;
    private Date endDate;
    
    
    
    其中,
    dateRangeValidator
    是一个真实的、可重用的
    @FacesValidator
    ,可以在下面的第二个“请参见”链接中找到。请注意,第一个组件绑定到视图,绝对不绑定到bean,并且验证与支持bean紧密耦合

    另见:

    我几乎忽略了这个问题,因为您将代码作为截图而不是文本发布。请将它们修复为真实的代码片段。截图中文本的最大问题是它不可搜索机器人索引,因此这个问题对于试图搜索线索/解决方案的具有相同问题的其他人来说是无法解决的。我几乎忽略了这个问题因为您将代码发布为截图而不是文本。请将它们修复为真实的代码片段。截图中文本的最大问题是它不可搜索,因此,其他有相同问题的人无法解决该问题,他们试图搜索线索/解决方案。