如何使用XPages Java代码在自定义控件内设置输入控件的有效方法?

如何使用XPages Java代码在自定义控件内设置输入控件的有效方法?,java,twitter-bootstrap,xpages,Java,Twitter Bootstrap,Xpages,好吧,这是个奇怪的问题 在XPages中,我的数据源是一个Java对象。托管bean或页面控制器。我正在通过Ext.Library使用引导 我想做的是将所有验证代码保存在Java对象中,而不是将任何内容附加到XPage上的控件。在java对象内部,我可以通过以下方式添加任何错误消息: FacesContext.getCurrentInstance().addMessage 因此,任何错误都可以通过控件显示 但如果我想向特定(单一)控件发送消息,我不知道如何将目标锁定在单个控件上 实际上,我希望能

好吧,这是个奇怪的问题

在XPages中,我的数据源是一个Java对象。托管bean或页面控制器。我正在通过Ext.Library使用引导

我想做的是将所有验证代码保存在Java对象中,而不是将任何内容附加到XPage上的控件。在java对象内部,我可以通过以下方式添加任何错误消息: FacesContext.getCurrentInstance().addMessage

因此,任何错误都可以通过控件显示

但如果我想向特定(单一)控件发送消息,我不知道如何将目标锁定在单个控件上

实际上,我希望能够将此示例用于引导字段自定义控件:

在我的Java类中设置isValid方法,这样引导字段通过has error样式呈现为红色

对于自定义控件中的输入控件,或者甚至是让我通过java验证但控件字段样式的替代方法,如果您能提供任何关于如何访问isValid的建议,我将不胜感激


谢谢

我所做的是为组件使用自定义验证器。比如说,

<xp:this.validators>
    <xp:customValidator validate="#{javascript:controller.validateDuration(this)}"></xp:customValidator>
</xp:this.validators>
BeanUtils使特定组件无效并生成验证错误消息的方法:

public static void setControlInvalid(UIComponent editableComponent, String message) {
    if(StringUtil.isEmpty(message) || editableComponent==null) return;

    if(editableComponent instanceof EditableValueHolder) {
        ((EditableValueHolder) editableComponent).setValid(false);
        postFacesMessage(editableComponent, FacesMessage.SEVERITY_ERROR, message);
    }

}

public static void postFacesMessage(UIComponent component, Severity severity, String msg) {
    if(StringUtil.isEmpty(msg) || component==null) return;

    FacesContext fc=FacesContext.getCurrentInstance();

    FacesMessage message=new FacesMessage(severity, msg, msg);
    fc.addMessage(component.getClientId(fc), message);
}

任何UIComponent都有一个
setValid(布尔)
方法。所有控件都有一个
binding
属性,可用于将该组件绑定到Java对象,例如bean中的属性

但是,如果自定义控件被多次使用,则不能使用它,因为所有实例都将尝试绑定到同一个bean属性

但是,只要有一点狡猾的想法,就有可能利用同样的概念。如果您的bean有一个
映射myCunningBindings
,您可以在loaded属性中使用此代码动态添加绑定集合:

<this.loaded><![CDATA[${javascript:myBean.getMyCunningBindings().put(compositeData.fieldMapping, this);
return "";}]]>
</xp:this.loaded>

因此,代码的第一行获取映射并添加一个元素。该元素有一个值(组件本身)和一个标签。对于标签,我们得到的字段映射也可能是通过
compositeData
传入的。最后,我们返回true


进行验证的bean应该知道它保存到哪里,因此您应该能够计算传递到compositeData的字段映射,这将是您需要在映射中查找的键。从这里开始,您可以调用setValid(false)组件。

Jesse Gallagher在我之前到达这里,感谢Paul和Jesse。非常有趣。我也在消化。虽然我开始怀疑我是否真的需要这个组件,没有它就不能得到同样的结果。谢谢Serdar。我正在消化这个。我不确定如何在自定义控件中使用编辑控件。我想我得用电脑以某种方式来计算身份证,但我不确定。我想我可能有另一种方法,我现在正在试验。
<this.loaded><![CDATA[${javascript:myBean.getMyCunningBindings().put(compositeData.fieldMapping, this);
return "";}]]>
</xp:this.loaded>