Действительно ли отключенный атрибут taglib весенней формы должен преобразовываться в строку? - PullRequest
6 голосов
/ 03 февраля 2010

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

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

Будет отображать выбранный элемент, который НЕ отключен

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

Будет отображать выбранный элемент, который отключен.

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

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

Мне просто не хватает какой-то части функциональности taglibs формы? Это законное дизайнерское решение? Дефект?

Ответы [ 3 ]

5 голосов
/ 03 февраля 2010

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

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

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

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

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

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

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

1 голос
/ 03 февраля 2010

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

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

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

0 голосов
/ 03 февраля 2010

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

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

производит ${'Simple text'} Message text

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

То есть следующий код не будет работать, если он создаст атрибут disabled boolean:

<%@ page isELIgnored = "true" %>
...
<form:select ... disabled = "${true}" />    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...