web-dev-qa-db-fra.com

Valeur sélectionnée pour la liste déroulante JSP à l'aide de JSTL

J'ai SortedMap dans Servlet pour renseigner les valeurs déroulantes dans JSP et j'ai le code suivant

    SortedMap<String, String> dept = findDepartment();
    request.setAttribute("dept ", dept);

et en JSP

       <select name="department">
          <c:forEach var="item" items="${dept}">
            <option value="${item.key}">${item.value}</option>
          </c:forEach>
        </select>

J'utilise une page JSP pour l'insertion et la mise à jour. Lorsque je modifie la page, comment puis-je définir la valeur sélectionnée de manière à ce que la valeur sélectionnée provienne de la base de données.

24
Jåcob

En HTML, l'option sélectionnée est représentée par la présence de l'attribut selected sur le <option> élément comme ceci:

<option ... selected>...</option>

Ou si vous êtes strict HTML/XHTML:

<option ... selected="selected">...</option>

Ainsi, il suffit de laisser JSP/EL l’imprimer de manière conditionnelle. Pourvu que vous ayez préparé le département sélectionné comme suit:

request.setAttribute("selectedDept", selectedDept);

alors cela devrait faire:

<select name="department">
    <c:forEach var="item" items="${dept}">
        <option value="${item.key}" ${item.key == selectedDept ? 'selected="selected"' : ''}>${item.value}</option>
    </c:forEach>
</select>

Voir également:

41
BalusC

j'ai essayé la dernière réponse de Sandeep Kumar, et j'ai trouvé beaucoup plus simple:

<option value="1" <c:if test="${item.key == 1}"> selected </c:if>>
3
Muchtarpr

Si cela ne vous dérange pas d'utiliser jQuery, vous pouvez utiliser le code ci-dessous:

    <script>
     $(document).ready(function(){
           $("#department").val("${requestScope.selectedDepartment}").attr('selected', 'selected');
     });
     </script>


    <select id="department" name="department">
      <c:forEach var="item" items="${dept}">
        <option value="${item.key}">${item.value}</option>
      </c:forEach>
    </select>

Dans votre Servlet, ajoutez ce qui suit:

        request.setAttribute("selectedDepartment", YOUR_SELECTED_DEPARTMENT );
2
Uri Lukach

Je pense que les exemples ci-dessus sont corrects. mais vous n'avez pas vraiment besoin de définir

request.setAttribute("selectedDept", selectedDept);

vous pouvez réutiliser les informations de JSTL, faites quelque chose comme ça.

<!DOCTYPE html>
<html lang="en">
<%@taglib prefix="c" uri="http://Java.Sun.com/jsp/jstl/core" %>
<%@taglib prefix="fn" uri="http://Java.Sun.com/jsp/jstl/functions" %>
<head>
    <script src="../js/jquery-1.8.1.min.js"></script>
</head>
<body>
    <c:set var="authors" value="aaa,bbb,ccc,ddd,eee,fff,ggg" scope="application" />
    <c:out value="Before : ${param.Author}"/>
    <form action="TestSelect.action">
        <label>Author
            <select id="Author" name="Author">
                <c:forEach items="${fn:split(authors, ',')}" var="author">
                    <option value="${author}" ${author == param.Author ? 'selected' : ''}>${author}</option>
                </c:forEach>
            </select>
        </label>
        <button type="submit" value="submit" name="Submit"></button>
        <Br>
        <c:out value="After :   ${param.Author}"/>
    </form>
</body>
</html>
2
Sendi_t

Peut-être que je ne comprends pas tout à fait la réponse acceptée, alors cela ne m'a pas fonctionné.

Ce que j'ai fait était simplement de vérifier si la variable est nulle, l'assigner à une valeur connue de ma base de données. Ce qui semble être similaire à la réponse acceptée, dans laquelle vous déclarez d’abord une valeur connue et définissez-la sur sélectionnée.

<select name="department">
    <c:forEach var="item" items="${dept}">
        <option value="${item.key}">${item.value}</option>
    </c:forEach>
</select>

car aucune des options n'est sélectionnée, donc item = null

<%
    if(item == null){
        item = "selectedDept"; //known value from your database
    }
%>

Ainsi, si l'utilisateur sélectionne une autre option, ma clause IF ne l'attrapera pas et n'attribuera à la valeur fixe déclarée au début. Mon concept pourrait être faux ici mais ça marche pour moi

1
sicnarfmis

J'ai essayé la réponse acceptée, cela n'a pas fonctionné.

Cependant, le moyen simple de le faire est ci-dessous: -

<option value="1" <c:if test="${item.quantity == 1}"> <c:out value= "selected=selected"/</c:if>>1</option>
<option value="2" <c:if test="${item.quantity == 2}"> <c:out value= "selected=selected"/</c:if>>2</option>
<option value="3" <c:if test="${item.quantity == 3}"> <c:out value= "selected=selected"/</c:if>>3</option>

Prendre plaisir!!

1
Sandeep Kumar

Vous pouvez en essayer un encore plus simple:

<option value="1" ${item.quantity == 1 ? "selected" : ""}>1</option>
1
zeirna