Fからラベルと値の両方を取得する方法:selectItems
-
01-10-2019 - |
質問
私は、に基づいてドロップダウンがあるJSFページに取り組んでいます List<SelectItem>
:
<h:selectOneMenu value="#{bean.selectedItem}">
<f:selectItems value="#{bean.availableItems}" />
</h:selectOneMenu>
取得する必要があります 両方とも 現在選択されているアイテムの値とラベル。今、私は価値を得るだけです。ラベルも入手できますか?
解決
できません。それがまさに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>
別の方法は、エンティティを表すJavabeanオブジェクトに名前と値の両方をラップし、コンバーターを介してオブジェクト全体を値として設定することです。
参照:
他のヒント
マップを使用する代わりに、私はこのように試しましたが、SelectITEMSタグで「itemValue」属性を使用して、ItemValueとItemLabelの両方を同じプロパティで取得するために完全に機能しています。アイテムラベルに追加のコンマが提供されませんでした(@asfas ....私はあなたが言及したのと同じ問題があったので、私はこのアプローチを選択しました).
<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;
}
}
値が整数とラベル文字列であり、両方がBeanのバッキングに必要な場合はどうなりますか。 JSFがマップキーをラベルとして解釈するため、BeanでMAPを使用することは機能しません。理想的には、LinkedHashmapであり、数字でテキストを検索します。
テキスト(キー)で検索番号(値)に逆さまに見えます。 JSFのいくつかの実装が、何らかの理由でテストまたはレターケースの変更に追加のスペースを追加した場合はどうなりますか。その後、値はマップから見つかりません。
以下のアプローチは、価値とラベルを取得するのにも役立つ場合があります リストu003CSelectItem>:
ここでは、ファサード、STATESFACADEは、データベース/エンタープライズビーンから州のリストを取得します。
ビュー(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}"/>
マネージドビーン(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();
}
}
これはトリックを行います。
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;
}
あなたの例では、利用可能な項目で「リスト」として渡され、selectedItemは「選択」として渡されます。この方法は、selectedItemに対応するラベル値を返します。