我正在开发一个JSF页面,其中包含基于List<SelectItem>
的下拉列表:
<h:selectOneMenu value="#{bean.selectedItem}">
<f:selectItems value="#{bean.availableItems}" />
</h:selectOneMenu>
我需要两者当前所选项目的值和标签。现在我只得到价值。我怎样才能获得标签?
答案 0 :(得分:45)
你做不到。这就是HTML的工作原理。你知道,JSF是一个HTML代码生成器。 JSF <h:selectOneMenu>
生成HTML <select><option>
。 HTML <select>
元素只会发送所选value
元素的<option>
属性。它不会发送它的标签。
但这应该不是一个大问题。你就是已经知道#{bean.availableItems}
内服务器端的值和标签。获取关联标签所需要做的就是将值作为键来获取。我建议将其设为Map
,而f:selectItems
也可以使用public class Bean {
private String selectedItem; // +getter +setter
private Map<String, String> availableItems; // +getter
public Bean() {
availableItems = new LinkedHashMap<String, String>();
availableItems.put("value1", "label1");
availableItems.put("value2", "label2");
availableItems.put("value3", "label3");
}
public void submit() {
String selectedLabel = availableItems.get(selectedItem);
// ...
}
}
。
基本启动示例:
<h:selectOneMenu value="#{bean.selectedItem}">
<f:selectItems value="#{bean.availableItems.entrySet()}" var="entry"
itemValue="#{entry.key}" itemLabel="#{entry.value}" />
</h:selectOneMenu>
与
<p>Selected label is #{bean.availableItems[bean.selectedItem]}</p>
和结果
{{1}}
另一种方法是将名称和值都包装在表示实体的javabean对象中,并通过转换器将整个对象设置为值。
答案 1 :(得分:4)
而不是使用Map我试过这样,通过在selectItems标签中使用“ItemValue”属性,我完全可以在同一属性中获取ItemValue和ItemLabel。如何在ItemLabel中没有提供额外的逗号< /strong>(@asfas....i你提到了同样的问题所以我选择了这种方法)。
<h:selectOneMenu value="#{company.issueDesc}" required="true" onchange="submit()">
<f:selectItem itemLabel="-- Select a Issue -- " itemValue="0"/>
<f:selectItems value="#{company.issueList}" var="model" itemLabel="#{model.IssueDesc}" itemValue="#{model.Code},#{model.IssueDesc}" >
</f:selectItems>
</h:selectOneMenu>
基本上,IssueDesc是Bean Company中的字符串类型
public Class Company{
private String issueDesc; // getters and setters
private int code; // getters and setters
private List<T>issueList; // getters and setters.
public void getLblandVal(){
String desc=getIssueDesc();
String[] str_ary=desc.split(",");
String s1=str_ary[0];
String s2=str_ary[1];
// parse **s1** to int;
}
}
答案 2 :(得分:2)
如果值应为Integer并且标签为String,那么在支持bean中需要两者。在bean中使用Map不起作用,因为JSF将map键解释为label。理想情况下,它将是一个LinkedHashMap并用数字搜索文本。
似乎上下颠倒以文本(键)搜索数字(值)。如果JSF的某些实现由于某种原因增加了额外的空间来测试或更改大小写更改。然后从地图中找不到该值。
答案 3 :(得分:1)
使用 List&lt; SelectItem&gt; 获取值和标签时,以下方法也可能有用:
这里,facade,statesFacade从数据库/企业bean中获取状态列表。
在视图中(xhtml页面):
<h:selectOneMenu id="statesSelectUi" value="#{applicationBean1.state}">
<f:selectItems value="#{applicationBean1.stateSelectItems}"/>
<f:ajax render="selectedItem" event="change" execute="statesSelectUi"/>
</h:selectOneMenu>
<br/>
<br/>
<h:outputText id="selectedItem" value="#{applicationBean1.selectedState}"/>
在Managed Bean(applicationBean1.java)中:
private String state;
/**
* @return the stateSelectItems
*/
public List<SelectItem> getStateSelectItemsItems() {
stateSelectItems.add(new SelectItem("-1","--- Select state ---"));
int statesCount = statesFacade.count();
List<StateSelectItems> states;
states = statesFacade.findAll();
for (int i = 0; i < statesCount; i++) {
stateSelectItems.add(new SelectItem(states.get(i).getStateSlNo(), states.get(i).getStateName()));
}
return stateSelectItems;
}
public String getSelectedState(){
if("".equals(getState()) || getState() ==null){
return "";
}else{
return "Selected State : " + getStateSelectItems.get(Integer.parseInt(getState())).getValue()+", "++ getStateSelectItems.get(Integer.parseInt(getState())).getLabel();
}
}
答案 4 :(得分:1)
这样就可以了。
criteriaMap
在您的示例中,您将把availableItems作为'list'传递,selectedItem作为'selection'传递。此方法将返回与selectedItem对应的标签值。