Документация говорит следующее об атрибуте name
:
Указывает имя атрибута бина, свойство которого доступно для получения значения, указанного свойством (если указано). Если свойство не указано, будет отображено значение самого компонента.
Обратите особое внимание на следующую формулировку: имя атрибута боба .
Давайте на мгновение потеряем имя «боб» и поговорим об объектах (поскольку бин - это просто особый вид объекта).
Вы можете создать объект и поместить его в качестве атрибута в область (request.setAttribute(...)
, session.setAttribute(...)
и т. Д.). И вы помещаете его с именем атрибута. Это как карта, если хотите, имя атрибута - это ключ, а объект - это значение.
Что делает <bean:write>
, это поиск объекта с атрибутом имени, который вы ему даете (с помощью jspContext.findAttribute(...)
). Теперь у него есть объект для работы!
Если вы также укажете атрибут property
для тега, тег попытается вызвать метод получения с именем свойства этого объекта. Теперь мы говорим о bean-компонентах, потому что по определению bean-компонент имеет getter / setters для своих свойств.
Но в вашем примере вы установили строку "hello"
с именованным атрибутом "dda"
и не указали атрибут свойства для <bean:write>
. Строка не является бином по определению, потому что у нее нет методов получения / установки, это просто простой объект. В этом случае тег возвращается к печати самого объекта; в документации снова указано: будут применяться обычные toString()
преобразования . "hello".toString()
по-прежнему "hello"
, так что печатается.
Вместо "hello"
просто поместите new Object()
в свой код, и вы увидите, как вызывается метод Object.toString()
, и вы получите что-то вроде java.lang.Object@123456
.
Вместо этого поместите компонент с получателем getBla
, а <bean:write name="dda" property="bla" />
вызовет вызов компонента dda
для получателя свойства bla
.