Как использовать оператор ссылки на индекс OGNL
Работая с 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.
1 ответ
В данном выражении <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.