【问题标题】:show inline error message in jsf 2 without h:messages tag在没有 h:messages 标记的 jsf 2 中显示内联错误消息
【发布时间】:2014-08-16 06:14:55
【问题描述】:

我正在开发 JSF2 应用程序,我正在尝试通过显示内联消息或弹出错误来为我的所有 xhtml 添加异常处理。

例如,如果在支持 bean 中发生服务异常,我将其包装在我的自定义 UI 异常中并重新抛出它,如下所示,其中第二个参数指示是否使用弹出窗口或内联消息通知用户该异常.

throw new UIException(e, true);

在我的异常处理程序包装器中,我正在拦截此异常,并根据第二个参数尝试在弹出窗口或内联中显示错误。对于弹出窗口,我有一个丰富的:popupPanel,我已将其包含在基本页面中,其中所有 xhtml 都包含在应用程序中。因此,在 exceptionHandler 包装器中,我将这个弹出窗口动态添加到渲染 ID,如下所示。

FacesContext.getCurrentInstance().getPartialViewContext() .getRenderIds().add("popupForm:popupErrorPanelGroup");

对于内联消息,我想在我的基本 xhtml 中添加一个内联 sn-p,并希望以类似的方式在行消息中显示错误。这种方法的问题是消息定位不正确,内联消息应该显示在单个表单的顶部,但现在它显示在应用程序的顶部。为此,我必须手动在每个 xhtml 中包含我的 inlineexception xhtml。

内联异常 xhtml:

<h:panelGroup styleClass="error" rendered="#{errorInlineBackingBean.showError}">
        <h:outputText id="errorText"
            value="#{errorInlineBackingBean.errorMsg}" />           
    </h:panelGroup>

是否可以将这个 inlineException 包含在类似于弹出方法的基本页面中,并在应用程序中以任何形式显示?我想避免在每个 xhtml 中包含重复代码或在所有 xhtml 中放置 h:messages 标记。

【问题讨论】:

    标签: jsf jsf-2 facelets


    【解决方案1】:

    您可以定义一个复合组件,您可以在其中以某种方式覆盖 h:form 并在其上添加 h:message 或您的代码包含。

    这是一个例子:

    <!--?xml version='1.0' encoding='UTF-8' ?-->
         <!-- INTERFACE -->
         <cc:interface>
             <cc:attribute name="id">
             <cc:attribute name="prependId">
         </cc:attribute></cc:attribute></cc:interface>
    
         <!-- IMPLEMENTATION -->
         <cc:implementation>
             <h:form id="#{cc.attrs.id}" prependid="#{cc.attrs.prependId}">
                 <h:messages/>
                 <cc:insertchildren></cc:insertchildren>
                 <h:panelGroup styleClass="error" rendered="#{errorInlineBackingBean.showError}">
                      <h:outputText id="errorText" value="#{errorInlineBackingBean.errorMsg}" />           
                 </h:panelGroup>
            </h:form>
        </cc:implementation>
    

    我很久以前就同样的概念发表过一篇博文:http://faissalb.blogspot.ca/2011/08/composite-component-to-tweak-forms.html?m=1

    【讨论】:

    • 感谢 faissalb 的回答。但是,这并不能回答我的问题。我的目的是在每个表单中显示错误消息,而不在每个表单中包含任何其他组件。在您建议的方法中,我仍然必须在每个表单中使用复合组件。是否可以在不包含 h:messages 或单个表单中的任何其他组件的情况下显示错误消息?
    • 使用我向您建议的解决方案,您不会在页面中使用
      而是将其替换为新组件。
    • 嗯,但我不能这样做,因为已经有很多 h:forms,我不想打扰它们。相反,如果我可以在运行时包含错误消息,那么只需对现有代码进行最少的更改即可轻松实现。
    猜你喜欢
    • 1970-01-01
    • 2012-06-17
    • 2011-03-12
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    • 2014-03-12
    • 1970-01-01
    相关资源
    最近更新 更多