selectitems - selectonemenu jsf ejemplo
Cómo obtener tanto la etiqueta como el valor de f: selectItems (5)
¿Qué pasa si el valor debería ser Entero y la Cadena de etiqueta y ambos son necesarios en el bean de respaldo? El uso de Map en bean no funciona porque JSF interpreta la clave del mapa como una etiqueta. Lo ideal sería un LinkedHashMap y buscar el texto por un número.
Parece invertido para buscar el número (valor) por un texto (clave). ¿Qué sucede si alguna implementación de JSF agrega espacio extra para probar o cambiar los cambios de mayúsculas por alguna razón? Entonces el valor no se encuentra en el mapa.
Estoy trabajando en una página JSF que tiene un menú desplegable basado en la List<SelectItem>
:
<h:selectOneMenu value="#{bean.selectedItem}">
<f:selectItems value="#{bean.availableItems}" />
</h:selectOneMenu>
Necesito obtener tanto el valor como la etiqueta del elemento seleccionado actualmente. Ahora mismo solo obtengo el valor. ¿Cómo puedo obtener la etiqueta, también?
El siguiente enfoque también puede ser útil para obtener valor y etiqueta utilizando List <SelectItem> :
Aquí, Facade, StatesFacade obtiene la lista de estados de la base de datos / enterprise bean.
En la vista (página 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}"/>
En el Bean Managed (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();
}
}
En lugar de utilizar Map, intenté de esta manera y me funciona perfectamente para obtener tanto ItemValue como ItemLabel en la misma propiedad mediante el uso del atributo "ItemValue" en la etiqueta selectItems. Como siempre, no proporcioné comas adicionales en la Etiqueta de elementos ( @asfas .... Tuve el mismo problema que mencionaste, así que seleccioné este enfoque ).
<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>
Básicamente, IssueDesc es un tipo de cadena en 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;
}
}
Esto hará el truco.
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;
}
En su ejemplo, pasaría los artículos disponibles como ''lista'' y el artículo seleccionado como ''selección''. Este método devolverá el valor de etiqueta correspondiente al elemento seleccionado.
Usted no puede Así es como funciona HTML. Ya sabes, JSF es un generador de código HTML. El JSF <h:selectOneMenu>
genera un HTML <select><option>
. El elemento HTML <select>
solo enviará el atributo de value
del elemento <option>
seleccionado. No enviará su etiqueta.
Pero eso no debería ser un gran problema. Es decir, ya conoce el valor y la etiqueta en el lado del servidor, dentro de #{bean.availableItems}
. Todo lo que necesita hacer para obtener la etiqueta asociada es obtenerla por el valor como clave. Sugiero que sea un Map
que a su vez también se puede utilizar en f:selectItems
.
Ejemplo de inicio básico:
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);
// ...
}
}
con
<h:selectOneMenu value="#{bean.selectedItem}">
<f:selectItems value="#{bean.availableItems.entrySet()}" var="entry"
itemValue="#{entry.key}" itemLabel="#{entry.value}" />
</h:selectOneMenu>
y en resultado
<p>Selected label is #{bean.availableItems[bean.selectedItem]}</p>
Una alternativa es envolver tanto el nombre como el valor en un objeto javabean que representa una entidad y establecer el objeto completo como valor, a través de un convertidor.
Ver también:
- Nuestra página wiki de
selectOneMenu
- ¿Cómo llenar las opciones de h: selectOneMenu desde la base de datos?