Условно установите атрибут элемента с помощью документов JSP (JSPX).
Вопрос
В HTML-формах кнопки можно отключить, определив для них атрибут «disabled» с любым значением:
<button name="btn1" disabled="disabled">Hello</button>
Если кнопка должна быть включена, атрибут не должен существовать, поскольку не существует определенного значения, которое можно было бы установить для отключенного атрибута, которое оставило бы кнопку включенной.
Это вызывает у меня проблемы, когда я хочу включить/отключить кнопки при использовании документов JSP (jspx).Поскольку документы JSP должны быть правильно сформированными XML-документами, я не вижу способа условного включения этого атрибута, поскольку что-то вроде следующего недопустимо:
<button name="btn1" <%= (isDisabled) ? "disabled" : "" %/> >Hello</button>
Хотя я мог бы реплицировать тег дважды, используя тег JSTL if, чтобы получить желаемый эффект, в моем конкретном случае у меня есть более 15 атрибутов, объявленных на кнопке (множество атрибутов обработчика событий JavaScript для AJAX), поэтому дублирование тега приведет к JSP очень грязный.
Как я могу решить эту проблему, не жертвуя при этом читабельностью JSP?Существуют ли какие-либо пользовательские теги, которые могут добавлять атрибуты к родительскому элементу, манипулируя выходным DOM?
Решение
Я использую собственный тег JSP с динамическими атрибутами.Вы используете его так:
<util:element elementName="button" name="btn1" disabled="$(isDisabled ? 'disabled' : '')"/>
По сути, этот тег генерирует XML-элемент с elementName и помещает все атрибуты, присутствующие в теге, но пропускает пустые.
Сам тег довольно легко реализовать, моя реализация занимает всего 44 строки.
Другие советы
Вы можете использовать <jsp:text>
тег для решения этой проблемы с использованием допустимого XML:
<jsp:text><![CDATA[<button name="btn1"]]></jsp:text>
<c:if test="${isDisabled}"> disabled="disabled"</c:if>
>
Hello!
<jsp:text><![CDATA[</button>]]></jsp:text>
Это, очевидно, более подробное решение, чем некоторые другие решения.Но это полностью автономный:специальные теги не требуются.Кроме того, это легко масштабируется столько атрибутов, сколько вам нужно.
@alex отличное решение для использования тройного оператора.Добавляю немного своего примера, что благодаря вам я просто изменил результат условия, если true, то записывает атрибут, иначе ничего не пишет
чтобы заполнить список и выбрать используемое значение, избегая c:if
<select id="selectLang" name="selectLang" >
<c:forEach var="language" items="${alLanguages}" >
<option value="${language.id}" ${language.code == usedLanguage ? 'selected' : ''} >${language.description}</option>
</c:forEach>
чтобы проверить при запуске переключатель, чтобы избежать c:if:
<input type="radio" id="id0" value="0" name="radio" ${modelVar == 0 ? 'checked' : ''} />
<input type="radio" id="id1" value="1" name="radio" ${modelVar == 1 ? 'checked' : ''} />
<input type="radio" id="id2" value="2" name="radio" ${modelVar == 2 ? 'checked' : ''} />
Я думаю, прошло некоторое время с момента последнего поста об этом, но я столкнулся с точно такой же проблемой с <select><option selected="selected">
теги, т.е.динамически объявляя, какой вариант выбран.Чтобы решить эту проблему, я создал собственный тегx;Подробности я разместил в другом ответь здесь
Я пришел к выводу, что хорошего ярлыка не существует;Выражения EL и JSP могут существовать только внутри атрибутов элементов XML (и в содержимом тела).Итак, вам нужно сделать следующее;
<c:choose>
<c:when test="${isDisabled}"><button name="btn1" disabled="disabled">Hello</button></c:when>
<c:otherwise><button name="btn1">Hello</button></c:otherwise>
</c:choose>
Использование нотации скриптлета не будет работать для документов JSP (.jspx).
Читаю про автомат. конвертер jsp в jspx я наткнулся на <jsp:element>
и <jsp:attribute>
теги.Если я правильно понимаю, вы сможете сделать что-то вроде
<jsp:element name="button">
<jsp:attribute name="someAttribute">value</jsp:attribute>
</jsp:element>
и получить вывод двигателя jsp
<button someAttribute="value"/>
или что-то вроде того.Единственная проблема, указанная на странице выше, заключается в том, что это не очень хорошо работает с условными конструкциями.Автор конвертера постарался обойти эту проблему, создав несколько вспомогательных тегов, с которыми, я думаю, вы можете ознакомиться, загрузив исходный код.Надеюсь, это поможет.
Создайте библиотеку тегов (.tagx), а затем используйте тег скриптлета.
Видеть http://code.google.com/p/jatl/wiki/JSPExample
<?xml version="1.0" encoding="UTF-8" ?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1">
<jsp:directive.page import="com.googlecode.jatl.Html"/>
<jsp:directive.page import="com.evocatus.product.data.AttributeValue"/>
<jsp:directive.page import="com.evocatus.domain.Product"/>
<jsp:scriptlet>
//<![CDATA[
final Product p = (Product) request.getAttribute("product");
new Html(out) {{
for (AttributeValue v : p.summaryAttributeValues()) {
p();
strong().text(v.getLabel()).end();
text(": " + v.getValue());
endAll();
}
}};
//]]>
</jsp:scriptlet>
</jsp:root>
Да, это обман...но он выполняет свою работу.Кроме того, можно ли таким образом выполнить очень сложную рекурсию для древовидных структур?
Я также опубликовал в своем блоге и на gist.github еще одно решение, которое использует несколько библиотек tagx: http://adamgent.com/post/8083703288/conditionally-set-an-attribute-on-an-element-with-jspx
Синтаксис <%= blah %> не является допустимым XML, необходимым для документов JSP.У вас есть 2 варианта:
- Заменить <%= (isDisabled)?"неполноценный" :"" %> с <jsp.expression>(isDisabled)?"неполноценный" :""</jsp.expression>
- Используйте библиотеку тегов Core и EL (убедитесь, что isDisabled включен в область страницы) следующим образом:
<c:choose> <c:when test="${isDisabled}">"disabled"</c:when> <c:otherwise>""</c:otherwise> </c:choose>
Надеюсь, это поможет :)
Я только что боролся с той же проблемой.Я попробовал использовать <jsp:attribute name="disabled"/>
внутри <c:if>
, но компилятор пытается прикрепить отключенный атрибут к c:if
элемент, который вышел из строя.Но я обнаружил, что это работает (stripes:submit
— элемент для создания кнопки типа submit в полосах):
<stripes:submit name="process" value="Hello">
<jsp:attribute name="disabled">
<c:if test="${x == 0}">disabled</disabled>
</jsp:attribute>
</stripes:submit>
Кажется, что jsp:attribute
вообще не создаст атрибут, если тело содержит только пробелы, поэтому вы либо получите disabled="disabled"
или вообще ничего.
Это будет работать только в том случае, если вы используете какую-то библиотеку тегов для создания кнопки, а элемент тега должен поддерживать отключенный атрибут (передавая его базовому элементу HTML).Вы не можете использовать jsp:attribute
чтобы добавить атрибут к необработанному элементу HTML.
На самом деле я не использую JSP (и я ответил один раз, а затем удалил его, когда понял, что «должен быть действительный XML»).Самое чистое, что я могу придумать, это:
<% if (isDisabled) { %>
<button name="btn1" disabled="disabled">Hello</button>
<% } else { %>
<button name="btn1">Hello</button>
<% } %>