2010-04-21 5 views
17

Nello stesso contesto ho un'altra domandaSet discesa HTML opzione selezionata utilizzando JSTL

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

e l'impostazione corrispondente a richiesta è come

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

} 

qui ho più di selezione a discesa, anche se ottengo il valore di ritorno da per due, nell'interfaccia utente solo un dato viene visualizzato in higlight e non il secondo, cosa c'è di sbagliato nel codice?

risposta

25

Supponendo che si dispone di una collezione $ {ruoli} degli elementi da mettere in combo, e $ {selezionato} l'elemento selezionato, Andrebbe in questo modo:

<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> 

UPDATE (domanda successiva)

Si sta sovrascrivendo l'attributo "productSubCategoryName". Alla fine del ciclo for, l'ultimo productSubCategoryName.

A causa delle limitazioni del linguaggio delle espressioni, penso che il modo migliore per affrontare questo è quello di utilizzare una mappa:

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); 

E poi in 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

Sarà solo fuori dall'ordinazione. – BalusC

+0

Si prega di rispondere al mio post modificato – sarah

+0

@BalusC: sì è quello che è stato chiesto, @sarah: la mia risposta alla prossima domanda è pronta –

9

In Servlet fare:

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

Poi in JSP fare:

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

verrà stampata l'attributo selected dell'elemento HTML <option> in modo che si finisce come:

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

A parte il problema: questo è non una casella combinata. Questo è un menu a discesa. Una casella combinata è un menu a discesa modificabile.

+0

che cosa se la selezione è stata con la "multipla" attributo e potrebbero essere più di un ruoli selezionati? –

+0

@stunaz: Ho già risposto a questa nella vostra domanda: http://stackoverflow.com/questions/4059922/how-can-i-do-a-multiselect-in-jsp-jstl-with-selected-value – BalusC

+1

+1, siamo imbattuti in questo alla ricerca di una versione più concisa di ' selected = "selected"'. –

2

Real semplice. Hai solo bisogno di avere la stringa 'selezionata' aggiunta all'opzione giusta. Nel seguente codice, $ {myBean.foo == val? 'selected': ''} aggiungerà la stringa 'selected' se il valore dell'opzione è uguale al valore 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>