Как использовать оператор ссылки на индекс 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.

Другие вопросы по тегам