Struts标记属性如何工作?

问题描述:

在此代码: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.beanutilsorg.apache.struts应指示任何转换错误。

+0

我还有其他一些问题,为什么有些事情是或不工作,这回答了所有这些。非常有帮助,非常感谢。 – 2010-02-10 01:44:10