Может ли «имя» в теге bean: write ссылаться на имя атрибута вместо имени bean? - PullRequest
0 голосов
/ 20 июня 2011

В документации упоминается, что «имя» внутри тега <bean:write> является именем боба, свойство которого должно быть напечатано. Если свойство не упомянуто, печатается значение самого компонента.

Но если я установлю атрибут в классе Action как:

setAttribute("dda","hello");

и в JSP говорят:

<bean:write name="dda"/>

Я получаю "привет", хотя "dda" не является именем какого-либо боба.

Почему это происходит? И что подразумевается под «печатается сам боб»? Отображается ли хеш-код его объекта?

1 Ответ

1 голос
/ 20 июня 2011

Документация говорит следующее об атрибуте 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.

...