我很难解决以下问题。我的问题很简单:我想用红色突出显示触发验证错误的表单字段。使用 context.addMessage(...) 行将错误消息正确放置在 FacesContext 中。
我希望我的系统是通用的。所有附有消息的表单域都会自动突出显示。
我在这个网站上找到了这篇优秀文章的链接: http ://www.jroller.com/mert/entry/how_to_find_a_uicomponent
有了它,我确实为 RENDER_RESPONSE 阶段实现了 PhaseListener,它执行以下操作:
@Override
public void beforePhase(PhaseEvent event) {
// get context
FacesContext context = event.getFacesContext();
// iterate on all the clientIds which have messages
Iterator<String> clientIdsWithMessages = context.getClientIdsWithMessages();
while (clientIdsWithMessages.hasNext()) {
// get the clientId for the field component
String clientIdWithMessage = clientIdsWithMessages.next();
// split on ":"
String[] splitted = clientIdWithMessage.split(":");
UIComponent component = findComponentInRoot(splitted[splitted.length - 1]);
if (component != null) {
Map<String, Object> attributes = component.getAttributes();
if (attributes.containsKey("style")) {
attributes.remove("style");
}
attributes.put("style", "background-color: #FFE1E1;");
}
}
}
这对于我几乎所有的使用都表现得非常好。
现在,有点棘手的是我的一些表格有这样的代码:
<ice:dataTable id="revisionDocuments" value="#{agendaBean.agenda.revisionsDocuments}" var="revision">
<ice:column>
<ice:inputText value="#{revision.sequenceAdresse}" id="revisionSequenceAdresse" />
</ice:column>
....
生成的表单有几行(一个用于 revisionsDocuments 列表的每个对象),每个元素都有一个唯一标识符(clientId),如下所示:
contentForm:revisionDocuments:0:revisionSequenceAdresse
每次迭代都将 0 更改为 1、2、...。因此,提供用于从 ViewRoot 搜索 UIComponent 的代码无法正常工作。所有表单字段都具有相同的“id”。更让我惊讶的是:他们在 FacesContext 中也有相同的“clientId”:
contentForm:revisionDocuments:revisionSequenceAdresse
在浏览树时,我无法区分是否确实看到了正确的表单字段或其他任何表单字段。
有没有人提示解决这个问题?或者另一个建议来实现我的领域的亮点?我不得不承认,我真的不喜欢我的代码,我认为像我正在做的那样操作 viewRoot 很脏,但我想不出更好的解决方案来突出我的字段的通用亮点。
我在 JBOss AS 7.0.2.Final 上运行带有 JSF-Impl 2.1.1-b04 的 IceFaces 2.0.2。
预先感谢您的回答。最好的问候,帕特里克