Условно установите атрибут элемента с помощью документов JSP (JSPX).

StackOverflow https://stackoverflow.com/questions/157005

  •  03-07-2019
  •  | 
  •  

Вопрос

В 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 варианта:

  1. Заменить <%= (isDisabled)?"неполноценный" :"" %> с <jsp.expression>(isDisabled)?"неполноценный" :""</jsp.expression>
  2. Используйте библиотеку тегов 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>
<% } %>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top