РЕДАКТИРОВАТЬ: В своем первоначальном ответе (см. Ниже) я сказал, что Struts управляет преобразованием, но я ошибся. Я не помню точно, что происходило, поэтому я вытащил источники из Struts и посмотрел. Оказывается, преобразование производится сервером. JSP перед выполнением преобразуется в сервлет, и именно здесь false используется для не булевых значений.
Например, я использовал следующий тег:
<html:text property="nr" disabled="BlaBla" />
Который был переведен на следующий HTML (без отключения):
<input type="text" name="nr" value="123">
Это произошло в сервлете. Вот что содержит мой сервлет для вышеуказанного тега:
// html:text
org.apache.struts.taglib.html.TextTag _jspx_th_html_005ftext_005f0 = (org.apache.struts.taglib.html.TextTag) _005fjspx_005ftagPool_005fhtml_005ftext_005fproperty_005fdisabled_005fnobody.get(org.apache.struts.taglib.html.TextTag.class);
_jspx_th_html_005ftext_005f0.setPageContext(_jspx_page_context);
_jspx_th_html_005ftext_005f0.setParent((javax.servlet.jsp.tagext.Tag) _jspx_th_html_005fform_005f0);
_jspx_th_html_005ftext_005f0.setProperty("nr");
_jspx_th_html_005ftext_005f0.setDisabled(false);
int _jspx_eval_html_005ftext_005f0 = _jspx_th_html_005ftext_005f0.doStartTag();
Как видно, отключенное значение генерируется напрямую с помощью false. Я еще немного покопался в компиляторе Jasper (я использовал Tomcat) и думаю, что за преобразование отвечает класс org.apache.jasper.compiler.JspUtil со следующим кодом:
public static boolean booleanValue(String s) {
boolean b = false;
if (s != null) {
if (s.equalsIgnoreCase("yes")) {
b = true;
} else {
b = Boolean.valueOf(s).booleanValue();
}
}
return b;
}
Поскольку я вставил BlaBla в отключенное поле, он должен вернуться к Boolean.valueOf(s).booleanValue();
, что делает следующее:
public static Boolean valueOf(String s) {
return toBoolean(s) ? TRUE : FALSE;
}
private static boolean toBoolean(String name) {
return ((name != null) && name.equalsIgnoreCase("true"));
}
Таким образом, BlaBla приводит к ложному.
ORIG: Ниже был мой первоначальный ответ, но он был неверным. На самом деле я описывал то, что происходит, когда параметры запроса привязываются к форме действия.
Атрибут disabled имеет тип boolean, поэтому он должен получать только те значения, которые соответствуют boolean. disabled="disTxtItem5"
выдаст исключение ConversionException, поскольку текст disTxtItem5
не отображается на логическое значение.
Struts использует CommonBeanUtils для выполнения преобразований, поэтому будет использоваться BooleanConverter с кодом, подобным следующему:
String stringValue = value.toString();
if (stringValue.equalsIgnoreCase("yes") ||
stringValue.equalsIgnoreCase("y") ||
stringValue.equalsIgnoreCase("true") ||
stringValue.equalsIgnoreCase("on") ||
stringValue.equalsIgnoreCase("1")) {
return (Boolean.TRUE);
} else if (stringValue.equalsIgnoreCase("no") ||
stringValue.equalsIgnoreCase("n") ||
stringValue.equalsIgnoreCase("false") ||
stringValue.equalsIgnoreCase("off") ||
stringValue.equalsIgnoreCase("0")) {
return (Boolean.FALSE);
} else if (useDefault) {
return (defaultValue);
} else {
throw new ConversionException(stringValue);
}
На данный момент я не помню, если Struts просто регистрирует исключение и не может установить значение false в качестве значения параметра или, то исключение распространяется (прошло некоторое время с тех пор, как я использовал Struts: D, но я больше склонен думать, что он просто устанавливает ложь и продолжает).
Журналы должны указывать на исключение, даже если оно игнорируется. Установка регистратора для org.apache.commons.beanutils
или org.apache.struts
должна указывать на любые ошибки преобразования.