【问题标题】:In the bean:write tag, can "name" even refer to an attribute name instead of a bean name?在 bean:write 标签中,“name”甚至可以引用属性名称而不是 bean 名称吗?
【发布时间】:2011-06-20 08:54:10
【问题描述】:

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

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

setAttribute("dda","hello");

并在 JSP 中说:

<bean:write name="dda"/>

即使“dda”不是任何 bean 的名称,我也会得到“hello”。

为什么会这样? “bean本身被打印”是什么意思?是否渲染了它的对象的哈希码?

【问题讨论】:

    标签: jsp tags struts


    【解决方案1】:

    documentationname 属性的描述如下:

    指定访问其属性以检索由属性指定的值(如果指定)的bean的属性名称。如果没有指定property,则渲染这个bean本身的值。

    注意这个写法:bean的属性名

    让我们暂时放弃命名“bean”并谈谈对象(因为 bean 只是一种特殊的对象)。

    您可以创建一个对象并将其作为属性放置在范围内(request.setAttribute(...)session.setAttribute(...) 等)。你把它放在一个属性名上。这就像一个地图,如果你愿意的话,属性名是键,对象是值。

    &lt;bean:write&gt; 所做的是查找具有您给它的名称属性的对象(通过jspContext.findAttribute(...))。现在它有了一个可以使用的对象!

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

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

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

    放置一个带有getBla getter 和&lt;bean:write name="dda" property="bla" /&gt; 的bean 将触发对dda bean 的bla 属性getter 的调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-30
      • 1970-01-01
      • 2014-04-17
      • 2010-12-04
      • 2018-04-06
      相关资源
      最近更新 更多