web-dev-qa-db-fra.com

Définir l'option de liste déroulante HTML sélectionnée à l'aide de JSTL

Dans le même contexte j'ai une autre requête

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

et le paramètre correspondant dans la demande est comme

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

}

ici, j'ai plusieurs listes déroulantes de sélection, même si j'obtiens la valeur de retour pour deux, dans l'interface utilisateur, une seule donnée est mise en surbrillance, pas la seconde, qu'est-ce qui ne va pas dans le code?

21
sarah

En supposant que vous ayez une collection $ {rôles} des éléments à mettre dans le combo, et $ {selected} l'élément sélectionné, cela se passerait comme suit:

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

MISE À JOUR (question suivante)

Vous remplacez l'attribut "productSubCategoryName". À la fin de la boucle for, le dernier productSubCategoryName.

En raison des limites du langage d'expression, je pense que la meilleure façon de gérer cela est d'utiliser une carte:

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

Et puis dans le 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>
29
Maurice Perry

Dans Servlet, faites:

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

Ensuite, dans JSP, faites:

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

Il affichera l'attribut selected du code HTML <option> élément pour que vous vous retrouviez comme:

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

Mis à part le problème: c'est pas une zone de liste déroulante. Ceci est une liste déroulante. Une liste déroulante est une liste déroulante modifiable

10
BalusC

Vraiment simple. Vous avez juste besoin d'avoir la chaîne "sélectionnée" ajoutée à la bonne option. Dans le code suivant, $ {myBean.foo == val? 'selected': ''} ajoutera la chaîne 'selected' si la valeur de l'option est la même que la valeur du 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>
3
MattC