В чем разница между символами #, % и $ в тегах Struts?
Я работаю со Struts2, и когда я обращаюсь к переменным стека значений, я не знаю, использовать ли %
или же #
или же $
, Я пробую их все, пока не найду правильный.
Кто-нибудь может объяснить, в чем разница между ними?
3 ответа
Использование # (знак фунта)
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>
Фреймворк использует стандартный контекст именования для оценки выражений 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)
обратитесь к этому для более подробной информации
в основном struts2 помещает значение объекта Stack как самый верхний объект, и OGNL используется для ссылки на них. На объект root можно ссылаться без какого-либо специального "маркера" или с помощью %
в то время как ссылки на другие объекты отмечены знаком фунта (#). # в основном используется для ссылки на объект / значения из Application/Session и т. д.
Просто чтобы завершить @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