Struts 2 - перехватчики

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

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

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

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

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

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

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

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

Старший Нет Перехватчик и описание
1

alias

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

2

checkbox

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

3

conversionError

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

4

createSession

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

5

debugging

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

6

execAndWait

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

7

exception

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

8

fileUpload

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

9

i18n

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

10

logger

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

11

params

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

12

prepare

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

13

profile

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

14

scope

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

15

ServletConfig

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

16

timer

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

17

token

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

18

validation

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

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

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

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

Мы будем хранить файлы HelloWorldAction.java, web.xml, HelloWorld.jsp и index.jsp в том виде, в каком они были созданы в Examples главу, но давайте изменим 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>

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

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

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.

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

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

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

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

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

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

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

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

Давайте создадим следующий MyInterceptor.java в Java Resources > 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 () вызовет выполнение самого действия.

На следующей диаграмме показана та же концепция через поток запросов -

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

Давайте создадим java-файл HelloWorldAction.java под Java Resources > 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 и его методом выполнения с использованием файла struts.xml.

Файлы конфигурации

Теперь нам нужно зарегистрировать наш перехватчик, а затем вызвать его, как мы вызвали перехватчик по умолчанию в предыдущем примере. Чтобы зарегистрировать новый перехватчик, теги <interceptors> ... </interceptors> помещаются непосредственно под тегами <package>.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>

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

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

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. Следует отметить, что перехватчики запускаются в том порядке, в котором они были настроены. Например, в приведенном выше случае сначала будет выполнено исключение, вторым - servlet-config и так далее.