我想创建一个自定义消息渲染器来将 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"
。不到一分钟就可以完成。
但是,是的,我同意这是一种明显丑陋的方法。
您可以考虑以下替代方案,它们不一定更简单,但至少更干净:
-
首先,什么是semantic http://en.wikipedia.org/wiki/Semantic_Web使用的价值<p>
代替<span>
在这个具体情况下?老实说,我没有看到任何语义价值。所以,我建议保留它<span>
。如果唯一的功能需求是让它appear like a <p>
,然后添加一些 CSS 即可。例如。
.error-msg {
display: block;
margin: 1em 0;
}
-
您可以直接在 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" />
-
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(使用前将#替换为@)