在bean:write标签中,“name”甚至可以引用属性名而不是bean名吗?

时间:2011-06-20 08:54:10

标签: jsp tags struts

在文档中,<bean:write>标记内的“name”被称为必须打印其属性的bean的名称。如果未提及该属性,则打印bean本身的值。

但是如果我在Action类中设置一个属性,如:

setAttribute("dda","hello");

并在JSP中说:

<bean:write name="dda"/>

即使“dda”不是任何bean的名字,我也会得到“你好”。

为什么会这样?什么是“豆本身打印”的意思?是否呈现了对象的哈希码?

1 个答案:

答案 0 :(得分:1)

documentationname属性说明了以下内容:

  

指定访问其属性的bean的属性名称,以检索property指定的值(如果已指定)。如果未指定property,则将呈现此bean本身的值。

密切注意这一措辞: bean的属性名称

让我们暂时失去命名“bean”并讨论对象(因为bean只是一种特殊的对象)。

您可以创建一个对象并将其作为属性放置在范围(request.setAttribute(...)session.setAttribute(...)等)中。然后使用属性名称放置它。如果您愿意,这就像一个地图,属性名称是键,对象是值。

<bean:write>的作用是使用您提供的名称属性查找对象(通过jspContext.findAttribute(...))。现在它有一个可以使用的对象!

如果还为标记指定了property属性,则标记将尝试使用该对象上的属性名称调用getter。现在我们讨论bean,因为根据定义,bean的属性具有getter / setter。

但是在您的示例中,您设置了一个带有命名属性"hello"的字符串"dda",并且您没有为<bean:write>指定任何属性属性。根据定义,字符串不是bean,因为它没有getter / setter,它只是一个普通的对象。在这种情况下,标签会回退到打印对象本身;正如文档再次指定:将应用通常的toString()转化"hello".toString()仍为"hello",以便打印出来。

而不是"hello"只需在代码中放置一个new Object(),您就会看到正在调用Object.toString()方法,并打印出类似java.lang.Object@123456的内容。

放置一个带有getBla getter的bean,<bean:write name="dda" property="bla" />将触发dda bean的bla属性getter调用。