2010-04-21 13 views
17

En el mismo contexto que tengo otra consultaConjunto desplegable HTML opción seleccionada usando JSTL

<select multiple="multiple" name="prodSKUs"> 
      <c:forEach items="${productSubCategoryList}" var="productSubCategoryList"> 
      <option value="${productSubCategoryList}"${productSubCategoryList == productSubCategoryName ? 'selected' : ''}>${productSubCategoryList}</option> 
     </c:forEach> 
     </select> 

y el ajuste correspondiente en la solicitud es como

for(int i=0;i<userProductData.size();i++){ 
    String productSubCategoryName=userProductData.get(i).getProductSubCategory(); 
    System.out.println(productSubCategoryName); 
    request.setAttribute("productSubCategoryName",productSubCategoryName); 

} 

Aquí he selección múltiple desplegable, aunque Obtengo el valor de retorno de por dos, en la interfaz de usuario solo se está resaltando un dato, no el segundo, ¿qué está mal en el código?

Respuesta

25

Asumiendo que usted tiene una colección $ {papeles} de los elementos para poner en el combo, y $ {seleccionada} el elemento seleccionado, Sería algo así:

<select name='role'> 
    <option value="${selected}" selected>${selected}</option> 
    <c:forEach items="${roles}" var="role"> 
     <c:if test="${role != selected}"> 
      <option value="${role}">${role}</option> 
     </c:if> 
    </c:forEach> 
</select> 

ACTUALIZACIÓN (la siguiente pregunta)

Está sobrescribiendo el atributo "productSubCategoryName". Al final del ciclo for, el último productoSubCategoryName.

Debido a las limitaciones del lenguaje de expresión, creo que la mejor manera de lidiar con esto es utilizar un mapa:

Map<String,Boolean> map = new HashMap<String,Boolean>(); 
for(int i=0;i<userProductData.size();i++){ 
    String productSubCategoryName=userProductData.get(i).getProductSubCategory(); 
    System.out.println(productSubCategoryName); 
    map.put(productSubCategoryName, true); 
} 
request.setAttribute("productSubCategoryMap", map); 

Y luego, en la JSP:

<select multiple="multiple" name="prodSKUs"> 
    <c:forEach items="${productSubCategoryList}" var="productSubCategoryList"> 
     <option value="${productSubCategoryList}" ${not empty productSubCategoryMap[productSubCategoryList] ? 'selected' : ''}>${productSubCategoryList}</option> 
    </c:forEach> 
</select> 
+0

Solo quedará fuera del orden. – BalusC

+0

Por favor, responda a mi publicación editada – sarah

+0

@BalusC: sí, eso es lo que se solicitó, @sarah: mi respuesta a su próxima pregunta está lista –

9

En Servlet hacer:

String selectedRole = "rat"; // Or "cat" or whatever you'd like. 
request.setAttribute("selectedRole", selectedRole); 

Luego, en JSP hacer:

<select name="roleName"> 
    <c:forEach items="${roleNames}" var="role"> 
     <option value="${role}" ${role == selectedRole ? 'selected' : ''}>${role}</option> 
    </c:forEach> 
</select> 

se imprimirá el atributo selected del elemento HTML <option> para que terminar como:

<select name="roleName"> 
    <option value="cat">cat</option> 
    <option value="rat" selected>rat</option> 
    <option value="unicorn">unicorn</option> 
</select> 

Aparte del problema: esto es no un cuadro combinado. Este es un menú desplegable. Un cuadro combinado es editable desplegable.

+0

¿Qué pasa si la selección fue con el atributo "múltiple" y podrían ser más de un rol seleccionado? –

+0

@stunaz: Ya he respondido esto en tu propia pregunta: http://stackoverflow.com/questions/4059922/how-can-i-do-a-multiselect-in-jsp-jstl-with-selected-value – BalusC

+1

+1, tropezó con esto en busca de una versión más concisa de ' selected =" selected "'. –

2

Real simple. Solo necesita tener la cadena 'seleccionada' agregada a la opción correcta. En el siguiente código, $ {myBean.foo == val? 'selected': ''} agregará la cadena 'selected' si el valor de la opción es el mismo que el valor del bean;

<select name="foo" id="foo" value="${myBean.foo}"> 
    <option value="">ALL</option> 
    <c:forEach items="${fooList}" var="val"> 
     <option value="${val}" ${myBean.foo == val ? 'selected' : ' '}><c:out value="${val}" ></c:out></option> 
    </c:forEach>      
</select> 
Cuestiones relacionadas