在此代碼:Struts標記屬性如何工作?
<html:text property="txtItem5" disabled="disTxtItem5">
我可以看到「txtItem5」來自一個getTxtItem5()在ActionForm的,但搜索「disTxtItem5」的其他子項目似乎揭示了什麼遠程相關,但顯然不知何故該框架正在從這個字符串中抽取一個布爾值,這顯然意味着它比我目前的理解更復雜。
有人可以很好地解釋如何評估這些表達式,或指向我的方向嗎?
在此代碼:Struts標記屬性如何工作?
<html:text property="txtItem5" disabled="disTxtItem5">
我可以看到「txtItem5」來自一個getTxtItem5()在ActionForm的,但搜索「disTxtItem5」的其他子項目似乎揭示了什麼遠程相關,但顯然不知何故該框架正在從這個字符串中抽取一個布爾值,這顯然意味着它比我目前的理解更復雜。
有人可以很好地解釋如何評估這些表達式,或指向我的方向嗎?
編輯:在我的原始響應(見下文)我說,Struts管理轉換,但我錯了。我不記得究竟發生了什麼,所以我拔出了Struts的消息來源並看了一下。事實證明,轉換是由服務器完成的。在執行之前,JSP會轉換爲一個servlet,並且在這裏false用於非布爾值。
例如,我用下面的標籤:
<html:text property="nr" disabled="BlaBla" />
後來轉變到下面的HTML(無禁用):
<input type="text" name="nr" value="123">
這是發生在servlet。這裏是我的servlet包含上述標記:
// 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();
如可以看出,與假生成的禁用值,直接。我做了一些更多的挖入碧玉編譯器(我用的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,所以它只能接收映射到布爾值的值。會拋出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的只是記錄異常和失敗默默設置假作爲參數的值,或者異常會被傳播(自從我使用Struts:D以來已經有一段時間了,但我更傾向於認爲它只是設置了false並繼續)。
日誌應該指出異常,即使它被忽略。設置記錄器org.apache.commons.beanutils
或org.apache.struts
應指示任何轉換錯誤。
我還有其他一些問題,爲什麼有些事情是或不工作,這回答了所有這些。非常有幫助,非常感謝。 – 2010-02-10 01:44:10