ActionContext
ActionContext - это контекст действия, где StrutS2 автоматически сохраняет некоторые объекты, необходимые во время выполнения действия, такие как сеанс, параметры, локали и т. Д. Struts2 создаст соответствующий контекст Action Context на основе каждого потока, который выполняет HTTP -запрос, то есть поток имеет уникальный ActionContext. Поэтому пользователи могут использовать статический метод actioncontext.getContext () для получения ActionContext текущего потока. Именно по этой причине пользователям не нужно беспокоиться о том, чтобы сделать защиту от действий.
В любом случае, ActionContext используется для хранения данных. Сама Struts2 внесет в него много данных, и пользователи также могут поместить данные, которые они хотят. Структура данных самого ActionContext является структурой отображения, то есть картой, которая использует ключ для значения карты. Таким образом, пользователи могут использовать его как использование карты или непосредственно использовать метод Action.getContextMap () для работы на карте.
Данные, размещенные в саме struts2, включают ActionInvocation, Application (то есть ServletContext), конверсионы, локали, имя действия, параметры запроса, сеанс HTTP и стек значений и т. Д. Для получения полного списка см. В его Javadoc (в приложении этой статьи обсуждается, что она содержит).
Из-за характеристик, которые могут быть получены с помощью только потоков и статических методов Action Context, его можно получить непосредственно в классах без действия, не ожидая действия или введения действий. Следует отметить, что он действителен только в потоках, созданных из -за запроса (потому что соответствующий контекст Action Context создается при запросе), но является недействительным в потоках, запускаемых сервером (например, метод Fliter's Init). Из-за удобства доступа к нему в классах без действий, ActionContext также может использоваться для передачи данных в JSP в бездейственных классах (поскольку JSP также может легко получить к нему доступ).
Соединение и разница между ValueStack и ActionContext:
Сходства: все они используются в рамках запроса HTTP, то есть их срок службы - один запрос.
Различия: стек значений - это структура стека, а ActionContext - это структура карты (карта).
Контакт: Карта, полученная методом ValuEStack.getContext (), на самом деле является картой ActionContext. Глядя на исходный код Struts2, мы можем увидеть (строка 79 org.apache.struts2.dispatcher.ng.prepareoperations в Struts2.3.1.2, метод CreateActionContext). При создании ActionContext, valueStack.getContext () используется в качестве параметра конструктора ActionContext. Таким образом, ValueStack и ActionContext можно по существу, можно получить друг от друга.
ПРИМЕЧАНИЕ. В некоторых документах появится слово «контекст стека», что на самом деле является значением, сохраняемым в ActionContext. Таким образом, при чтении этих документов вы должны четко увидеть, помещается ли структура стека (то есть стек значений) в структуру отображения (контекст стека значений, то есть ActionContext).
Как получить ActionContext:
В пользовательском перехватчике: используйте ActionInvocation.getInvocationContext () или используйте ActionContext.getContext ().
В классе действий: пусть перехватчик вводит или использует actioncontext.getContext ().
В классах без действия: пусть класс действия проходит параметры, инъекция с использованием механизма инъекции или используйте ActionContext.getContext (). Примечание: actionContext.getContext () может быть вызван только с помощью кода, работающего в потоке запроса, в противном случае возвращается NULL.
В JSP: Как правило, нет необходимости получать сам ActionContext.
Как сохранить значение в ActionContext:
В классах Java, таких как перехватчик, класс действий, класс бездействия и т. Д.: Используйте метод ActionContext.Put (ключ объекта, значение объекта).
В JSP: TAG <S: SET Value = "..."/> будет хранить значение в ActionContext по умолчанию (конечно, тег <S: SET> также может хранить значение в других местах). Кроме того, многие теги имеют атрибуты VAR (атрибут ID использовался ранее, но теперь атрибут ID устарел). Этот атрибут может сохранить значение в ActionContext, ключом является значение атрибута VAR, а значение - значение атрибута значения тега. (Некоторые документы пишут о хранении значений в контексте ValueStack, что на самом деле одинаково)
Как прочитать значение из ActionContext:
В классах Java, таких как перехватчик, класс действий, класс бездействия и т. Д.: Используйте метод ActionContext.get (ключ объекта).
В JSP: используйте выражение ognl, начиная с #, например, будет вызван метод ActionContext.get ("name"). ПРИМЕЧАНИЕ. Если атрибуты определенного тега не проанализированы как экспрессии ognl по умолчанию, вам необходимо использовать %{}, чтобы приложить выражение, и появится выражение, аналогичное « %{#name}». (Смотрите больше для "#" здесь)
Короче говоря, использование ActionContext в JSP связано с тем, что это структура отображения, а с другой стороны, он может прочитать некоторые конфигурации действия. Когда вам нужно предоставить общие значения для многих действий, вы можете обеспечить каждое действие, предоставляя метод getxxx (), но лучший способ сохранить эти общие значения в ActionContext в шаблоне Interceptor или JSP (потому что шаблон Interceptor или JSP часто используется для нескольких действий).
Некоторые примеры:
Код Java
// Этот класс продемонстрирует операцию на ActionContext в Interceptor publicClass MyInterceptor Extrasts AbstractInterceptor {public String Intercept (actionInvocation vocation) Throws Exception {// get actionContext actionContext actionContext = vocation.getInvocationContext (); // Сохранить ценность личность = новое лицо (); actioncontext.put ("человек", человек); // Получить значение объекта значения = actionContext.get ("Person"); // Получить httpservletrequest httpservletrequest request = (httpservletrequest) actioncontext.get (strutsstatics.http_request); // Получить карту запроса, то есть значение, управляемое httpservletrequest.getattribute (...) и httpservletrequest.setattribute (...) map requestmap = (map) actioncontext.get ("request"); // другие коды // ...... return vocation.invoke (); }} Код Java
// Этот класс продемонстрирует операцию ActionContext in Action publicClass MyAction Extends actionSupport {@Override public String execute () Throws Exception {// Получить стек значений ActionContext actionContext = actionContext.getContext (); // Сохранить значение Person Person = new Person (); // Это класс, определенный в предыдущем примере ActionContext.put ("Person", Person); // Получить значение value object = actionContext.get ("person"); // другие коды // ...... вернуть успех; }} HTML -код
<! Doctype html> <html> <head> <metahttp-equiv = "content-type" content = "text/html; charset = utf-8"> <title> jsp page </title> </head> <body> <!-Этот JSP продемонстрирует использование ActionContect в JSP-> <! ActionContext был сохранен в ActionContext, вы можете использовать «#person», чтобы получить его, следующим образом-> <S: PropertyValue = "#Person"/> <!-Получить атрибут имени человека, следующим образом-> <S: PropertyValue = "#Person.name"/> <!-Получите ценность, хранящуюся в Struts2 в ActionContext, такой как запрос, следующие следующие, как следует, как следующие следующие, следующие по следующему следующему, как следуют, как следует, как следующие следующие, как следуют следующие, как следуют следующие, следующие по следующему, как следуют следующие, как следует, как следует,->> На следующих заправках-> «Получите ценность, хранящую <s:propertyvalue="#request"/> <!-- Get the value stored by Struts2 in ActionContext, such as the Map of session, as follows --> <s:propertyvalue="#session"/> <!-- Get the value stored by Struts2 in ActionContext, request the map of the passed GET parameter or POST parameter, as follows --> <s:propertyvalue="#parameters"/> <!-- The following demonstrates Сохранение значения в ActionContext в jsp-> <!-Сохраните строку «myname», ключ-«mykey», следующим образом-> <s: setValue = "%{'myName'}" var = "myKey"/> <!-Используйте тег Bean, чтобы создать объект и сохранить его в ActionContext, ключ является MyObjoct, как описание <S: beanname = "com.example.person" var = "myobject"/> <!-После этого вы можете использовать "#" для их прочтения, следующим образом-> <S: PropertyValue = "#MyKey"/> <S: PropertyValue = "#myObject"/> </body> </html> 3. httpservletrequest class или карта запроса
Struts2 предоставляет две операции по запросу: одна - это класс httpservletrequest, предоставленный веб -сервером, который совпадает с операцией запросов в традиционных веб -проектах Java; Другой - «карта запросов», которая представляет собой класс отображения, который инкапсулирует атрибуты httpservletrequest. Работа карта эквивалентна эксплуатации атрибутов httpservletrequest. Причина, по которой карта предоставляется, заключается в том, что ее удобно работать, а другая заключается в том, что она может использовать OGNL для чтения запросов в тегах JSP. В любом случае, эти два запроса совместимы. Что касается концепций, таких как жизненный цикл запроса, он ничем не отличается от других веб -проектов Java, и эта статья не будет описана подробно.
Используйте класс или карту запросов httpservlectrequest
Хотя оба являются совместимыми, с точки зрения атрибутов запроса на чтение, использование карт запроса гораздо более удобно и не обнаруживает ненужные интерфейсы. Конечно, у httpservletrequest есть некоторые методы, которых нет карты запросов. Конечно, первое следует использовать при использовании этих методов.
Использование карты запроса или ActionContext:
Оба являются картой, и оба жизненного цикла являются запросом.
В традиционных веб -проектах Java это значение часто передается в JSP через атрибуты запроса: First SetAttribute () в сервисе, а затем getAttribute () в JSP. Конечно, в проекте Struts2 вы все равно можете использовать этот метод, но отказ от функции доставки, предоставленной Struts2, не стоит усилий. Хотя автор не нашел официальный документ, в котором говорится, что вы должны заменить карту запроса на ActionContext, и не обнаружил, что в программе есть карта, которая может получить ActionContext, но не может получить запрос, в рамках Struts2, эксплуатация ActionContext более удобна, чем выполнение карты запроса. Поэтому автор рекомендует: попробуйте использовать ActionContext вместо карты запроса для передачи значения.
Карта запроса иногда содержит значения, установленные другими структурами, такие как Spring Frameworks. При получении этих значений вам нужно использовать карту запросов, потому что в ActionContext нет.
Через ActionContext вы можете получить класс httpservletrequest: «httpservlectrequest request = (httpservletrequest) actioncontext.get (strutsstatics.http_request);».
Вы также можете получить карту запроса через ActionContext: «map requestMap = (map) actionContext.get (" request ");". Поэтому в теге JSP вы можете получить данные карты запроса, используя выражение «#Request».
Как получить httpservletrequest:
Если уже есть ActionContext, используйте "actionContext.get (strutSstatics.http_request)" для получения httpservletrequest.
В пользовательском перехватчике сначала получите ActionContext, а затем получите его через ActionContext.
В действии сначала получите ActionContext, а затем получите его через ActionContext. Или позвольте действию реализовать интерфейс ServletRequestaware и использовать перехватчик ServletConfiginterceptor, чтобы перехватчик внедрил httpservletrequest.
В JSP вам, как правило, не нужно получать httpservletrequest.
Как получить карту запроса:
Если уже есть ActionContext, используйте «actionContext.get (" request ")" для получения.
В пользовательском перехватчике сначала получите ActionContext, а затем получите его через ActionContext.
В действии сначала получите ActionContext, а затем получите его через ActionContext. Или позвольте действию реализовать интерфейс запроса и использовать перехватчика ServletConfigInterceptor, чтобы перехватчик внедрил запрос на карту.
В JSP используйте «#Request», чтобы получить карту запроса и использовать «#request.key» или «#Request ['key']», чтобы прочитать значение на карте.
Короче говоря, запрос по -прежнему соответствует общим правилам веб -сайтов Java. Тем не менее, автор рекомендует, чтобы пользователи старались избегать использования запроса для передачи значений.
Некоторые примеры:
// Этот класс продемонстрирует работу карты httpservlectrequest и запроса в receptor publicclass myinterceptor extrables retable intrablemeptor {public String Intercept (actionInvocation vocation) Throws {// get actionContext actionContext actionContext = vocation.getInvocationContext (); // Получить httpservletrequest httpservletrequest httpservletrequest = (httpservletrequest) actioncontext.get (strutsstatics.http_request); // Получить карту map requestmap = (map) actioncontext.get ("request"); // Создать класс как экземпляр Person = new Person (); // Следующие две строки операторов имеют одинаковую функцию httpservletrequest.setattribute («человек», человек); requestmap.put ("person", человек); // другие коды // ...... return vocation.invoke (); }} // Этот класс продемонстрирует работу карты httpservlectrequest и запроса в действии (статический метод получает ActionContext) publicClass extends actionSupport {@Override public String execute () Throws Exception {// eave ActionContext actionContext = actionContext.getContext (); // Получить httpservletrequest httpservlectrequest httpservletrequest = (httpservletrequest) actioncontext.get (strutsstatics.http_request); // Получить карту map requestmap = (map) actioncontext.get ("request"); // Создать класс как экземпляр Person = new Person (); // Следующие две строки операторов имеют одинаковую функцию httpservletrequest.setattribute («человек», человек); requestmap.put ("person", человек); // другие коды // ...... вернуть успех; }} // Этот класс продемонстрирует использование ServletRequestaware в действии для получения httpservletrequest (Примечание: вам необходимо использовать ServletConfigEnterceptor Interceptor) PublicClass MyAction расширяет ActionSupport реализует ServletRequestaware {private httpservletrequest запрос; // Этот метод является методом интерфейса ServletRequestaware publicvoid setServletRequest (httpservletrequest) {this.request = request; } @Override public String execute () throws exception {// httpservletrequest готово в поле этого класса и может использоваться напрямую // ...... вернуть успех; }} // Этот класс продемонстрирует использование ServletRequestaware в действии для получения карты запроса (Примечание: вы хотите использовать ServletConfigInterceptor Interceptor) PublicClass MyAction Extends Decsports Внедряет requestaware {map <string, объект> запрос; // Этот метод является методом интерфейса requestaware publicvoid setRequest (map <string, объект> запрос) {this.Request = request; } @Override public String execute () Throws Exception {// Карта запроса готова в поле класса и может использоваться напрямую // ...... вернуть успех; }}<! Doctype html> <html> <head> <meta http-equiv = "content-type" content = "text/html; charset = utf-8"> <Title> jsp page </title> </head> <body> <!-Этот JSP продемонстрирует использование отображения Maps в JSP-> <! Это JSP является MySpor-Map MAPS-> <! Значение автоматически сохраняется в ActionContext by Struts2 (ключ-это запрос), поэтому используйте «#», чтобы получить доступ к ActionContext и прочитать запрос из него-> <S: Property Value = "#запрос"/> <!-Следующие две строки являются значением ключа «Имя» в карте, которая обращается к запросу-> <s value =##recement.name »/> <s:#value = value wome 'wome». </html>
3. Параметры, то есть параметры запроса GET или публикации запроса
Параметры - это параметры, передаваемые браузером на сервер при запросе get или post. В традиционных веб -проектах Java используйте такие методы, как httpservletrequest.getParameter () для получения параметров, и вы можете напрямую использовать httpservletrequest.getParameterMap () для получения карты с инкапсулированными параметрами. В Struts2 Struts2 напрямую сохраняет вышеуказанную карту в ActionContext, с ключом «параметры». Кроме того, ActionContext также напрямую предоставляет метод ActionContext.getParameters () для получения этой карты. Следовательно, метод эксплуатационных параметров в каждом компоненте Struts2 очень похож на метод работы карты запроса, и этот параграф не будет подробно описан.
4. Карта класса и сеанса httpservlectsession
Сессия в традиционных веб -проектах Java все знакомы, и мы используем его для записи статуса сеанса пользователя. Struts2 инкапсулирует Httpservlectsession в карту, то есть «карту сеанса», которая аналогична обработке запроса. Однако, чтобы сохранить системные ресурсы, мы не будем создавать сеансы, когда нам не понадобятся сеансы. Именно из -за этого Httpservlectsession не помещается в ActionContext в Struts2. Если вашей программе необходимо использовать httpservlectsession, вы должны сначала получить HttpservletRequest, а затем использовать GetSession () или getSession (логическое б), чтобы получить его, и решить, нужно ли вам создать сеанс. Для карты сеанса Struts2 по -прежнему помещает его в ActionContext (ключ «сеанс»), но не волнуйтесь, механизм этой карты создает сеансы только при создании новых значений. Короче говоря, операция Httpservlectsession в Struts2 должна сначала получить его через httpservletrequest, а операция карты сеанса точно такая же, как операция карты запроса, которая не будет подробно описана в этом параграфе.
5. Map of ServletContext и Application
В традиционных веб -проектах Java ServletContext используется для хранения глобальных переменных, и у каждой виртуальной машины Java есть только один ServletContext на веб -проект. Этот ServletContext создается веб -сервером для обеспечения его уникальности. У ServletContext есть некоторые методы, которые могут управлять своими атрибутами, и эти операции аналогичны работе с картой. Таким образом, Struts2 снова инкапсулирует: он инкапсулирует атрибуты ServletContext в карту, то есть «карту приложений», а также помещает его в ActionContext (ключ - приложение). Следовательно, если операция карты приложения соответствует карте запроса, этот абзац не будет подробно описан.
Что касается операции на ServletContext, то она аналогична операции на HttpservletRequest: Struts2 помещает ServletContext в ActionContext, а ServletConfiginterceptor предоставляет интерфейс Indection ServletContextAware для ServletContext. Следовательно, этот абзац не будет описан подробно.
ПРИМЕЧАНИЕ. Использование «#application» в экспрессии ognl может получить карту приложения, а не ServletContext. Однако в коде Java, встроенного в JSP (например, «< % application.getattribute (« »); %>»), приложение является сервистским контекстом, а не картой.