Пружина формирует taglib, который отключенный атрибут действительно должен разрешить к строке?

Я играл вокруг с пружинной формой taglib в последнее время и столкнулся с довольно тревожащим явлением.

<form:select path="whatever" disabled="${true}">

Представит избранный элемент, который НЕ отключен

<form:select path="whatever" disabled="${'true'}">

Представит избранный элемент, который отключен.

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

Влияние - то, что я не могу сделать что-то как <form:select path="whatever" disabled="${someOtherfield.selectedId != -1}" /> который является чем-то, что происходит справедливо часто в нашей системе.

Я просто пропускаю некоторую часть формы taglibs функциональность? Действительно ли это - законное проектное решение? Дефект?

6
задан skaffman 2 February 2010 в 23:18
поделиться

3 ответа

Просто сделайте

SELECT y.*
  FROM (SELECT name FROM cities ORDER BY population DESC LIMIT 5) AS x,
       cities AS y
 WHERE x.name = y.name
 ORDER BY y.name

Вот и все.

Ура.

-121--4780129-

Все приведенные примеры не работают в течение времени с 12:00 до 12:59. Они также выдают ошибку, если регекс не соответствует времени. Следующая обработка:

 функция parseTime (timeString) {if (timeString = ") возвращает null; var time = timeString.match (/(\d +) (: (\d\d)) ?\s * (p? )/i); if (time = = null) возвращает null; var hours = parseInt (время [1], 10); если (hours = = 12 & &! time [4]) {hours = 0;} else {hours + = (hours < 12 & & time [4])? 12:0;} var d = новая дата (); d.setHours (часы); d.setMinutes (parseInt (время [3], 10) | | 0); d.setSeconds (0, 0); возвратить d;} вар проверяет = ['13:00', '13:00', '1:00 p', '13:00', '1:00p.m'., '1:00p', '13:00', '13:00', '1 p', '13:00', '1p.m '., '1p', '13:00', '13', '1a', '12', '12a', '12p', '12:00', '12:00', '2400am', '2400pm', '2400', '1000', '100', '123', '2459', '2359', '2359am', '1100', '123p', '1234', '1', '9', '99', '999', '9999', '99999', '0000', '0011', '-1', 'mioaw']; для (var i = 0; i < tests.length; i++) {console.log (тесты [i] .padStart (9, ') + «=» + parseTime (тесты [i]));} 

Это будет работать для последовательностей, которые содержат время в любом месте внутри них. Итак, «abcde12: 00pmdef» будет проанализирован и вернется 12 полдень. Если желаемый результат состоит в том, что он возвращает только время, когда последовательность содержит только время в них, можно использовать следующее регулярное выражение, если заменить «time [4]» на «time [6]».

/^(\d+)(:(\d\d))?\s*((a|(p))m?)?$/i
-121--931488-

Хорошо, я сделал еще несколько рытых вокруг этого, потому что работы вокруг выглядели слишком уродливо.

http://forum.springsource.org/showthread.php?t=84102

Проблема заключалась в том, что JSP оценивал el и слепо сравнивал результат этой оценки с использованием «true».

Сравнение Последовательности с логическим методом с помощью этого метода всегда возвращает значение false, так как типы не совпадают, поэтому это определенно дефект.

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

Таким образом, ответ: да, это дефект, и из комментариев скаффмана это выглядит как небольшая проблема со старой библиотекой, которая не очень хорошо обновляется по мере внедрения JSP EL.

Спасибо за ваши ответы, ребята

5
ответ дан 17 December 2019 в 02:28
поделиться

Это немного странно, правда. Исходный код Spring показывает, что свойство disabled для SelectTag является String , а не логическим . Это явно не то, что нужно делать, но я подозреваю, что это все еще так по причинам устаревания (spring-form.tld предшествует JSP EL).

Это оставляет на усмотрение среды выполнения JSP преобразование логического в String , и, очевидно, она этого не сделает. Я менее удивлен по этому поводу, поскольку JSP EL, как известно, ограничен.

Итак, вы оказались между двумя полуразрушенными реализациями. Вам просто нужно убедиться, что вы передаете этому атрибуту строковые значения.

1
ответ дан 17 December 2019 в 02:28
поделиться

Причина такой конструкции в том, что у них есть специальный резервный код для принудительной оценки выражения EL, когда контейнер не оценивает его. Например, этот код:

<%@ page isELIgnored = "true" %>
...
${'Simple text'} <spring:message text = "${'Message text'} />"

производит $ {'Simple text'} Текст сообщения

Возможно, это полезно для некоторых странных устаревших конфигураций контейнеров.

То есть следующий код не будет работать, если они сделают отключенным атрибутом логическим :

<%@ page isELIgnored = "true" %>
...
<form:select ... disabled = "${true}" />    
0
ответ дан 17 December 2019 в 02:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: