使用 p 元素而不是 span 渲染 JSF h:message

2024-01-12

我想创建一个自定义消息渲染器来将 h:message 渲染为“p”html 元素而不是“span”元素。它涉及以下消息标签:

<h:message id="firstNameErrorMsg" for="firstname" class="error-msg"  />

我已经在下面编写了代码,但这只是渲染一个空的“p”元素。我想我必须从原始组件复制所有属性和文本并将其写入作者。但是,我不知道在哪里可以找到所有内容,而且仅更换标签似乎需要大量工作。

有没有更好的方法来将 h:message 标记呈现为“p”元素?

Code:

@FacesRenderer(componentFamily = "javax.faces.Message", rendererType = "javax.faces.Message")
public class FoutmeldingRenderer extends Renderer {

    @Override
    public void encodeEnd(final FacesContext context, final UIComponent component) throws IOException {

        ResponseWriter writer = context.getResponseWriter();
        writer.startElement("p", component);
        writer.endElement("p");

    }
}

这并不完全是“大量工作”。这基本上是从标准 JSF 消息呈现器扩展、复制粘贴其内容的问题encodeEnd()方法由大约 200 行组成,然后仅编辑 2 行来替换"span" by "p"。不到一分钟就可以完成。

但是,是的,我同意这是一种明显丑陋的方法。

您可以考虑以下替代方案,它们不一定更简单,但至少更干净:

  1. 首先,什么是semantic http://en.wikipedia.org/wiki/Semantic_Web使用的价值<p>代替<span>在这个具体情况下?老实说,我没有看到任何语义价值。所以,我建议保留它<span>。如果唯一的功能需求是让它appear like a <p>,然后添加一些 CSS 即可。例如。

    .error-msg {
        display: block;
        margin: 1em 0;
    }
    

  2. 您可以直接在 EL 中获取特定客户端 ID 的所有消息,如下所示,假设父表单具有该 IDformId:

    #{facesContext.getMessageList('formId:firstName')}
    

    因此,要打印第一条消息的摘要和详细信息,只需执行以下操作:

    <c:set var="message" value="#{facesContext.getMessageList('formId:firstName')[0]}" />
    <p title="#{message.detail}">#{message.summary}</p>
    

    您始终可以将其隐藏到自定义标记文件中,如下所示:

    <my:message id="firstNameErrorMsg" for="firstname" class="error-msg" />
    

  3. Use OmniFaces<o:messages> http://showcase.omnifaces.org/components/messages。当。。。的时候var指定了属性,那么您可以像使用它一样使用它<ui:repeat>.

    <o:messages for="firstNameErrorMsg" var="message">
        <p title="#{message.detail}">#{message.summary}</p>
    </o:messages>
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 p 元素而不是 span 渲染 JSF h:message 的相关文章

随机推荐