Учебники

Struts 2 — Перехватчики

Перехватчики концептуально такие же, как фильтры сервлетов или прокси-класс JDK. Перехватчики позволяют реализовать функциональность пересекающихся функций отдельно от действия, а также от структуры. Используя перехватчики, вы можете добиться следующего:

  • Предоставление логики предварительной обработки перед вызовом действия.

  • Предоставление логики постобработки после вызова действия.

  • Перехват исключений, чтобы можно было выполнить альтернативную обработку.

Предоставление логики предварительной обработки перед вызовом действия.

Предоставление логики постобработки после вызова действия.

Перехват исключений, чтобы можно было выполнить альтернативную обработку.

Многие функции, предоставляемые в структуре Struts2 , реализованы с использованием перехватчиков;

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

Структурные перехватчики Struts2

Структура Struts 2 предоставляет хороший список готовых перехватчиков, которые предварительно настроены и готовы к использованию. Немногие из важных перехватчиков перечислены ниже —

Sr.No Перехватчик и описание
1

псевдоним

Позволяет параметрам иметь разные псевдонимы имен в запросах.

2

флажок

Помогает в управлении флажками, добавляя значение параметра false для флажков, которые не отмечены.

3

conversionError

Помещает информацию об ошибках из преобразования строк в типы параметров в ошибки поля действия.

4

CreateSession

Автоматически создает сеанс HTTP, если он еще не существует.

5

отладка

Предоставляет разработчику несколько разных экранов отладки.

6

execAndWait

Отправляет пользователя на промежуточную страницу ожидания, пока действие выполняется в фоновом режиме.

7

исключение

Сопоставляет исключения, возникающие в результате действия, с результатом, что позволяет автоматически обрабатывать исключения посредством перенаправления.

8

файл загружен

Облегчает простую загрузку файлов.

9

i18n

Отслеживает выбранную локаль во время сеанса пользователя.

10

лесоруб

Обеспечивает простое ведение журнала путем вывода имени выполняемого действия.

11

Титулы

Устанавливает параметры запроса на действие.

12

подготовить

Обычно это используется для выполнения предварительной обработки, такой как настройка соединений с базой данных.

13

профиль

Позволяет регистрировать простую информацию профилирования для действий.

14

объем

Сохраняет и получает состояние действия в области сеанса или приложения.

15

ServletConfig

Предоставляет действию доступ к различной информации на основе сервлетов.

16

таймер

Предоставляет простую информацию о профилировании в виде того, сколько времени требуется для выполнения действия.

17

знак

Проверяет действие на наличие действительного токена, чтобы предотвратить дублирование отправки форм.

18

Проверка

Обеспечивает поддержку проверки действий

псевдоним

Позволяет параметрам иметь разные псевдонимы имен в запросах.

флажок

Помогает в управлении флажками, добавляя значение параметра false для флажков, которые не отмечены.

conversionError

Помещает информацию об ошибках из преобразования строк в типы параметров в ошибки поля действия.

CreateSession

Автоматически создает сеанс HTTP, если он еще не существует.

отладка

Предоставляет разработчику несколько разных экранов отладки.

execAndWait

Отправляет пользователя на промежуточную страницу ожидания, пока действие выполняется в фоновом режиме.

исключение

Сопоставляет исключения, возникающие в результате действия, с результатом, что позволяет автоматически обрабатывать исключения посредством перенаправления.

файл загружен

Облегчает простую загрузку файлов.

i18n

Отслеживает выбранную локаль во время сеанса пользователя.

лесоруб

Обеспечивает простое ведение журнала путем вывода имени выполняемого действия.

Титулы

Устанавливает параметры запроса на действие.

подготовить

Обычно это используется для выполнения предварительной обработки, такой как настройка соединений с базой данных.

профиль

Позволяет регистрировать простую информацию профилирования для действий.

объем

Сохраняет и получает состояние действия в области сеанса или приложения.

ServletConfig

Предоставляет действию доступ к различной информации на основе сервлетов.

таймер

Предоставляет простую информацию о профилировании в виде того, сколько времени требуется для выполнения действия.

знак

Проверяет действие на наличие действительного токена, чтобы предотвратить дублирование отправки форм.

Проверка

Обеспечивает поддержку проверки действий

Пожалуйста, ознакомьтесь с документацией Struts 2 для получения полной информации о вышеупомянутых перехватчиках. Но я покажу вам, как вообще использовать перехватчик в вашем приложении Struts.

Как использовать перехватчики?

Давайте посмотрим, как использовать уже существующий перехватчик для нашей программы «Hello World». Мы будем использовать таймер- перехватчик, цель которого — измерить, сколько времени потребовалось для выполнения метода действия. В то же время я использую params interceptor, цель которого — отправить параметры запроса в действие. Вы можете попробовать свой пример, не используя этот перехватчик, и вы обнаружите, что свойство name не устанавливается, поскольку параметр не может достичь действия.

Мы сохраним файлы HelloWorldAction.java, web.xml, HelloWorld.jsp и index.jsp, как они были созданы в главе « Примеры», но давайте изменим файл struts.xml, добавив перехватчик следующим образом:

<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
   <constant name = "struts.devMode" value = "true" />
   
   <package name = "helloworld" extends = "struts-default">
      <action name = "hello" 
         class = "com.tutorialspoint.struts2.HelloWorldAction"
         method = "execute">
         <interceptor-ref name = "params"/>
         <interceptor-ref name = "timer" />
         <result name = "success">/HelloWorld.jsp</result>
      </action>
   </package>
</struts>

Щелкните правой кнопкой мыши имя проекта и выберите « Экспорт»> «Файл WAR», чтобы создать файл «War». Затем разверните эту WAR в каталоге веб-приложений Tomcat. Наконец, запустите сервер Tomcat и попробуйте получить доступ к URL-адресу http: // localhost: 8080 / HelloWorldStruts2 / index.jsp . Это создаст следующий экран —

Hello World Struts 4

Теперь введите любое слово в данное текстовое поле и нажмите кнопку «Скажи привет», чтобы выполнить определенное действие. Теперь, если вы проверите сгенерированный журнал, вы найдете следующий текст —

INFO: Server startup in 3539 ms
27/08/2011 8:40:53 PM 
com.opensymphony.xwork2.util.logging.commons.CommonsLogger info
INFO: Executed action [//hello!execute] took 109 ms.

Здесь нижняя строка генерируется из-за таймера- перехватчика, который сообщает, что для выполнения действия потребовалось всего 109 мсек.

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

Использование пользовательских перехватчиков в вашем приложении — это элегантный способ обеспечить сквозные функции приложения. Создать собственный перехватчик легко; интерфейс, который должен быть расширен, является следующим интерфейсом Interceptor

public interface Interceptor extends Serializable {
   void destroy();
   void init();
   String intercept(ActionInvocation invocation)
   throws Exception;
}

Как следует из названий, метод init () предоставляет способ инициализации перехватчика, а метод destroy () предоставляет средство для очистки перехватчика. В отличие от действий, перехватчики повторно используются в запросах и должны быть поточно-ориентированными, особенно метод intercept ().

Объект ActionInvocation обеспечивает доступ к среде выполнения. Это позволяет получить доступ к самому действию и методам, чтобы вызвать действие и определить, было ли уже вызвано действие.

Если вам не нужен код инициализации или очистки, класс AbstractInterceptor может быть расширен. Это обеспечивает реализацию nooperation по умолчанию методов init () и destroy ().

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

Давайте создадим следующий MyInterceptor.java в разделе Ресурсы Java> папка src

package com.tutorialspoint.struts2;

import java.util.*;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class MyInterceptor extends AbstractInterceptor {

   public String intercept(ActionInvocation invocation)throws Exception {

      /* let us do some pre-processing */
      String output = "Pre-Processing"; 
      System.out.println(output);

      /* let us call action or next interceptor */
      String result = invocation.invoke();

      /* let us do some post-processing */
      output = "Post-Processing"; 
      System.out.println(output);

      return result;
   }
}

Как вы заметили, фактическое действие будет выполнено с использованием перехватчика с помощью вызова invocation.invoke () . Таким образом, вы можете выполнить некоторую предварительную и постобработку в зависимости от ваших требований.

Фреймворк сам запускает процесс, выполняя первый вызов invoke () объекта ActionInvocation. Каждый раз, когда вызывается invoke () , ActionInvocation проверяет свое состояние и запускается в зависимости от того, какой перехватчик последует. Когда все сконфигурированные перехватчики были вызваны, метод invoke () вызовет выполнение самого действия.

Следующая диаграмма показывает ту же концепцию в потоке запросов —

ActionInvocation

Создать класс действий

Давайте создадим Java-файл HelloWorldAction.java в разделе « Ресурсы Java> src» с именем пакета com.tutorialspoint.struts2 с содержимым, приведенным ниже.

package com.tutorialspoint.struts2;

import com.opensymphony.xwork2.ActionSupport;

public class HelloWorldAction extends ActionSupport {
   private String name;

   public String execute() throws Exception {
      System.out.println("Inside action....");
      return "success";
   }  

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }
}

Это тот же класс, который мы видели в предыдущих примерах. У нас есть стандартные методы получения и установки для свойства «name» и метод execute, который возвращает строку «success».

Создать представление

Давайте создадим нижеприведенный jsp-файл HelloWorld.jsp в папке WebContent в вашем проекте eclipse.

<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>

<html>
   <head>
      <title>Hello World</title>
   </head>
   
   <body>
      Hello World, <s:property value = "name"/>
   </body>
</html>

Создать главную страницу

Нам также нужно создать index.jsp в папке WebContent. Этот файл будет служить начальным URL-адресом действия, по которому пользователь может щелкнуть платформу Struts 2, чтобы вызвать определенный метод класса HelloWorldAction и отобразить представление HelloWorld.jsp.

<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
   pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
   <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
   <head>
      <title>Hello World</title>
   </head>
   
   <body>
      <h1>Hello World From Struts2</h1>
      <form action = "hello">
         <label for = "name">Please enter your name</label><br/>
         <input type = "text" name = "name"/>
         <input type = "submit" value = "Say Hello"/>
      </form>
   </body>
</html>

Действие hello, определенное в приведенном выше файле представления, будет сопоставлено с классом HelloWorldAction и его методом execute с использованием файла struts.xml.

Конфигурационные файлы

Теперь нам нужно зарегистрировать наш перехватчик и затем вызвать его, как мы уже называли перехватчик по умолчанию в предыдущем примере. Для регистрации вновь определенного перехватчика теги <interceptors> … </ interceptors> помещаются непосредственно под тегом <package> ins Struts.xml . Вы можете пропустить этот шаг для перехватчиков по умолчанию, как мы делали в предыдущем примере. Но здесь давайте регистрироваться и использовать его следующим образом —

<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
   <constant name = "struts.devMode" value = "true" />
   <package name = "helloworld" extends = "struts-default">

      <interceptors>
         <interceptor name = "myinterceptor"
            class = "com.tutorialspoint.struts2.MyInterceptor" />
      </interceptors>

      <action name = "hello" 
         class = "com.tutorialspoint.struts2.HelloWorldAction" 
         method = "execute">
         <interceptor-ref name = "params"/>
         <interceptor-ref name = "myinterceptor" />
         <result name = "success">/HelloWorld.jsp</result>
      </action>

   </package>
</struts>

Следует отметить, что вы можете зарегистрировать более одного перехватчика внутри тега <package> и в то же время вы можете вызвать более одного перехватчика внутри тега <action> . Вы можете вызывать один и тот же перехватчик с разными действиями.

Файл web.xml необходимо создать в папке WEB-INF в WebContent следующим образом:

<?xml version = "1.0" Encoding = "UTF-8"?>
<web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xmlns = "http://java.sun.com/xml/ns/javaee" 
   xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee 
   http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   id = "WebApp_ID" version = "3.0">
   
   <display-name>Struts 2</display-name>
   
   <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>
   
   <filter>
      <filter-name>struts2</filter-name>
      <filter-class>
         org.apache.struts2.dispatcher.FilterDispatcher
      </filter-class>
   </filter>

   <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>
</web-app>

Щелкните правой кнопкой мыши имя проекта и выберите « Экспорт»> «Файл WAR», чтобы создать файл «War». Затем разверните эту WAR в каталоге веб-приложений Tomcat. Наконец, запустите сервер Tomcat и попробуйте получить доступ к URL-адресу http: // localhost: 8080 / HelloWorldStruts2 / index.jsp . Это создаст следующий экран —

Hello World Struts 4

Теперь введите любое слово в данное текстовое поле и нажмите кнопку «Скажи привет», чтобы выполнить определенное действие. Теперь, если вы проверите сгенерированный журнал, вы найдете следующий текст внизу —

Pre-Processing
Inside action....
Post-Processing

Укладка нескольких перехватчиков

Как вы можете себе представить, необходимость настроить несколько перехватчиков для каждого действия быстро станет чрезвычайно неуправляемой. По этой причине перехватчики управляются стеками перехватчиков. Вот пример, прямо из файла strutsdefault.xml —

<interceptor-stack name = "basicStack">
   <interceptor-ref name = "exception"/>
   <interceptor-ref name = "servlet-config"/>
   <interceptor-ref name = "prepare"/>
   <interceptor-ref name = "checkbox"/>
   <interceptor-ref name = "params"/>
   <interceptor-ref name = "conversionError"/>
</interceptor-stack>

Вышеуказанная ставка называется basicStack и может использоваться в вашей конфигурации, как показано ниже. Этот узел конфигурации находится под узлом <package … />. Каждый тег <interceptor-ref … /> ссылается либо на перехватчик, либо на стек перехватчиков, который был настроен перед текущим стеком перехватчиков. Поэтому очень важно обеспечить, чтобы имя было уникальным во всех конфигурациях стека перехватчиков и перехватчиков при настройке начальных перехватчиков и стеков перехватчиков.

Мы уже видели, как применить перехватчик к действию, применение стеков перехватчика ничем не отличается. На самом деле, мы используем точно такой же тег —

<action name = "hello" class = "com.tutorialspoint.struts2.MyAction">
   <interceptor-ref name = "basicStack"/>
   <result>view.jsp</result>
</action

Вышеуказанная регистрация «basicStack» зарегистрирует полную ставку всех шести перехватчиков с действием hello. Следует отметить, что перехватчики выполняются в том порядке, в котором они были настроены. Например, в вышеприведенном случае сначала будет выполнено исключение, во-вторых будет config-сервлет и так далее.