Как вывести <option selected = "true"> из JSPX? - PullRequest
5 голосов
/ 19 ноября 2009

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

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

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

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

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

Ответы [ 4 ]

1 голос
/ 11 декабря 2009

Одним из способов решения этой проблемы является использование пользовательских тегов.

Мне нравится подход, который использует конвертер 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>
0 голосов
/ 15 апреля 2011

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

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

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

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

${mytag}
0 голосов
/ 01 марта 2010

Для проблемы <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 стали намного аккуратнее. Кроме того, я просто не думаю, что для этого есть короткий путь.

0 голосов
/ 19 ноября 2009

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

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

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

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

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

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

...