Xpages 将编辑框控件绑定到托管bean中的特定向量元素?

Xpages 将编辑框控件绑定到托管bean中的特定向量元素?,xpages,managed-bean,Xpages,Managed Bean,我有一个测试分数向量,作为我作业类的属性 我在xpage上有一个编辑框,我想在其中编辑值并写回托管bean中的向量。编辑框的值绑定为: 其中rpt是我的bean中的赋值对象。编辑框位于重复控件中,因为我不知道每次有多少学生参加考试。因此,我使用repeat控件的rowIndex来确定要绑定到分数向量的哪个元素 它正确地读取了分数向量中的值,但我似乎无法更改该值并将其写回向量 如何让它将值写回作业类的Scores[n]元素 以下是my bean中的作业类: package com.logickey

我有一个测试分数向量,作为我作业类的属性

我在xpage上有一个编辑框,我想在其中编辑值并写回托管bean中的向量。编辑框的值绑定为:
其中
rpt
是我的bean中的赋值对象。编辑框位于重复控件中,因为我不知道每次有多少学生参加考试。因此,我使用repeat控件的
rowIndex
来确定要绑定到分数向量的哪个元素

它正确地读取了分数向量中的值,但我似乎无法更改该值并将其写回向量

如何让它将值写回作业类的Scores[n]元素

以下是my bean中的作业类:

package com.logickey.gradebook;

import java.io.Serializable;
import java.util.Vector;


public class Assignment implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = -1500382996574385949L;
    private String Name;
    private String Teacher;
    private String AssignNum;
    private String AssignDate;
    private Vector<String> Scores;

    public Assignment() {
        Name = "";
        Teacher = "";
        AssignNum = "";
        AssignDate = "";
        Scores = new Vector<String>();
    }
    public Assignment(String name, String teacher, String assignNum, String assignDate, Vector<String> scores){
        Name = name;
        Teacher = teacher;
        AssignNum = assignNum;
        AssignDate = assignDate;
        Scores = scores;
    }


    public String getName() {
        return Name;
    }

    public void setName(String name) {
        Name = name;
    }

    public String getTeacher() {
        return Teacher;
    }

    public void setTeacher(String teacher) {
        Teacher = teacher;
    }

    public String getAssignNum() {
        return AssignNum;
    }

    public void setAssignNum(String assignNum) {
        AssignNum = assignNum;
    }

    public String getAssignDate() {
        return AssignDate;
    }

    public void setAssignDate(String assignDate) {
        AssignDate = assignDate;
    }


    public Vector<String> getScores() {
        return Scores;
    }

    public void addScore(String input) {
        if (Scores==null) {
            Scores = new Vector<String>();
        }
        Scores.add(input);
    }


}
package com.logickey.gradebook;
导入java.io.Serializable;
导入java.util.Vector;
公共类分配实现了可序列化{
/**
* 
*/
私有静态最终长serialVersionUID=-1500382996574385949L;
私有字符串名称;
私人弦乐教师;
私有字符串AssignNum;
私有字符串赋值日期;
私有向量分数;
公开转让(){
Name=“”;
教师=”;
AssignNum=“”;
转让日期=”;
分数=新向量();
}
公开作业(字符串名称、字符串教师、字符串赋值编号、字符串赋值日期、向量分数){
名称=名称;
教师=教师;
AssignNum=AssignNum;
AssignDate=AssignDate;
分数=分数;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
名称=名称;
}
公共字符串getTeacher(){
归国教师;
}
公共空白设置器(字符串教师){
教师=教师;
}
公共字符串getAssignNum(){
返回AssignNum;
}
公共void setAssignNum(字符串assignNum){
AssignNum=AssignNum;
}
公共字符串getAssignDate(){
返回日期;
}
public void setAssignDate(字符串assignDate){
AssignDate=AssignDate;
}
公共向量getScores(){
返回分数;
}
公共void addScore(字符串输入){
如果(分数==null){
分数=新向量();
}
分数。添加(输入);
}
}

尝试使用setScores方法,而不是addScores方法。对于可编辑控件,需要一个getter和setter

佩尔是对的。不过,我建议再进一步。您的分数向量可以是自己的类,包括学生姓名和分数

您需要一个getScores()和setScores(Vector newValues)方法。重复控制将注意插入正确的位置

如果使用自定义类,则需要对其使用get/set方法。然后可以绑定字段e。Grpt。学生

您也可以考虑访问集合框架,看看是否有更好的匹配:

  • 向量保持插入顺序
  • 设置:确保没有重复(实现可比较)
  • 树集:使内容自动排序
还有更多,玩得开心

让我们知道它是如何进行的

多亏了,我创建了一个属性为
studentID
value
public class Score{}
,然后将我的分数向量作为
Score
对象的集合,而不是
String
值。然后我将编辑框绑定到
{rpt.scores[rowIndex].value}
现在我可以通过
Score
类的getter和setter获取和设置值

以下是我如何做到这一点的一些细节:

我有一个repeat控件
var=“rowData”indexVar=“rowdex”
和一个嵌套的repeat控件,该控件带有
var=“rpt”indexVar=“rptdex”
,数据源是我的分配对象。然后,对于编辑框的值,我使用了新的
Score
类的
value
属性

短版本的外观如下所示:

<xp:repeat... var="rowData" indexVar="rowIndex" ...>
    <xp:repeat... var="rpt" indexVar="rptIndex" value="#{gbPage.assignments}" ...>
        <xp:inputText id="Input12" value="#{rpt.scores[rowIndex].value}" ...>
        </xp:inputText>
    </xp:repeat>
</xp:repeat>
以下是添加的
分数
一级:

package com.logickey.gradebook;

import java.io.Serializable;

public class Score implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 3888467323290005584L;
    private String StudentID;
    private String Value;

    public Score() {
        StudentID = "";
        Value = ""; 
    }

    public Score(String studentID, String value) {
        StudentID = studentID;
        Value = value;
    }

    public String getStudentID() {
        return StudentID;
    }

    public void setStudentID(String studentID) {
        StudentID = studentID;
    }

    public String getValue() {
        return Value;
    }

    public void setValue(String value) {
        Value = value;
    }

}

repeat控件不需要绑定到您的rpt对象,但是rpt.ScoresStephan是正确的:术语“bean”指的是遵守一组约定的Java类,您已经遵循了其中两个约定:无参数构造函数和实现Serializable。第三种方法是将所有属性包装在“getter”和“setter”中。如果没有getter和setter,那么它就不是bean,而是POJO(“纯旧Java对象”)。术语“托管bean”只是意味着Domino正在为您管理变量名和范围,但将其注册为托管bean并不意味着它就是一个bean。。。遵守bean约定使其成为bean。:)谢谢Stephan,你的建议非常有用。我一直在编写lotusscript,我仍在学习Domino/XPages开发的Java方面。很好,我希望您尝试一点修改。与其绑定到“assignment”,不如绑定到“assignment.scores”,然后再绑定到“#{rpt.value}”->,这样就不需要读取两个变量了
package com.logickey.gradebook;

import java.io.Serializable;

public class Score implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 3888467323290005584L;
    private String StudentID;
    private String Value;

    public Score() {
        StudentID = "";
        Value = ""; 
    }

    public Score(String studentID, String value) {
        StudentID = studentID;
        Value = value;
    }

    public String getStudentID() {
        return StudentID;
    }

    public void setStudentID(String studentID) {
        StudentID = studentID;
    }

    public String getValue() {
        return Value;
    }

    public void setValue(String value) {
        Value = value;
    }

}