Как использовать оператор ссылки на индекс OGNL

1

Работая с 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.

  • 0
    Где будут храниться переменные, если scope не указана в <s:set> ?
  • 0
    Он будет храниться в контексте стека значений, как я уже упоминал.
Показать ещё 12 комментариев
Теги:
jsp
struts2
ognl
valuestack

1 ответ

2
Лучший ответ

В данном выражении <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.

  • 0
    Вы можете проверить это ? У меня похожая проблема.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню