Jsf 如何从f:selectItems获取标签和值
我正在处理一个JSF页面,该页面有一个基于Jsf 如何从f:selectItems获取标签和值,jsf,label,selectonemenu,Jsf,Label,Selectonemenu,我正在处理一个JSF页面,该页面有一个基于列表的下拉列表: 我需要同时获取当前所选项目的值和标签。现在我只得到了价值。我怎样才能得到标签呢?你不能。这就是HTML的工作原理。你知道,JSF是一个HTML代码生成器。JSF生成一个HTML。HTML元素将只发送所选元素的值属性。它不会发送其标签 但这不应该是个大问题。您已经知道服务器端{bean.availableItems}中的值和标签。获取关联标签所需做的只是通过值作为键来获取它。我建议将其设置为一个映射,该映射也可用于f:selectIt
列表的下拉列表
:
我需要同时获取当前所选项目的值和标签。现在我只得到了价值。我怎样才能得到标签呢?你不能。这就是HTML的工作原理。你知道,JSF是一个HTML代码生成器。JSF
生成一个HTML
。HTML
元素将只发送所选
元素的值
属性。它不会发送其标签
但这不应该是个大问题。您已经知道服务器端{bean.availableItems}
中的值和标签。获取关联标签所需做的只是通过值作为键来获取它。我建议将其设置为一个映射
,该映射也可用于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);
// ...
}
}
公共类Bean{
私有字符串selectedItem;//+getter+setter
私有映射可用项;//+getter
公共豆(){
availableItems=新建LinkedHashMap();
有效的资产负债表(“价值1”、“标签1”);
有效的资产负债表(“价值2”、“标签2”);
有效的资产负债表(“价值3”、“标签3”);
}
公开作废提交(){
字符串selectedLabel=availableItems.get(selectedItem);
// ...
}
}
与
结果
<p>Selected label is #{bean.availableItems[bean.selectedItem]}</p>
所选标签为35;{bean.availableItems[bean.selectedItem]}
另一种方法是在表示实体的javabean对象中包装名称和值,并通过转换器将整个对象设置为值
另见:
通过文本(键)搜索数字(值)时似乎颠倒了。如果JSF的某些实现由于某种原因为测试或字母大小写更改添加了额外的空间,该怎么办。然后从映射中找不到值。我没有使用映射,而是这样尝试,通过在selectItems标记中使用“ItemValue”属性,在同一个属性中获取ItemValue和ItemLabel非常有效。但是ItemLabel中没有提供额外的逗号。(@asfas…,我遇到了你提到的同样的问题,所以我选择了这种方法)
在Bean公司中,IssueDesc基本上是字符串类型
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;
}
}
上市公司{
私有字符串issueDesc;//getter和setter
私有int代码;//getter和setter
私有ListissueList;//getter和setter。
public void getLblandVal(){
字符串desc=getIssueDesc();
字符串[]str_ary=desc.split(“,”);
字符串s1=字符串[0];
字符串s2=字符串[1];
//将**s1**解析为int;
}
}
以下方法也可能有助于使用列表获取值和标签:
这里,facade,statesFacade从数据库/企业bean获取状态列表。
在视图中(xhtml页面):
在托管Bean(applicationBean1.java)中:
私有字符串状态;
/**
*@返回stateSelectItems
*/
公共列表getStateSelectItemsItems(){
stateSelectItems.add(新建SelectItem(“-1”),“--selectstate----”);
int statesCount=statesFacade.count();
列出国家名单;
states=statesFacade.findAll();
for(int i=0;i
这样就可以了
private String getLabel(List<SelectItem> list, String selection) {
String label = "";
for (int i = 0; i < list.size(); i++) {
if(selection.equals((String)list.get(i).getValue())) {
label = (String)list.get(i).getLabel();
break;
}
}
return label;
}
private String getLabel(列表,字符串选择){
字符串标签=”;
对于(int i=0;i
在您的示例中,可以将availableItems作为“列表”传入,并将SelectedItems作为“选择”。如果希望标签类似于“label1”,则此方法将返回与selectedItem对应的标签值。
availableItems.put(“value1”,“label1”);
应为availableItems.put(“label1”,“value1”);
和value:“value1”@roadev仅当您不使用给定的
示例时。但这完全解决了最初的问题:能够按值获取标签。您的方法将使其无法再次实现。也许您忘记阅读该问题?请将此添加到已接受的答案中。这是一个(轻微的)它的增强/扩展,而且它本身是纯代码,没有任何解释。为什么会被否决?如果我写了一些不正确的东西让我知道它是什么,那将是很好的。看起来Kukeltje接受它作为一个公认的答案。就我而言,代码已经过测试,并且在使用中没有任何问题。所以,我真的希望关于否决票的一些反馈。我认为有3个原因。当你看到它时,你只是在没有任何上下文的情况下获得标签,甚至这一部分也比接受和40票赞成的答案复杂得多。第三,在jsf中使用SelectItem类是最近的事(自jsf2以来)有点不需要了。所以这是一个很好的老学校。但是…我直接回答了问题。问题是关于SelectItem,S
<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>
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;
}
}
<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}"/>
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();
}
}
private String getLabel(List<SelectItem> list, String selection) {
String label = "";
for (int i = 0; i < list.size(); i++) {
if(selection.equals((String)list.get(i).getValue())) {
label = (String)list.get(i).getLabel();
break;
}
}
return label;
}