Как работают атрибуты тегов Struts? - PullRequest
0 голосов
/ 04 февраля 2010

В этом коде:

<html:text property="txtItem5" disabled="disTxtItem5">

Я вижу, что "txtItem5" происходит из getTxtItem5 () в ActionForm, но при поиске в проекте других подстрок "disTxtItem5", по-видимому, ничего не видно удаленно, хотя ясно, что фреймворк каким-то образом извлекает логическое значение из этой строки, что явно означает, что это сложнее, чем мое текущее понимание.

Может ли кто-нибудь дать хорошее объяснение того, как оцениваются эти выражения, или указать мне в направлении одного?

1 Ответ

2 голосов
/ 08 февраля 2010

РЕДАКТИРОВАТЬ: В своем первоначальном ответе (см. Ниже) я сказал, что 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 должна указывать на любые ошибки преобразования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...