Работая с OGNL, вы можете ссылаться на объекты контекста действия, такие как #application
, #session
, #root
, #action
, #request
, #parameters
, #attr
и контекст действия с #context
.
Структура устанавливает контекст OGNL как наш ActionContext, а стек значений - корневым объектом OGNL.
И OGNL использует []
качестве ссылки индекса для доступа к свойствам объекта. Например, если объект foo
имеет bar
свойств, он может получить доступ, например, foo.bar
или foo['bar']
. Он также работает, если foo
- это карта, а bar
- ключ.
Теперь я хочу поместить переменную и значение в контекст стека значений, подобный этому
<s:set var="bar" value="'hello'"/>
<s:set var="foo" value="'bar'"/>
и распечатать значение
<s:property value="%{#attr[#foo]}"/>
Он должен печатать hello
.
Я хотел бы знать, как это работает. Я знаю, что #attr
- объект, который не имеет свойства, на которое ссылается #foo
, т.е. bar
. Однако это работает. Он также работает, если я использую #request
и #context
и, возможно, #root
вместо #attr
. Ни один из этих объектов не имеет bar
свойств, но OGNL думает иначе. Я хотел бы знать, что OGNL думает о свойствах объекта, который он ссылается, и почему это выражение работает. Также, если есть альтернативные способы печати hello
используя ссылку #foo
в выражении OGNL.
В данном выражении <s:property value="#attr[#foo]"/>
сначала будет оцениваться часть внутри []
. #foo
разрешен к bar
таким образом выражение становится #attr['bar']
(что эквивалентно #attr.bar
).
Используя #attr.bar
значение для bar
будет искать до тех пор, пока оно не будет найдено в контексте страницы, затем в request
, затем в session
а затем в области application
.
#context.bar
получает значение из контекста OGNL значение карты с ключом bar
.
#request.bar
пытается получить атрибут запроса с помощью bar
имени из карты запроса, и если он не найден, тогда в стек значений будет искать поиск bar
. Это происходит в реализации оболочки Struts2.
scope
не указана в<s:set>
?