在文档中,<bean:write>
标记内的“name”被称为必须打印其属性的bean的名称。如果未提及该属性,则打印bean本身的值。
但是如果我在Action类中设置一个属性,如:
setAttribute("dda","hello");
并在JSP中说:
<bean:write name="dda"/>
即使“dda”不是任何bean的名字,我也会得到“你好”。
为什么会这样?什么是“豆本身打印”的意思?是否呈现了对象的哈希码?
答案 0 :(得分:1)
documentation对name
属性说明了以下内容:
指定访问其属性的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调用。