2008-10-01 10 views
15

В HTML формы, кнопки могут быть отключены путем определения «заблокировано» атрибут на них, с любым значением:условно установить атрибут элемента с JSP документов (JSPX)

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

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

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

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

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

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

ответ

9

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

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

В принципе, то, что этот тег делает генерировать XML-элемент с ELEMENTNAME и помещает все атрибуты, присутствующие в теге, но пропускает пустые.

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

+3

Не могли бы вы опубликовать код для этого? Я думаю, это было бы очень поучительно. – 2008-10-16 15:08:03

+1

Похоже, что это будет лучший ответ, который я получу, это позор, потому что нет никакого способа сделать это с использованием синтаксиса XML без необходимости писать собственные теги ... – iainmcgin 2008-11-07 19:21:59

+0

Если вы посмотрите на инструмент JSP2X, катит теги для , и (для тела элемента). Это еще одна альтернатива, которая может быть использована с более сложными конструкциями. – 2009-12-10 22:18:53

-2

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

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

Как указано в вопросе, в то время как это будет работать, это грязнее, чем хотелось бы, особенно с 15 + атрибутами между двумя ветвями оператора if. – iainmcgin 2008-10-01 10:54:08

0

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

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

Надежда, что помогает :)

+0

Где бы эти теги были размещены? Вы все равно не сможете поместить их в раздел атрибута тега кнопки, так как это все равно будет недопустимым XML, и размещение их внутри элемента просто приведет к добавлению некоторого CDATA. – iainmcgin 2008-10-05 16:50:48

3

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

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

и выводимый двигателя

JSP
<button someAttribute="value"/> 

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

+0

Собственно, это, вероятно, и т. Д. Инструмент JSP2X записывает их как пользовательские теги в ваш WEB-INF для использования в конвертированных JSP-файлах. – 2009-12-10 22:17:13

6

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

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

4

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

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

0

Я просто борется с той же проблемой. Я попытался использовать <jsp:attribute name="disabled"/> внутри <c:if>, но компилятор пытается подключить отключенный атрибут к элементу c:if, который не работает. Но я обнаружил, что это действительно работает (stripes: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 для генерации кнопки, а элемент тега должен поддерживать отключенный атрибут (передавая его в базовый элемент HTML). Вы не можете использовать jsp:attribute, чтобы добавить атрибут к необработанному элементу HTML.

2

Создайте библиотеку тегов (.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

5

@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: если:

<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' : ''} /> 

 Смежные вопросы

  • Нет связанных вопросов^_^