将自定义控件中的编辑框动态绑定到托管 bean

2024-02-08

我读过许多关于在自定义控件中动态绑定字段的优秀帖子和文章,但它们都假设了文档数据源。

我想允许托管 bean 数据源的可能性。我尝试将属性类型设置为com.ibm.xsp.model.DataSource or com.ibm.xsp.extlib.model.ObjectDataSource这些都不适用于以下 xml:

<xp:inputText
    id="input"
    value="${compositeData.dsn[compositeData.fieldName]}"
>
</xp:inputText>

在使用控件的地方,我已经传入了自定义数据,如下所示:

<xc:input
    dsn="#{issue}"
    fieldName="Database"
>
</xc:input>

出于测试目的,我有一个名为的托管 beanissue我称我的领域为Database。我通常会绑定到#{issue.Database}但我不知道如何动态地做到这一点。理想情况下,我也想支持文档数据源,但如果我不能同时支持这两项,那么我需要绑定到托管 bean。

编辑:问题似乎是数组符号。如果我将我的值硬编码为#{issue.Database}它有效,但如果我将其硬编码为#{issue[Database]}它失败。所以问题是是否有点符号的替代表示法。我今天没有时间,但我想知道如果我只是将 #{issue} 传递到 dsn 并将其用作我的数据绑定而不是分离 dsn 和 fieldName 是否可行?当我有机会时我会尝试。

Edit2:看来问题可能与我正在使用的bean有关,我将在这里发布代码。

抽象映射模型

public abstract class AbstractMapModel implements Serializable, DataObject {
    private static final long serialVersionUID = 1L;
    private Map<Object, Object> values;

    public Class<?> getType(final Object key) {
        Class<?> result = null;
        if (getValues().containsKey(key)) {
            Object value = getValues().get(key);
            if (value != null) {
                result = value.getClass();
            }
        }
        return result;
    }

    protected Map<Object, Object> getValues() {
        if (values == null) {
            values = new HashMap<Object, Object>();
        }
        return values;
    }

    public Object getValue(final Object key) {
        return getValues().get(key);
    }

    public boolean isReadOnly(final Object key) {
        return false;
    }

    public void setValue(final Object key, final Object value) {
        getValues().put(key, value);
    }
}

抽象文档地图模型

public abstract class AbstractDocumentMapModel extends AbstractMapModel {
private static final long serialVersionUID = 1L;
private String unid;

public AbstractDocumentMapModel() {
    String documentId = ExtLibUtil.readParameter(FacesContext
            .getCurrentInstance(), "id");
    if (StringUtil.isNotEmpty(documentId)) {
        load(documentId);
    }
}

protected abstract String getFormName();

public String getUnid() {
    return unid;
}

public void setUnid(String unid) {
    this.unid = unid;
}

public void load(final String unid) {
    setUnid(unid);
    Document doc = null;
    try {
        if (StringUtil.isNotEmpty(getUnid())) {
            doc = ExtLibUtil.getCurrentDatabase().getDocumentByUNID(
                    getUnid());
            DominoDocument wrappedDoc = DominoDocument.wrap(doc
                    .getParentDatabase().getFilePath(), // databaseName
                    doc, // Document
                    null, // computeWithForm
                    null, // concurrencyMode
                    false, // allowDeleteDocs
                    null, // saveLinksAs
                    null // webQuerySaveAgent
                    );
            for (Object eachItem : doc.getItems()) {
                if (eachItem instanceof Item) {
                    Item item = (Item) eachItem;
                    String itemName = item.getName();
                    if (!("$UpdatedBy".equalsIgnoreCase(itemName) || "$Revisions"
                            .equalsIgnoreCase(itemName))) {
                        setValue(item.getName(), wrappedDoc.getValue(item
                                .getName()));
                    }
                    DominoUtil.incinerate(eachItem);
                }
            }
        }
    } catch (Throwable t) {
        t.printStackTrace();
    } finally {
        DominoUtil.incinerate(doc);
    }
}

protected boolean postSave() {
    return true;
}

protected boolean querySave() {
    return true;
}

public boolean save() {
    boolean result = false;
    if (querySave()) {
        Document doc = null;
        try {
            if (StringUtil.isEmpty(getUnid())) {
                doc = ExtLibUtil.getCurrentDatabase().createDocument();
                setUnid(doc.getUniversalID());
                doc.replaceItemValue("Form", getFormName());
            } else {
                doc = ExtLibUtil.getCurrentDatabase().getDocumentByUNID(
                        getUnid());
            }
            for (Entry<Object, Object> entry : getValues().entrySet()) {
                String itemName = entry.getKey().toString();
                doc.replaceItemValue(itemName, DominoUtil
                        .toDominoFriendly(entry.getValue()));
            }
            if (doc.save()) {
                result = postSave();
            }
        } catch (Throwable t) {
            t.printStackTrace();
        } finally {
            DominoUtil.incinerate(doc);
        }
    }
    return result;
}

}

问题模型

public class IssueModel extends AbstractDocumentMapModel implements
    Serializable {
private static final long serialVersionUID = 1L;

@Override
protected String getFormName() {
    return "frmIssue";
}

@Override
protected boolean querySave() {
    return super.querySave();
}

@Override
public boolean isReadOnly(final Object key) {
    boolean result = super.isReadOnly(key);
    /**
     * Implement read only logic here as follows
     * 
     * if ("jobTitle".equalsIgnoreCase((String) key)) { if
     * (!ExtLibUtil.getXspContext().getUser().getRoles().contains("[HR]")) {
     * result = true; } }
     */
    return result;
}

}

cc字段集

<?xml version="1.0" encoding="UTF-8"?>
<xp:view
    xmlns:xp="http://www.ibm.com/xsp/core"
>
    <div
        class="form-group"
    >
        <xp:label
            id="label"
            for="input"
            value="${compositeData.label.text}"
        >
            <xp:this.styleClass><![CDATA[${javascript:styleClass = "control-label col-" + compositeData.sz + "-" + compositeData.label.columns;
return styleClass;}]]></xp:this.styleClass>
        </xp:label>
        <xp:div>
            <xp:this.styleClass><![CDATA[${javascript:styleClass = "col-" + compositeData.sz + "-" + compositeData.input.columns;
return styleClass;}]]></xp:this.styleClass>
            <xp:inputText
                id="input"
            >
                <xp:this.value><![CDATA[${javascript:"#{"+compositeData.BindTo+"}"}]]></xp:this.value>
                <xp:this.styleClass><![CDATA[${javascript:styleClass = "input-" + compositeData.sz;
return styleClass;}]]></xp:this.styleClass>
            </xp:inputText>
        </xp:div>
    </div>
</xp:view>

xpage 中的工作区域

            <div
            class="form-group"
        >
            <xp:label
                value="Database"
                id="database_Label1"
                for="database1"
                styleClass="col-sm-2 control-label"
            >
            </xp:label>
            <div
                class="col-sm-6"
            >
                <xp:inputText
                    value="#{issue.Database}"
                    id="database1"
                    styleClass="input-sm"
                >
                </xp:inputText>
            </div>
        </div>

ccFieldset 在 xpage 中不起作用

            <xc:fieldset sz="md">
                <xc:this.input>
                    <xc:input
                        columns="10"
                        bindTo="issue.Database"
                    >
                    </xc:input>
                </xc:this.input>
                <xc:this.label>
                    <xc:label
                        columns="2"
                        text="test"
                    >
                    </xc:label>
                </xc:this.label>
            </xc:fieldset>

诀窍是传递一个字符串作为参数,该参数将是您要使用的 EL。假设您有一个参数 bindTo 作为 String,其值为 myBean.Color

  <xp:this.value><![CDATA[${javascript:"#{"+compositeData.BindTo+"}"}]]></xp:this.value>

$ 将首先计算并用实际值替换compositeData。该方法的优点是:适用于任何 EL。 Document Bean 等,因此您的自定义控件不需要对其容器进行任何假设。

因此,您可以使用各种绑定来调用组件:

 <xc:myComponent BindTo="document1.subject"></xc:myComponent>
 <xc:myComponent BindTo="viewScope.someVariable"></xc:myComponent>
 <xc:myComponent BindTo="myBean.Color"></xc:myComponent>

让我们知道这对您有何作用!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将自定义控件中的编辑框动态绑定到托管 bean 的相关文章

随机推荐

  • 尝试快速将协议添加到类签名中

    我正在尝试快速创建应用内购买 在我的班级签名中 我有以下内容 class ViewController UIViewController UITextFieldDelegate UIAlertViewDelegate SKStoreProd
  • 在 Tensorboard 投影仪中可视化 Gensim Word2vec 嵌入

    我只看到了几个提出这个问题的问题 但没有一个有答案 所以我想我不妨尝试一下 我一直在使用 gensim 的 word2vec 模型来创建一些向量 我将它们导出为文本 并尝试将其导入到嵌入投影仪的张量流实时模型中 一个问题 没用 它告诉我张量
  • nginx 背后的 ASP.NET 5

    我在 Nginx 服务器后面有一个 ASP NET 5 MVC6 应用程序 充当反向代理 它的配置是 server listen 80 server name example com location proxy pass http loc
  • 使用 Mockito 和 PowerMockito 模拟类对象

    是否可以使用 Mockito 和 或 PowerMockito 模拟类对象 就像是 Class
  • Java泛型如何接受泛型参数中的任何派生类型

    在下面2行代码中 HashMap
  • Eclipse 如何终止正在运行的程序?

    在 Eclipse 中 当您运行程序时 有一个漂亮的红色方形按钮可以停止它 我想知道这是如何做到的 Eclipse 是否只是残酷地杀死相应的进程 或者在温和地要求它终止自身或其他什么之前对进程状态进行一些很好的安全验证 是的 Eclipse
  • Docker postgres 无效的主检查点记录

    我一直在尝试让 postgres 在 Docker 在 Windows 上 中运行并具有持久数据存储 并认为我终于拥有了它 但现在当我尝试启动容器时 出现以下错误 LOG invalid primary checkpoint record
  • 是否可以将自定义元数据添加到 Lucene 字段?

    我已经到了需要存储一些有关 Lucene Net 索引中特定字段来自何处的附加数据的地步 具体来说 我想在将字段添加到文档时将 guid 附加到文档的某些字段 并在从搜索结果中获取文档时再次检索它 这可能吗 Edit 好吧 让我举个例子来澄
  • 如何动态更改引导程序模态体

    所以我将 Bootstrap 模态定义为 div class modal fade div class modal dialog modal sm div class modal content div class modal header
  • 如何在Android应用程序中读取和使用网站内容

    我实际上必须在 Android 应用程序中阅读和使用某些网站的内容 到目前为止 我主要使用两种不同的代码来获取网站的内容 但它们对我不起作用 public static String connect String url String re
  • 将 django 默认 pk 与 AutoField 更改为 BigAutoField

    我的模型有一个带有 AutoField 整数 的默认 pk 但后来我发现我需要使用 BigAutoField 然后我还有引用学生模型的其他模型的数据 我如何将 pk 字段更改为 BigAutoField 并反映在其他引用模型上 class
  • 当我尝试使用 vue js 显示 JSON 数据时,Selectpicker 不起作用?

    当我写 selectpicker selectpicker refresh 时在控制台中它正在加载 我应该在哪里提供此代码 我的 HTML 代码是
  • 错误 1045 (28000):用户“root”@“localhost”的访问被拒绝

    所以我第一次安装了MySQL应用程序 首先我看到命令行客户端没有打开 所以我寻找解决方案 他们说我必须进入 bin 目录并手动运行它 在我运行cmd之后mysql uroot p运行它并输入密码 它给了我错误 错误 1045 28000 用
  • 剪刀石头布 - Python 3 - 初学者

    我想模拟一个石头剪刀布游戏 这就是我到目前为止所拥有的 它不允许我在其中输入字母scoregame功能 我怎样才能解决这个问题 def scoregame player1 player2 if player1 R and player2 R
  • 防止选项卡循环浏览地址栏

    我意识到这可能是一个可访问性问题 最好不要管它 但我想弄清楚是否可以阻止选项卡在选项卡循环中访问地址栏 我的应用程序有另一种循环输入区域的方法 但许多新用户本能地尝试使用该选项卡 但它无法按预期工作 这是一个通用的 jquery 实现 您不
  • Selenium Instagram 机器人 - 单击“喜欢”按钮

    我已经编写了一个程序来访问 Instagram 探索页面 并喜欢前六张照片 现在 我正在使用这种相当复杂的方法来查找 喜欢 按钮 我更愿意将其格式化为 单击登录按钮 部分 到目前为止 我已经尝试检查各种元素 但我无法确定正确的元素以使其唯一
  • Chart.js 圆环图大小调整

    我在用着ng2 图表 https github com valor software ng2 charts在 Angular 项目中 我有该项目的两个版本 当前的生产版本是旧版本 并且使用旧版本的 ng2 charts 以及扩展的 Char
  • Rust 中与闭包和生命周期作斗争

    我正在尝试将一些基准测试从 F 移植到 Rust F 代码如下所示 let inline iterNeighbors f i j f i 1 j f i 1 j f i j 1 f i j 1 let rec nthLoop n s1 Ha
  • 休息删除线

    是否可以在重组文本中删除文本 例如呈现为
  • 将自定义控件中的编辑框动态绑定到托管 bean

    我读过许多关于在自定义控件中动态绑定字段的优秀帖子和文章 但它们都假设了文档数据源 我想允许托管 bean 数据源的可能性 我尝试将属性类型设置为com ibm xsp model DataSource or com ibm xsp ext