Условно установить атрибут для элемента с помощью JSP Documents (JSPX) - PullRequest
18 голосов
/ 01 октября 2008

В формах HTML кнопки можно отключить, определив для них атрибут «disabled» с любым значением:

<button name="btn1" disabled="disabled">Hello</button>

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

Это вызывает у меня проблемы, когда я хочу включить / отключить кнопки при использовании JSP Documents (jspx). Так как документы JSP должны быть правильно сформированными документами XML, я не вижу способа условно включить этот атрибут, поскольку что-то вроде следующего недопустимо:

<button name="btn1" <%= (isDisabled) ? "disabled" : "" %/> >Hello</button>

Хотя я мог дважды повторить тег, используя тег JSTL if, чтобы получить желаемый эффект, в моем конкретном случае у меня было более 15 атрибутов, объявленных на кнопке (множество атрибутов обработчика событий JavaScript для AJAX), поэтому дублирование тега будет сделать JSP очень грязным.

Как я могу решить эту проблему, не жертвуя удобочитаемостью JSP? Существуют ли какие-либо пользовательские теги, которые могут добавлять атрибуты к родителю, манипулируя выходным DOM?

Ответы [ 9 ]

10 голосов
/ 16 октября 2008

Я использую пользовательский тег JSP с динамическими атрибутами. Вы используете это так:

<util:element elementName="button" name="btn1" disabled="$(isDisabled ? 'disabled' : '')"/>

По сути, этот тег генерирует элемент XML с elementName и помещает в него все атрибуты, но пропускает пустые.

Сам тег довольно легко реализовать, моя реализация всего 44 строки.

8 голосов
/ 22 апреля 2009

Вы можете использовать тег <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>

Это, очевидно, более многословно, чем некоторые другие решения. Но это полностью автономный : никаких пользовательских тегов не требуется. Кроме того, он легко масштабируется на столько атрибутов, сколько вам нужно.

6 голосов
/ 23 октября 2015

@ 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' : ''} />
4 голосов
/ 01 марта 2010

Полагаю, с момента последнего сообщения об этом прошло некоторое время, но я столкнулся с точно такой же проблемой с тегами <select><option selected="selected">, то есть с динамическим объявлением, какая опция выбрана. Чтобы решить эту проблему, я сделал специальный tagx; Я разместил подробности в другом ответе здесь

Я пришел к выводу, что нет хороших ярлыков; Выражения 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)

3 голосов
/ 15 октября 2008

Чтение об автоматическом jsp в jspx конвертере Я натолкнулся на теги <jsp:element> и <jsp:attribute>. Если я правильно понимаю, вы должны сделать что-то вроде

<jsp:element name="button">
  <jsp:attribute name="someAttribute">value</jsp:attribute>
</jsp:element>

и имеют мощность двигателя jsp

<button someAttribute="value"/>

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

2 голосов
/ 16 июля 2011

Создайте библиотеку тегов (.tagx), затем используйте тег scriptlet.

См. 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

0 голосов
/ 15 июня 2011

Я только что боролся с той же проблемой. Я попытался использовать <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", либо ничего вообще.

Это будет работать только в том случае, если вы используете какой-либо taglib для создания кнопки, а элемент tag должен поддерживать атрибут disabled (передавая его в базовый элемент HTML). Вы не можете использовать jsp:attribute для добавления атрибута в необработанный элемент HTML.

0 голосов
/ 04 октября 2008

Синтаксис <% = blah%> не является допустимым XML, необходимым для документов JSP. У вас есть 2 варианта:

  1. Заменить <% = (isDisabled)? "disabled": ""%> с (isDisabled)? "disabled": ""
  2. Используйте Core taglib и EL (убедитесь, что isDisabled помещен в область видимости страницы) следующим образом:
<c:choose>
  <c:when test="${isDisabled}">"disabled"</c:when>
  <c:otherwise>""</c:otherwise>
</c:choose>

Надеюсь, это поможет:)

0 голосов
/ 01 октября 2008

Я на самом деле не использую JSP (и я однажды ответил, затем удалил его, когда понял, что нужно «с помощью действительного XML»). Самое чистое, что я могу придумать, это:

<% if (isDisabled) { %>
  <button name="btn1" disabled="disabled">Hello</button>
<% } else { %>
  <button name="btn1">Hello</button>
<% } %>
...