将 linkedhashset 作为多值返回到 xpage
returning a linkedhashset to xpage as multivalue
在我的应用程序中,我将一个对象的 属性 定义为 LinkedHashSet。 属性 我用多值字段中的值填充:
Vector<String> ctrs = doc.getItemValue("countries");
LinkedHashSet<String> items = new LinkedHashSet<String>();
for (int i = 0; i < ctrs.size(); i++){
items.add(ctrs.get(i));
}
employee.setCountry(items);
在 XPage 上,我想显示如下值:
<xp:inputText id="inputCountries" value="#{employeeBean.employee.Country}">
<xp:this.multipleSeparator><![CDATA[#{javascript:var val = getComponent("contractType").getValue();
if (val == "Multi"){
return ",";
}}]]></xp:this.multipleSeparator>
</xp:inputText>
根据员工的类型,此字段可能是单值或多值。
查看XPage时返回值显示如下:
[瑞典、丹麦、爱沙尼亚]
当然我会把它显示为多值。我应该怎么做才能纠正这个问题?
如果您将 HashSet 转换为数组,那么它应该可以工作
举个例子,第一个是单值/第二个是多值字段:
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
<xp:inputText id="singleValue" multipleSeparator=",">
<xp:this.value><![CDATA[#{javascript:var items:java.util.Set = new java.util.LinkedHashSet();
items.add("Sweden");
return items.toArray();}]]>
</xp:this.value>
</xp:inputText>
<br></br>
<br></br>
<xp:inputText id="multiValue" multipleSeparator=",">
<xp:this.value><![CDATA[#{javascript:var items:java.util.Set = new java.util.LinkedHashSet();
items.add("Sweden");
items.add("Denmark");
items.add("Estonia");
return items.toArray();}]]>
</xp:this.value>
</xp:inputText>
</xp:view>
浏览器上的输出如下:
Sweden
Sweden,Denmark,Estonia
如果您只想查看数据
选项 1:使用 @Iplode 和一些分隔符、逗号或 <br/>
拆分值应该有效。
选项 2:对自定义呈现使用重复:多个计算文本、div 或 table。
如果您想编辑数据
您需要使用重复。在这种情况下,如果您想绑定输入,则需要为您的 bean 实现 Map 接口。好书在这里:https://www.mindoo.com/web/blog.nsf/dx/16.07.2009095816KLEBCY.htm?opendocument&comments
您必须使用 List 而不是 Set。
此外,除非您使用 LinkedHashSet 作为从 Vector 中删除重复值的方法,否则您可以只将 setCountry
方法传递给向量,因为 Vector
实现了 List
:
// setting country method
yourBlock() {
// It's better to use interface instead of implementation for the variable
List<String> countries = doc.getItemValue("countries");
setCountries(countries);
}
如果您确实使用 LinkedHashSet
作为获取唯一值的方式,您需要稍微调整上面的代码。
// setting country method
yourBlock() {
List<String> countries = doc.getItemValue("countries");
setCountries(new ArrayList<String>(new LinkedHashSet<String>(countries)));
}
在我的应用程序中,我将一个对象的 属性 定义为 LinkedHashSet。 属性 我用多值字段中的值填充:
Vector<String> ctrs = doc.getItemValue("countries");
LinkedHashSet<String> items = new LinkedHashSet<String>();
for (int i = 0; i < ctrs.size(); i++){
items.add(ctrs.get(i));
}
employee.setCountry(items);
在 XPage 上,我想显示如下值:
<xp:inputText id="inputCountries" value="#{employeeBean.employee.Country}">
<xp:this.multipleSeparator><![CDATA[#{javascript:var val = getComponent("contractType").getValue();
if (val == "Multi"){
return ",";
}}]]></xp:this.multipleSeparator>
</xp:inputText>
根据员工的类型,此字段可能是单值或多值。
查看XPage时返回值显示如下:
[瑞典、丹麦、爱沙尼亚]
当然我会把它显示为多值。我应该怎么做才能纠正这个问题?
如果您将 HashSet 转换为数组,那么它应该可以工作
举个例子,第一个是单值/第二个是多值字段:
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
<xp:inputText id="singleValue" multipleSeparator=",">
<xp:this.value><![CDATA[#{javascript:var items:java.util.Set = new java.util.LinkedHashSet();
items.add("Sweden");
return items.toArray();}]]>
</xp:this.value>
</xp:inputText>
<br></br>
<br></br>
<xp:inputText id="multiValue" multipleSeparator=",">
<xp:this.value><![CDATA[#{javascript:var items:java.util.Set = new java.util.LinkedHashSet();
items.add("Sweden");
items.add("Denmark");
items.add("Estonia");
return items.toArray();}]]>
</xp:this.value>
</xp:inputText>
</xp:view>
浏览器上的输出如下:
Sweden
Sweden,Denmark,Estonia
如果您只想查看数据
选项 1:使用 @Iplode 和一些分隔符、逗号或 <br/>
拆分值应该有效。
选项 2:对自定义呈现使用重复:多个计算文本、div 或 table。
如果您想编辑数据
您需要使用重复。在这种情况下,如果您想绑定输入,则需要为您的 bean 实现 Map 接口。好书在这里:https://www.mindoo.com/web/blog.nsf/dx/16.07.2009095816KLEBCY.htm?opendocument&comments
您必须使用 List 而不是 Set。
此外,除非您使用 LinkedHashSet 作为从 Vector 中删除重复值的方法,否则您可以只将 setCountry
方法传递给向量,因为 Vector
实现了 List
:
// setting country method
yourBlock() {
// It's better to use interface instead of implementation for the variable
List<String> countries = doc.getItemValue("countries");
setCountries(countries);
}
如果您确实使用 LinkedHashSet
作为获取唯一值的方式,您需要稍微调整上面的代码。
// setting country method
yourBlock() {
List<String> countries = doc.getItemValue("countries");
setCountries(new ArrayList<String>(new LinkedHashSet<String>(countries)));
}