我想创建一个自定义消息渲染器,将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");
}
}
答案 0 :(得分:6)
这不完全是“很多工作”。这基本上是从标准JSF消息渲染器扩展,复制其约{200}行的encodeEnd()
方法然后仅编辑2行以"span"
替换"p"
。它可以在不到一分钟的时间内完成。
但是,我同意这是一种简单的丑陋方法。
您可以考虑以下替代方案,这些方案不一定更容易,但至少更清洁:
首先,在这种特定情况下使用<p>
代替<span>
的{{3}}值是多少?说实话,我没有看到任何语义价值。所以,我建议保持<span>
。如果唯一的功能要求是让它像<{1}}一样出现,那么只需要输入一些CSS。 E.g。
<p>
您可以直接在EL中获取特定客户端ID的所有消息,如下所示,假设父表单的ID为.error-msg {
display: block;
margin: 1em 0;
}
:
formId
因此,要打印第一条消息的摘要和详细信息,请执行以下操作:
#{facesContext.getMessageList('formId:firstName')}
您可以随时将其隐藏到自定义标记文件中,如下所示:
<c:set var="message" value="#{facesContext.getMessageList('formId:firstName')[0]}" />
<p title="#{message.detail}">#{message.summary}</p>
使用semantic。指定<my:message id="firstNameErrorMsg" for="firstname" class="error-msg" />
属性后,您可以像var
一样使用它。
<ui:repeat>