【问题标题】:Saving CheckboxGroup values XPages保存 CheckboxGroup 值 XPage
【发布时间】:2014-11-03 16:00:05
【问题描述】:

我正在开发我的第一个 Notes/XPages/Java 应用程序,但我陷入了一些基本的“粗略”级别。以下是托管 bean 的一部分。我可以将数据加载到 XPage,但保存 Checkbox 字段会给我带来问题,即它不会保存。我认为这与数据类型有关,因为 CheckboxGroup 是多值的。

表单字段是: 类别 就业角色

变量

public class TrainingModule implements Serializable {
private String Category;
private Object EmploymentRole;

public String getCategory() {
return Category; }

public void setCategory(final String category) {
Category = category;}

public Object getEmploymentRole() {
return EmploymentRole;}

public void setEmploymentRole(final Object employmentRole) {
EmploymentRole = employmentRole;}

加载方法

public void load(final String unid) {
    setUnid(unid);
    Document doc = null;
    try {
        doc = ExtLibUtil.getCurrentDatabase().getDocumentByUNID(getUnid());
        setCategory(doc.getItemValueString("Category"));
        setEmploymentRole(doc.getItemValue("EmploymentRole"));
etc

保存方法

public boolean saveData() {
    boolean result = false;
    Document doc = null;

    try {

        doc.replaceItemValue("Category", Category);
        doc.replaceItemValue("EmploymentRole", EmploymentRole);

        result = doc.save()

etc

XPage

<xp:checkBoxGroup id="checkBoxGroup1" 
value="#{TrainingModule.employmentRole}">
<xp:selectItem itemLabel="Admin" itemValue="Admin">
</xp:selectItem>
<xp:selectItem itemLabel="Installation" itemValue="Installation">
</xp:selectItem>
<xp:selectItem itemLabel="Proj Man" itemValue="Proj Man">
</xp:selectItem>
</xp:checkBoxGroup>

我知道有类似的帖子,但我似乎无法将它们与我想要实现的目标联系起来。

我的下一个任务将是使用 Java 的上传和下载控件,因此任何要避免的提示或陷阱都会很棒。 任何帮助,将不胜感激。

【问题讨论】:

  • 我假设您故意在保存方法中省略了设置 doc 对象的行?如果没有,那么您也应该实例化您的 doc 对象,因为它现在设置为 null,因此代码不会被执行,而是落入 catch 块中。
  • @OliverBusse 是的,抱歉 Oliver,我试图不放太多代码 - 一个错误。 doc = ExtLibUtil.getCurrentDatabase().getDocumentByUNID(getUnid());

标签: xpages


【解决方案1】:

将您的就业角色定义为ArrayList&lt;String&gt; 类型的字段:

private List<String> employmentRoles = new ArrayList<String>();

public void setEmploymentRoles(List<String> employmentRoles) {
    this.employmentRoles = employmentRoles;
}

public List<String> getEmploymentRoles() {
    return employmentRoles;
}

使用

读取值
setEmploymentRoles(doc.getItemValue("EmploymentRole"));

并用

保存值
doc.replaceItemValue("EmploymentRole", new Vector(getEmploymentRoles()));

顺便说一句,您不应该以大写字母开头的字段名称。在此处查找Java naming conventions

【讨论】:

  • Brilliant Knut 它的工作原理,非常感谢你们的帮助。感谢您提供有关字段名称的提示,我正在将旧应用程序转移到 Java/Xpages,然后我才知道它们都是用大写字母完成的。
  • 请问您如何重置它们,或者用初始值填充它们?
  • @user1699830 您将定义一个 ArrayList 列表,添加值并使用您创建的列表调用 setEmploymentRoles():List&lt;String&gt; list = new ArrayList&lt;String&gt;(); list.add("firstValue"); list.add("secondValue"); setEmploymentRoles(list);
【解决方案2】:

由于您需要加载/保存数据,因此最好使用对象数据源。无论如何试试这个:

public Object[] getEmploymentRole() {
return EmploymentRole;}

public void setEmploymentRole(final Object[] employmentRole) {
EmploymentRole = employmentRole;}

无法将数组强制转换为对象,并且复选框组尝试获取/设置数组。

这会导致您的保存方法略有变化:

    doc.replaceItemValue("Category", Category);
    Vector v = new Vector(Arrays.asList(EmploymentRole));
    doc.replaceItemValue("EmploymentRole", v);

告诉我们进展如何

【讨论】:

  • 您好,我收到了有关 Vector 的警告 - Vector 是原始类型。对泛型 Vector 的引用应该被参数化。但更重要的是,这打破了我的负担——TrainingModule 类型中的方法 setEmploymentRole(Object[]) 不适用于参数 (Vector)
  • 马克,它当然会减轻你的负担。根据更改的保存方法进行思考,您发现负载也需要调整。 Notes Java api 使用原始向量,因此请忽略警告或使用带有注释的推荐
  • 嗨,是的,抱歉,我是 Java 新手,所以这对我来说只是一步之遥,我确实试图弄清楚,但无法到达那里。非常感谢。
  • 在你的负载中你需要 this.EmploymentRole = doc.getItemValue("EmploymentRole").toArray();您还想使用小写字母来启动变量。习惯上只对类名使用大写。 camelCase 很常见,下划线较少
  • 太好了,所有这些 sn-ps 都帮助我提高了学习曲线。我会整理我的案子。我将尝试与上面相同的方法,但是使用 FileUpload 和 Download 控件,我想它不会那么简单,在我开始之前您是否知道任何提示或指示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多