Jsf 2 jsf2使用FacesMessages突出显示组件(o:highlight)
我有一些输入组件,只有在所有其他情况下执行特定操作时才应该验证它们,它们应该接受每个输入 这样我就不能使用普通的验证器,但有一个commandButton,用于评估其action方法中的数据,并在缺少某些内容时创建一些与特定ClientID相关的FacesMessages 现在,我通常使用组件来指向需要进一步操作的字段,但在这种情况下,输入组件是有效的,因此高亮显示组件不考虑它们 现在我想知道是否有可能让这种行为依赖于带有消息的ID列表 大概是这样的:Jsf 2 jsf2使用FacesMessages突出显示组件(o:highlight),jsf-2,omnifaces,Jsf 2,Omnifaces,我有一些输入组件,只有在所有其他情况下执行特定操作时才应该验证它们,它们应该接受每个输入 这样我就不能使用普通的验证器,但有一个commandButton,用于评估其action方法中的数据,并在缺少某些内容时创建一些与特定ClientID相关的FacesMessages 现在,我通常使用组件来指向需要进一步操作的字段,但在这种情况下,输入组件是有效的,因此高亮显示组件不考虑它们 现在我想知道是否有可能让这种行为依赖于带有消息的ID列表 大概是这样的: for (Iterator<Stri
for (Iterator<String> it = FacesContext.getCurrentInstance()
.getClientIdsWithMessages(); it.hasNext();) {
String clientId = it.next();
List<FacesMessage> messageList = FacesContext
.getCurrentInstance().getMessageList(clientId);
if (messageList != null) {
for (FacesMessage msg : messageList) {
... // build json with clientIds (maybe check for UIInput
}
}
}
如果需要这种方式,可以为信息、警告和错误消息引入新的样式类。也许它甚至更快一点,因为不需要访问整个组件树,但这只是一个猜测
那你怎么看?这是对当前行为的一个相当艰难的改变,所以我不确定这个猜测是否会变成全方位的,或者必须单独实现
现在我想知道是否有可能让这种行为依赖于带有消息的ID列表
从javadoc中,使用与您相同的方法:
请注意,也可以参考,但它没有指出与这些客户机ID关联的组件是否实际上是非客户机ID的组件
因此,对于每个客户端ID,您仍然需要使用UIViewRootfindComponent来查找组件、计算其类型并验证其有效性。这比参观一棵树要贵得多
如果您确实需要在action方法中执行验证,那么最好的办法是自己将上下文和输入标记为无效
FacesContext context = FacesContext.getCurrentInstance();
context.validationFailed();
((UIInput) context.getViewRoot().findComponent(clientId)).setValid(false);
或者,为了满足具体的功能要求
我有一些输入组件,只有在所有其他情况下执行特定操作时才应该验证它们,它们应该接受每个输入
只需使用普通的验证器,在其中检查调用的操作:
public void validate(FacesContext context, UIComponent component, Object value) {
if (!context.getExternalContext().getRequestParameterMap().containsKey("formId:buttonId")) {
return;
}
// ...
}
即,当调用时,将执行验证。这总比在错误的地方执行验证好。谢谢您的提示,我必须使用第一种方法,因为第二种方法不起作用,因为我必须检查一些必填字段,而它们的问题是,周围的组件a rich:tabPanel with switchType=ajax将提交它的完整内容,因此我在更改选项卡时也会寻找按钮,我无法以任何方式影响它,至少目前不能。不管怎样,对于不同的脸型,不同的风格对你来说不是很有趣吗?我认为通过消息突出显示组件可能有用,而不仅仅是在组件无效时。