Как вывести <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="< option ${isSelected ? 'selected='\true\' : '' } >">
Затем, где бы вы ни захотели этот тег, вы просто выводите так:
${mytag}
Да, умнее было бы написать
<option selected="selected">Opt1</option>
как это то, что предписано XHTML.
Я знаю, это не то, что вы на самом деле спрашиваете:-) Я думаю, у вас все в порядке, или вы можете вместо этого использовать условное выражение:
<option ${isSelected?"selected=\"selected\"":""}>Opt1</option>
Это короче, хотя не обязательно красивее.