【问题标题】:JSF 2.0 custom messagesJSF 2.0 自定义消息
【发布时间】:2011-06-26 15:40:10
【问题描述】:

我正在使用 JSF 2.0。我正在使用

<h:messages>

标签来呈现错误消息。我可以使用 css 对我的消息进行一些样式设置,但我创建了一个复合组件来呈现可以关闭的消息并使用一些 Jquery 为它们添加效果。

我看过有关如何自定义消息的教程,但其中大部分依赖于 css 和自定义文本输出,但我想做的是生成特定的标记,例如

<myComp:fancyMessage text="etcetcetc error msg" type="error" />

而不是常规的消息标记。 这可能吗?

编辑:

我不想对 jsf 消息进行样式化。既不添加背景也不改变其样式,而是创建我自己的消息 html 标记。这里:

http://balusc.blogspot.com/2010/07/using-html-in-jsf-messages.html

我找到了如何将 html 添加到您的消息中。我想要的是将所有的html封装在我的复合组件中,然后以这种方式使用我的复合组件:

<mycomp:messages/>

<mycomp:message for="componentID" />

message 和 messages 都创建自己的 html 标记

【问题讨论】:

  • 你的问题很模糊。你说你用一些 jQuery 创建了一个复合组件,然后你问是否可以创建一个自定义(复合)组件。具体的问题/疑问是什么?
  • @BalusC 我刚读了你的博客,偶然发现了这个:balusc.blogspot.com/2010/07/using-html-in-jsf-messages.html 这不是我想要的。我错过了那个条目。
  • 对于我的问题如此含糊,我深表歉意。我的意思是我创建了一个复合组件来显示消息。我需要 jsf 使用该复合组件来呈现消息。
  • 我不希望 html 标记出现在消息中,而是出现在组件中。
  • 啊,是的,我现在明白你的意思了。

标签: java jsf jsf-2 facelets message


【解决方案1】:

ui:repeat 中使用FacesContext#getMessageList()。每个项目都是一个FacesMessage,它有几个getter。

<ui:repeat value="#{facesContext.messageList}" var="facesMessage">
    Severity: #{facesMessage.severity}<br />
    Summary: #{facesMessage.summary}<br />
    Detail: #{facesMessage.detail}<br />
    <br />
</ui:repeat>

这允许围绕消息进行更细粒度的 HTML 标记。


它还可以让您在&lt;h:outputText escape="false"&gt; 的帮助下将它们打印为 HTML。我可能迟早需要扩展和修改我的博客文章:)

【讨论】:

  • BalusC,我做到了,它就像一个魅力,除了一件事。由于我使用的是自己的消息组件(我将其命名为:),jsf 无法找到消息标记,因此它在页面末尾显示消息。所以我最终得到了两条消息,一条是我创建的,一条是 jsf 的。有没有办法抑制警告或将我的组件注册为消息渲染器?
  • 如果您的意思是消息已排队且未显示的开发警告,那么抱歉,我现在不知道。但是,当项目阶段未设置为开发时,这不会出现。你可能想用&lt;h:messages style="display: none;" /&gt; 破解它。
【解决方案2】:

回复如何将你的组件设置为消息渲染器:

您的组件需要扩展 HtmlBasicRenderer。

然后你可以将你的渲染器添加到 faces-config.xml

<render-kit>
    <renderer>
        <component-family>javax.faces.Messages</component-family>
        <renderer-type>javax.faces.Messages</renderer-type>
        <renderer-class>com.mypackage.MessagesRenderer</renderer-class>
    </renderer>
</render-kit>

【讨论】:

  • 嘿,我的复合组件不是从 UIComponent 扩展而来的,我已经在 xhtml 文件中定义了它。如果不创建一个 java 类作为自定义渲染器,有没有办法做到这一点?
  • @arg20 目前我不知道其他选择。几周前刚开始将一个相当大的项目从 1.2 迁移到 2.0。如果我能找到有关此问题的信息,我一定会通知您。
【解决方案3】:

我知道这已经有一段时间了,但我想分享这个替代解决方案以造福他人。对于组合,创建一个带有 getter 的支持组件,然后遍历 faces 消息并在收集每个消息后调用 remove()。这将使您在没有 h:messages hack 的情况下绕过“messages queued”警告。

xhtml:

<composite:interface displayName="Messages Component"
    shortDescription="Messages Component" componentType="com.company.dept.commons.ui.messages.Messages">
    <composite:attribute name="styleClass" default="" type="java.lang.String" shortDescription="CSS style class for the component" />
</composite:interface>

<composite:implementation>
    <div id="messagesComponent" class="#{cc.attrs.styleClass}">
        <ui:repeat value="#{cc.messageList}" var="message">
            #{message.severity} - #{message.detail}<br/>            
        </ui:repeat>
    </div>
</composite:implementation>

支持组件:

@FacesComponent("com.company.dept.commons.ui.messages.Messages")
public class Messages extends UINamingContainer {

    private List<FacesMessage> messages;

    public List<FacesMessage> getMessageList() {
        //preserve messages in case getter is called multiple times
        if (messages == null) {
            messages = new ArrayList<FacesMessage>();
        }

        Iterator<FacesMessage> messageItr = getFacesContext().getMessages();
        while(messageItr.hasNext()) {
            FacesMessage message = messageItr.next();
            messages.add(message);
            messageItr.remove();
        }
        return messages;
    }       
}

请注意,xhtml 中的 componentType 设置为代码中的 FacesComponent 值。此外,对 cc.messageList 的引用将触发对 getMessageList() 的调用。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 2013-04-08
    • 1970-01-01
    • 2013-06-13
    • 2012-05-11
    • 1970-01-01
    相关资源
    最近更新 更多