Статьи

Руководство по Struts 2: руководство по перехватчикам Struts 2 с примером

Добро пожаловать в часть 5 серии из 7 частей, где мы обсуждаем различные аспекты Struts2 Framework. В предыдущей статье мы увидели, как интегрировать фреймворк Tiles со Struts2.

Сегодня мы исследуем мир перехватчиков в Struts2. Мы увидим, что такое перехватчики и как их настроить в веб-приложении на базе Struts2.

Struts 2 Interceptors: Основы

Struts2 предоставляет очень мощный механизм управления запросом с использованием перехватчиков. Перехватчики отвечают за большую часть обработки запросов. Они вызываются контроллером до и после вызова действия, таким образом, они находятся между контроллером и действием. Перехватчики выполняют такие задачи, как ведение журналов, проверка, загрузка файлов, защита от двойной отправки и т

. Д. Жизненный цикл обработки запросов в среде Struts2 в значительной степени обсуждается. Часть 1. Введение в Struts2 Framework .

  1. Запрос генерируется пользователем и отправляется в контейнер сервлета.
  2. Контейнер сервлетов вызывает фильтр FilterDispatcher, который, в свою очередь, определяет соответствующее действие.
  3. Один за другим перехватчики применяются перед вызовом действия. Перехватчики выполняют такие задачи, как ведение журнала, проверка, загрузка файлов, защита от двойной отправки и т. Д.
  4. Действие выполняется, а результат генерируется действием.
  5. Вывод Action отображается в представлении (JSP, Velocity и т. Д.), А результат возвращается пользователю.

Таким образом, перехватчики Struts2 устраняют сквозные задачи, такие как ведение журнала из компонентов действия, и обеспечивают более четкое разделение MVC.

Struts2 поставляется со списком перехватчиков по умолчанию, уже настроенным в приложении, в файле struts-default.xml. Мы можем создать наши собственные перехватчики и подключить их к веб-приложению на основе Struts2.

Framework создает объект ActionInvocation, который инкапсулирует действие и все перехватчики, настроенные для этого действия. Каждый перехватчик вызывается до того, как вызывается действие. Как только действие вызывается и генерируется результат, каждый перехватчик снова вызывается в обратном порядке для выполнения постобработки. Перехватчики могут изменить рабочий процесс действия. Это может помешать выполнению действий.

Наша цель

Нашей целью будет создание клиентского перехватчика MyLoggingInterceptor , который будет регистрировать запрос до вызова какого-либо действия. Также будет напечатано имя класса Action и время выполнения действия в миллисекундах.

Создать перехватчик регистрации

Создайте Java-класс MyLoggingInterceptor в пакете net.viralpatel.struts2.interceptors и скопируйте в него следующий контент.

package net.viralpatel.struts2.interceptor;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.Interceptor;public class MyLoggingInterceptor implements Interceptor{private static final long serialVersionUID = 1L;public String intercept(ActionInvocation invocation) throws Exception {String className = invocation.getAction().getClass().getName();long startTime = System.currentTimeMillis();System.out.println("Before calling action: " + className);String result = invocation.invoke();long endTime = System.currentTimeMillis();System.out.println("After calling action: " + className+ " Time taken: " + (endTime - startTime) + " ms");return result;}public void destroy() {System.out.println("Destroying MyLoggingInterceptor...");}public void init() {System.out.println("Initializing MyLoggingInterceptor...");}}

Настройка перехватчика в struts.xml

После того, как мы создали класс-перехватчик, все, что нам нужно сделать, это настроить его в файле struts.xml и использовать его с действиями.

Чтобы настроить вновь созданный перехватчик, добавьте следующий код в struts.xml

<interceptors><interceptor name="mylogging"class="net.viralpatel.struts2.interceptor.MyLoggingInterceptor"></interceptor><interceptor-stack name="loggingStack"><interceptor-ref name="mylogging" /><interceptor-ref name="defaultStack" /></interceptor-stack></interceptors>

Этот код должен быть добавлен после тега <result-types> в <package> </ package>.
Здесь мы сконфигурировали новый журнал перехватчиков с тегом <interceptor>. Также обратите внимание, что мы определили стек-перехватчик с именем loggingStack. Это сделано для того, чтобы Sturts2 также вызывал все перехватчики по умолчанию при вызове нашего пользовательского перехватчика. Это очень важно, так как логика проверки не будет работать в нашем приложении struts2, если мы игнорируем стек перехватчиков по умолчанию.

Мы можем сделать новый loggingStack в качестве стека перехватчиков по умолчанию или настроить его на каждом уровне действий. Чтобы сделать его стеком по умолчанию, мы должны добавить следующее в struts.xml

<default-interceptor-ref name="loggingStack"></default-interceptor-ref>

Как только мы добавим приведенный выше код в Struts.xml, logginStack будет применен ко всем действиям в этом пакете.

Также мы можем захотеть применить пользовательский стек перехватчиков только к определенным действиям. Для этого мы должны добавить тег interceptor-ref в действии.

<action name="login"class="net.viralpatel.struts2.LoginAction"><interceptor-ref name="loggingStack"></interceptor-ref><result name="success" type="tiles">/welcome.tiles</result><result name="error">Login.jsp</result></action>

Это все люди

Если мы выполним наше приложение StrutsHelloWorld в Eclipse и увидим журналы консоли, мы найдем операторы журнала, которые мы печатаем в нашем перехватчике.

Initializing MyLoggingInterceptor.........Before calling action: net.viralpatel.struts2.LoginAction....After calling action: net.viralpatel.struts2.LoginAction Time taken: 313 ms......Destroying MyLoggingInterceptor...

Скачать исходный код

Нажмите здесь, чтобы загрузить исходный код без файлов JAR (17 КБ)

Двигаться дальше

Сегодня мы увидели, что такое перехватчики Struts и как создать собственный перехватчик и настроить его с помощью веб-приложения на основе Struts2. В следующей части мы увидим пример загрузки файла Struts2.