Я играл вокруг с пружинной формой taglib в последнее время и столкнулся с довольно тревожащим явлением.
<form:select path="whatever" disabled="${true}">
Представит избранный элемент, который НЕ отключен
<form:select path="whatever" disabled="${'true'}">
Представит избранный элемент, который отключен.
Это указывает мне, что тег ожидает строку в том атрибуте и отказывается принуждать любые булевы значения (возможно проверяющий тип сначала).
Влияние - то, что я не могу сделать что-то как <form:select path="whatever" disabled="${someOtherfield.selectedId != -1}" />
который является чем-то, что происходит справедливо часто в нашей системе.
Я просто пропускаю некоторую часть формы taglibs функциональность? Действительно ли это - законное проектное решение? Дефект?
Просто сделайте
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.
Спасибо за ваши ответы, ребята
Это немного странно, правда. Исходный код Spring показывает, что свойство disabled
для SelectTag
является String
, а не логическим
. Это явно не то, что нужно делать, но я подозреваю, что это все еще так по причинам устаревания (spring-form.tld предшествует JSP EL).
Это оставляет на усмотрение среды выполнения JSP преобразование логического
в String
, и, очевидно, она этого не сделает. Я менее удивлен по этому поводу, поскольку JSP EL, как известно, ограничен.
Итак, вы оказались между двумя полуразрушенными реализациями. Вам просто нужно убедиться, что вы передаете этому атрибуту строковые значения.
Причина такой конструкции в том, что у них есть специальный резервный код для принудительной оценки выражения EL, когда контейнер не оценивает его. Например, этот код:
<%@ page isELIgnored = "true" %>
...
${'Simple text'} <spring:message text = "${'Message text'} />"
производит $ {'Simple text'} Текст сообщения
Возможно, это полезно для некоторых странных устаревших конфигураций контейнеров.
То есть следующий код не будет работать, если они сделают отключенным
атрибутом логическим
:
<%@ page isELIgnored = "true" %>
...
<form:select ... disabled = "${true}" />