gpt4 book ai didi

jsf - 渲染 JSF h :message with p element instead of span

转载 作者:行者123 更新时间:2023-12-05 00:27:53 24 4
gpt4 key购买 nike

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

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

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

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

代码:
@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"来自 "p" .不到一分钟就可以搞定。

但是,是的,我同意这是一种非常丑陋的方法。

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

  • 首先,什么是semantic使用 <p> 的值(value)而不是 <span>在这种特殊情况下?老实说,我没有看到任何语义值(value)。所以,我建议只保留一个 <span> .如果唯一的功能要求是让它看起来像 <p> ,然后只需放入一些 CSS。例如。

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

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

    #{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" />

  • 使用 OmniFaces <o:messages> .当var属性被指定,那么你可以像 <ui:repeat> 一样使用它.
    <o:messages for="firstNameErrorMsg" var="message">
    <p title="#{message.detail}">#{message.summary}</p>
    </o:messages>
  • 关于jsf - 渲染 JSF h :message with p element instead of span,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19730562/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com