Как вывести <option selected = "true"> из JSPX?

Несколько html-тегов интерпретируют "любое" значение атрибута give как "true" -> теги опций приходят на ум.

Я часто заканчиваю тем, что делаю что-то вроде этого:

<c:choose>
   <c:when test="${isSelected}"/>
        <option selected="true">Opt1</option> 
    </c:when>
   <c:otherwise/>
        <option>Opt1</option> 
   </c:otherwise>
</c:choose>

Я знаю, что могу объявить обычай для инкапсуляции этого поведения, но это также становится довольно уродливым, если я не кодирую его в Java.

Есть ли более умный способ сделать это?

4 ответа

Один из способов сделать это - использовать пользовательские теги.

Мне нравится подход, который использует конвертер JSP2X, определяя пользовательские теги в папке WEB-INF/tags, которые позволяют вам сделать это:

<jspx:element name="option">
    <c:if test="${selected}">
        <jspx:attribute name="selected">selected</jspx:attribute>
    </c:if>
    <jspx:body>Opt1</jspx:body>
</jspx:element>

Более компактный подход может состоять в том, чтобы создать пользовательский тег специально для опции, которая сделала правильную вещь, принимая логическое значение для выбранного атрибута, испуская атрибут selected="selected", если это правда, а не иначе. Это было бы немного более компактно:

<jspx:option selected="${selected}">Opt1</option>

Для <select><option selected="selected"> проблема, я решил, что я не буду возражать против многословия, если бы это было только одноразовое многословие... поэтому я создал документ тега (.tagx) в /WEB-INF/tags/select.tagx вот так:

<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1"
    xmlns:c="http://java.sun.com/jsp/jstl/core">

    <jsp:directive.attribute name="id" required="true" />
    <jsp:directive.attribute name="name" required="true" />
    <jsp:directive.attribute name="options" required="true" />
    <jsp:directive.attribute name="selected" required="true" />

    <select id="${id}" name="${name}">
    <c:forEach var="opt" items="${options}">
        <c:choose>
        <c:when test="${opt == selected}"><option selected="selected">${opt}</option></c:when>
        <c:otherwise><option>${opt}</option></c:otherwise>
        </c:choose>
    </c:forEach>
    </select>
</jsp:root>

и использовать это так:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<html xmlns="http://www.w3.org/1999/xhtml" version="2.1"
    ...
    xmlns:form="urn:jsptagdir:/WEB-INF/tags/">

    ...

    <head>
        ...
    </head>
    <body>
        <form method="POST" commandName="loginRequest" action="index_login.html">
            <fieldset id="loginFieldSet">
                ...

                <div>
                    <label for="day" path="day">Favourite day: </label>
                    <form:select id="day" name="day" selected="Saturday"
                        options="Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday" />
                </div>
            </fieldset>
            <div>
            <input type="submit" tabindex="3" />
            <input type="reset" tabindex="4" />
            </div>
        </form>
    </body>
</html>

krosenvold, я не согласен, что это уродливо... может быть, раздражает, но я на самом деле рад, что мне не пришлось писать какой-либо код для этого. После того как вы определили тег, ваши JSPX стали намного аккуратнее. Кроме того, я просто не думаю, что для этого есть короткий путь.

Есть еще один способ обойти это. Это что-то вроде хака, но альтернатива использованию taglib или выбору, где вы дублируете тег, который я обнаружил, работает довольно хорошо.

Вы можете создать тег внутри тега jstl set в качестве значения, примерно так:

<c:set var="mytag" value="&lt; option ${isSelected ? 'selected='\true\' : '' } &gt;">

Затем, где бы вы ни захотели этот тег, вы просто выводите так:

${mytag}

Да, умнее было бы написать

<option selected="selected">Opt1</option>

как это то, что предписано XHTML.

Я знаю, это не то, что вы на самом деле спрашиваете:-) Я думаю, у вас все в порядке, или вы можете вместо этого использовать условное выражение:

<option ${isSelected?"selected=\"selected\"":""}>Opt1</option>

Это короче, хотя не обязательно красивее.

Другие вопросы по тегам