В чем разница между знаками #, % и $ в тегах Struts?


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

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

3 66

3 ответа:

использовать знак # (решетка)

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

  • objectName: объект в ValueStack (по умолчанию / корневой объект в контексте OGNL), например свойство действия
  • #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>

платформа использует стандартный контекст именования для оценки выражений 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 помещает стек значений объекта в качестве самого верхнего объекта, а OGNL используется для их ссылки.на корневой объект можно ссылаться без специального "маркера" или с помощью % в то время как ссылки на другие объекты, помеченные знаком фунта (#). # в основном используется для ссылки на объект / значения из приложения / сеанса и т. д.

просто для завершения @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

распорки 2 динамическое сообщение с OGNL