В чем разница между символами #,% и $ в тегах Struts? - PullRequest
69 голосов
/ 04 ноября 2011

Я работаю со Struts2, и когда я обращаюсь к переменным стека значений, я не знаю, использовать ли % или # или $.Я пробую их все, пока не найду правильный.

Может кто-нибудь объяснить, в чем разница между ними?

Ответы [ 3 ]

107 голосов
/ 24 июля 2012

Использование # (знак фунта)

OGNL используется для ссылки на объекты в ActionContext следующим образом:

  • objectName: объект в ValueStack (объект по умолчанию / корневой в контексте OGNL), такой как свойство Action
  • #objectName: объект в ActionContext, но за пределами ValueStack, в частности ...
    • #objectName: объект ActionContext, созданный с использованием тегов данных Struts2 с областью действия по умолчанию (например, <s:set name="foo" value="'Testing'" />, на которую ссылается <s:property value="#foo" />)
    • #parameters.objectName: параметр запроса
    • #request.objectName: атрибут области запроса
    • #session.objectName: атрибут области сеанса
    • #application.objectName: атрибут области приложения
    • #attr.objectName: атрибут в области страницы, запроса, сеанса или приложения (ищется в указанном порядке)

Приведенные выше ссылки на карту области действия (параметры, запрос, сеанс и приложение) можно сделать одним из двух способов:

  • #scopeName.objectName или
  • #scopeName['objectName']

Использование% (знак процента)

%{ OGNL expression } используется для принудительной оценки атрибута OGNL, который обычно интерпретируется как строковый литерал.

Пример: <s:property value="myProperty" default="%{myDynamicDefaultValue}" />

Использование @ (в знак)

Символ @ используется для ссылки на статические свойства и методы. Обратите внимание, что вам может потребоваться включить это в свойствах Struts2: struts.ognl.allowStaticMethodAccess=true

Примеры:

@my.package.ClassName@MY_STATIC_PROPERTY
@my.package.ClassName@myStaticMethod

Использование $ (знак доллара)

Struts2 OGNL не использует знак доллара. Однако его можно использовать для оценки нормальных выражений JSTL. Например:

Struts2: <h1><s:property value="#pageTitle" /></h1>
(эквивалентно ...)
JSTL: <h1>${pageTitle}</h1>

9 голосов
/ 04 ноября 2011

Фреймворк использует стандартный контекст именования для оценки выражений OGNL. Объект верхнего уровня, имеющий дело с OGNL, - это карта (обычно называемая контекстной картой или контекстом). OGNL имеет представление о наличии корневого (или по умолчанию) объекта в контексте. В выражении на свойства корневого объекта можно ссылаться без какого-либо специального понятия «маркер». Ссылки на другие объекты отмечены знаком фунта (#).

Каркас устанавливает контекст OGNL как наш ActionContext, а стек значений - как корневой объект OGNL. (Стек значений представляет собой набор из нескольких объектов, но для OGNL он представляется одним объектом.) Наряду со стеком значений среда помещает другие объекты в ActionContext, включая Карты, представляющие контексты приложения, сеанса и запроса. Эти объекты сосуществуют в ActionContext вместе со стеком значений (наш корень OGNL).

                 |
                 |--application
                 |
                 |--session
   context map---|
                 |--value stack(root)
                 |
                 |--request
                 |
                 |--parameters
                 |
                 |--attr (searches page, request, session, then application scopes)

Подробнее см.

OGNL основа

в основном struts2 ставит значение объекта Stack как самый верхний объект, и OGNL используется для ссылки на них. На объект root можно ссылаться без какого-либо специального «маркера» или с помощью %, тогда как ссылки на другие объекты помечаются знаком решетки (# ). # в основном используется для ссылки на объект / значения из Application / Session и т. д.

0 голосов
/ 08 сентября 2015

Просто для завершения @Devon Biere ...

Использование $ (знак доллара)

Вы также можете использовать ${} в своих файлах ресурсов.Распорки автоматически используют OGNL для разбора ${}.Например,

sample.foo.bar=This is some ${someProperty} //If the someProperty is in valueStack
sample.welcome.message=Welcome dear ${#session.CurrentUser.farsiFirstName}

Пожалуйста, обратите внимание, что знак $ здесь является просто триггером, который просит структуры оценить строку по OGNL, пожалуйста, не путайте ее с ${} в JSTL

Struts 2 Динамическое сообщение с OGNL

...