1. Interceptor Введение
Функция перехватчика аналогична фильтру в файле web.xml. Он может перехватывать запросы пользователей и управлять страницей, перехватывая запросы пользователей. Перехватчик настроен в Cruts-Core-2.2.3.jar. Оригинальный перехватчик настроен в struts-default.xml, который запечатывает базовый метод использования перехватчика.
Функция перехвата struts2 аналогична сервентовому фильтру. Прежде чем действие выполняет метод выполнения, Struts2 сначала выполнит перехватчик, упомянутый на struts.xml. Если есть несколько перехватчиков, он будет выполнен в порядке вверх и вниз. После выполнения метода перехватчиков всех перехватчиков будет выполнен метод выполнения.
Interceptor Struts2 должен реализовать этот интерфейс от com.opensymphoy.xwork2.interceptor.interceptor. Следующие три метода должны быть реализованы в определенном перехватчике:
void destress (); void init (); String Intercept (ActionInvocation Evocation) выбрасывает исключение;
Пользовательские перехватчики должны переопределить три вышеуказанные методы. Кроме того, файл конфигурации Interceptor struts.xml Struts2 наследует исходный файл файлов struts-default.xml, так что вся информация о конфигурации в struts-default.xml будет автоматически принадлежать в соответствующем <пакете>. Конкретный код заключается в следующем:
<name пакета = "demo" extends = "struts-default"> ... </package>
2. Добавить перехватчик
Чтобы использовать перехватчик, вы должны быть настроены. Struts2 использует метод отображения, поэтому, если вы хотите использовать определенную функцию, вы должны быть настроены в файле конфигурации, а перехватчик не является исключением. Следовательно, соответствующий элемент перехватчика должен быть добавлен в пакет, и перехватчик должен быть связан с соответствующим файлом класса, чтобы соответствующий перехватчик был выполнен до выполнения действия. Конкретный метод использования заключается в следующем.
(1) Добавить файл конфигурации struts.xml и добавить перехватчик в файл
<package name = "testlogin" namespace = "/" extends = "struts-default"> <!-Interceptor-> <ineceptor name = "myInterceptor"> </receptor> </receptor> <name = "demo"> <name = "error" type = "radiRect">/error.jsp </result> <suld> <suctive name "/succeper resulce. name = "CheckError">/checkSession.jsp </result> <receptor-ref name = "myInterceptor"> </receptor-ref> <receptor-ref name = "defaultstack"> </receptor-ref> </action> </package>
В приведенном выше пакете был добавлен перехватчик по имени Myinterceptor, и для перехватчика был зарегистрирован класс Java, который был назван Myinterceptor и был заблокирован в пакете Com.Interceptor. Кроме того, соответствующее действие было добавлено в пакет. Перед выполнением действия перехватчик MyInterceptor будет выполнен первым.
(2) Напишите зарегистрированный класс перехвата MyInterceptor. Этот класс должен реализовать интерфейс com.opensymphoy.xwork2.interceptor.interceptor и переопределить соответствующий метод
пакет com.interceptor; импортировать java.util.map; Импорт com.entity.user; Импорт com.opensymphony.xwork2.actionContext; импорт com.opensymphony.xwork2.actioninvocation; Импорт com.opensymphony.xwork2.interceptor.interceptor; открытый класс myInterceptor реализует Interceptor {частного пользователя; public user getUser () {return user; } public void setUser (пользователь пользователя) {this.user = user; } @Override public void destress () {// todo Автогенерированный метод STUB System.out.println ("---- Dissument () ----"); } @Override public void init () {// todo автоматическое сгенерированное метод System.out.println ("------ init () -------"); } @Override public String Intercept (actionInvocation vocation) выбрасывает исключение {// todo автоматическое сгенерированное метод System.out.println ("-----------"); Map <string, object> session = vocation.getInvocationContext (). GetSession (); if (session.get ("username")! = null) {System.out.println ("Вход успешно!"); //session.put ("username", user.getusername ()); return vocation.invoke (); } else {System.out.println ("login не удалось!"); вернуть "CheckError"; }}}(3) После первых двух шагов перехватчик был настроен. Последняя часть - использовать перехватчик. Добавьте соответствующий тег на страницу отображения и укажите действие с именем, созданное выше для тега. Затем выполните страницу, чтобы распечатать соответствующий контент перехватчика в консоли.
<%@ page language = "java" contentType = "text/html; charset = utf-8" pageencoding = "utf-8"%> <! doctype html public "-// w3c // dtd html 4.01 transitional // en" http://www.w3.org/tml4/html4/html. <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <form action="demo"> Username: <input type="text" name="username"><br> Password: <input type="text" name="password"><br> <input type = "Отправить" name = "ok" value = "pospe"> </form> </body> </html>
Контент распечатки:
Проанализируйте результаты выходных данных. На этапе компиляции программы файл конфигурации struts.xml сначала будет считывать файл конфигурации struts.xml, а в действии файла конфигурации найдите, добавил ли перехватчик. Если добавляется перехватчик, обнаружите, определяется ли перехватчик или стек перехватчика в <Interceptors> в соответствии с именем перехватчика. Если обнаружено, что перехватчик определяется, найдите соответствующий зарегистрированный класс на основе перехватчика и, наконец, найдите зарегистрированный класс в пакете и выполните соответствующий метод init (). Общий процесс программы, работающего на этапе работы, похож на этап компиляции. После того, как пользователь подает запрос на переднем плане, он будет искать соответствующее действие на struts.xml. Если это найдено, перехватчик будет найден. Если это не найдено, соответствующая ошибка будет выбрана. Наконец, метод перехвата класса регистрации перехвата выполняется.
3. Stack Interceptor
Перехватчики также имеют концепцию стека. Они определяют используемые перехватчики в общем состоянии для достижения единого управления, так что перехватыватели могут быть использованы в пакете, что значительно облегчает использование перехватчиков. Повторные перехватчики часто используются в упаковке. Если вы добавляете перехватчик-реф в действие каждый раз, это будет очень хлопотно. Затем создается стек перехватчиков для решения этой проблемы. Конкретная конфигурация заключается в следующем:
<package name = "testlogin" namespace = "/" extends = "struts-default"> <!-Interceptor-> <ineceptor name = "myInterceptor"> </receptor> <!-Определите цепочку Public Interceptor. In the action tag, only the interceptor chain needs to be referenced --> <interceptor-stack name="defaulttstack1"> <interceptor-ref name="myInterceptor"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors> <action name="demo"> <result name="error" type = "redirect">/error.jsp </result> <result name = "success">/success.jsp </result> <name = "result =" CheckError ">/checksession.jsp </result> <receptor-ref name =" defaultStack1 "> </receptor-Ref> </action> </package>
В примере Interceptor-Stack используется для определения стека перехватчиков с именем defaulttStack1. Для выполнения перехватчика добавляется в стек, инкапсулируется перехватчик, а стек перехватчика называется непосредственно в действии, реализуя обмен стеком перехватчиков.
4. Стек перехвата по умолчанию
Кроме того, можно определить стек перехватчиков по умолчанию, то есть, если в действии нет никакого перехвата, он по умолчанию не будет выполнять публичного перехватчика. Он принадлежит к тому же уровню, что и тег перехватчиков, и определяется с помощью Interceptor-REF по умолчанию.
<package name = "testlogin" namespace = "/" extends = "struts-default"> <!-Interceptor-> <ineceptor name = "myInterceptor"> </receptor> <!-Определите цепочку Public Interceptor. In the action tag, only the interceptor chain needs to be referenced --> <interceptor-stack name="defaultinter"> <interceptor-ref name="myInterceptor"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors> <!-- Define the default interceptor stack and will be automatically registered in the action -> <interceptor-ref name = "defaultInter"> </default-Interceptor-REF> <name = "demo"> <result name = "error" type = "redirect">/error.jsp </result> <result name = "success">/success.jsp </result> <name = "checkerror">/checkesessed.jsp </result> </result> </result name = "checkerror">/checkesessessed.jsp </result> </result> </parkeSessession.
Определенный стек перехватчиков по умолчанию выполняет только пользовательский стек перехватчиков по умолчанию, если в действии не указано перехватчик. Если перехватчик переопределен в действии, он будет переоценить пользовательский стек перехватчика по умолчанию.
5. Никакого исполнения перехватчика
Существует еще одна ситуация, когда пакет определяет перехватчик по умолчанию, но не требуется никакого перехвата в определенном написанном действии. Затем вы можете добавить перехватчик с именем DefaultStack в соответствующее действие. Это перехватчик по умолчанию системы, и операций не будет.
<package name = "testlogin" namespace = "/" extends = "struts-default"> <!-Interceptor-> <ineceptor name = "myInterceptor"> </receptor> <!-Определите цепочку Public Interceptor. In the action tag, only the interceptor chain needs to be referenced --> <interceptor-stack name="defaultinter"> <interceptor-ref name="myInterceptor"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors> <!-- Define the default interceptor stack and will be automatically registered in the action -> <interceptor-ref name = "defaultInter"> </default-interceptor-ref> <name = "demo"> <result name = "error" type = "redirect">/error.jsp </result> <result name = "success">/uccess.jsp </result> <name = "checkError">/проверка. не выполняется-> <receptor-ref name = "defaultStack"> </receptor-ref> </action> </package>
6. Метод перехвата
6.1 Использование
Приведенный выше перехватчик только реализует перехватчик перехвата. Фактически, перехватчик имеет очень мощную функцию и также может перехватывать соответствующий метод действия. Разница между перехватом действия заключается в том, что если вы хотите перехватить метод, вы должны унаследовать класс MethodFilterInterceptor. Этот класс заключен в xwork-core.jar, который еще раз доказывает, что веб-работа является ядром Struts2. Кроме того, также необходимо добавить соответствующие атрибуты в файл конфигурации, чтобы определить метод перехвата и метод не вмешательства. Конкретный метод конфигурации заключается в следующем:
<package name = "testlogin" namespace = "/" extends = "struts-default"> <!-Interceptor-> <ineceptor name = "myInterceptor"> </receptor> <!-Определите цепочку Public Interceptor. In the action tag, only the interceptor chain needs to be referenced --> <interceptor-stack name="defaultinter"> <interceptor-ref name="myInterceptor"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors> <action name="demo"> <result name="error" type = "redirect">/error.jsp </result> <result name = "success">/success.jsp </result> <name = "name =" ceckerror ">/cecksession.jsp </result> <name =" ceckerror ">/cecksession.jsp </result> <!- Настройка перехвата и effectStack. Добавить метод перехвата. Чтобы быть перехваченным в excududemethods-> <receptor-ref name = "defaultstack"> <param name = "includemethods"> добавить имя метода, чтобы быть перехваченным </param> <!-Метод перехвата-> <param name = "excludemethods"> «Имя метода» не требует reception </param> </non-intercept-> <//re-receptor- </package>
Код в классе, который наследует соответствующий метод перехватчика класса MethodFilterInterceptor:
пакет com.interceptor; импортировать java.util.map; Импорт com.opensymphony.xwork2.actionContext; импорт com.opensymphony.xwork2.actioninvocation; Import com.opensymphony.xwork2.interceptor.methodfilterInterceptor; открытый класс Interends MethodFilterInterceptor {@Override public String doIntercept (actionInvocation vocation) Throws exection {System.out.println ("-receptept ()-"); // Получить соответствующую карту сеанса <string, object> session = vocation.getInvocationContext (). GetSession (); Map request = (map) actioncontext.getContext (). Get ("request"); String username = (string) request.get ("user.username"); if (session.get ("username")! = null) {string result = vocation.invoke (); System.out.println ("-end ()-"); результат возврата; }}}} 6.2 Демо
Давайте посмотрим на пример метода перехвата и проанализируем результаты. Следующий пример демонстрирует выходные результаты метода перехвата. В экземпляре класс логинзации создается отдельно, чтобы добавить метод, который будет выполнен действием; Интернет -класс переопределен в методе перехватчика и выводит, связано ли перехватить определенный метод в консоли; Файл login.jsp добавляется для демонстрации выполнения трех методов соответственно.
(1) Определение метода перехватчика в struts.xml определяет перехватчик с именем Inter в пакете и определяет параметры в перехватчике. Includemethods используется для перехвата метода1. Метод2 в ExcudeMethods означает, что метод Methods2 не перехвачен. Конкретная конфигурация заключается в следующем:
<!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.action.extension" value=","></constant> <package name="login" extends="struts-default"> <intemptor name = "inter"> <param name = "includemethods"> method1 </param> <!-метод перехвата1-> <param name = "excludemethods"> method2 </param> </receptor> <receptor-Stack name = "myInterceptor" name = "defaultStack"> </receptor-ref> </receptor-stack> </receptor-stack> </receptortors> <name = "loginaction"> <name = "uccess"> success.jsp </result> <result name = "error"> error.jsp </result> <name = "error"> error.jsp </result> <result> <sult> name = "name =" name = "name =" name "name =" type = "redirectAction"> joven </result> <receptor-ref name = "inter"> </receptor-ref> <receptor-ref name = "defaultstack"> </receptor-ref> </action> </package> </struts>
(2) Класс входа в систему, настройте действие в login.jsp и добавьте три метода метода1-метода3 в этот класс, соответственно, метод1 перехватывается, метод2 и метод3 не перехватываются, и, наконец, мы проверяем выходной результат.
пакет com.action; Import Com.OpensyMphony.xwork2.ActionsUpport; открытый класс вход в систему расширяет actionsupport {@override public String execute () throws exception {if (this.username.equals ("admin") && this.password.equals ("admin")) {return "успех"; } else if (this.username.equals ("cancel") && this.password.equals ("cancel")) {return "cancel"; } else {return "ошибка"; }} public void method1 () {System.out.println ("Метод выполнения: метод1"); } public void method2 () {System.out.println ("Метод выполнения: метод2"); } public void method3 () {System.out.println ("Метод выполнения: метод3"); } private String username; Private String Password; public String getUsername () {return this.username; } public void setUsername (string username) {this.username = username; } public String getPassword () {return this.password; } public void setPassword (String password) {this.password = password; }}(3) Inter Class, наследуя класс MethodFilterInterceptor и используется для реализации методов перехвата. Перепишите метод DoIntercept и добавьте соответствующую информацию для перехвата в метод.
пакет com.interceptor; импортировать java.util.date; импортировать java.util.map; импорт com.action.loginaction; Импорт com.opensymphony.xwork2.actionContext; импорт com.opensymphony.xwork2.actioninvocation; Import com.opensymphony.xwork2.interceptor.methodfilterInterceptor; открытый класс Interends MethodFilterInterceptor {@Override защищенная строка doIntercept (actionInvocation vocation) Throws Exception {// TODO Автогенерированный метод STUB System.out.println ("перехват перехвата перед выполнением действия"+new Date ()); String result = vocation.invoke (); // Выполнить систему метода действия. результат возврата; }}(4) Login.jsp, добавьте три кнопки на странице JSP, продемонстрируйте три метода соответственно и оцените перехват перехватчика метода. Действия, опубликованные три кнопки после нажатия, динамически добавляются в JavaScript. Это достигает метода выполнения различных действий в форме. Конечно, есть и другие методы, которые будут обсуждаться в следующей статье.
<%@ page language = "java" contentType = "text/html; charset = utf-8" pageencoding = "utf-8"%> <! doctype html public "-// w3c // dtd html 4.01 transitional // en" http://www.w3.org/tml4/html4/html. <html> <Head> <meta http-equiv = "content-type" content = "text/html; charset = utf-8"> <Title> вставьте заголовок здесь </title> <script type = "text/javascript"> // Метод 1, определить экземпляр перехваченного метода метода 1 () {var form = документ. [0]; form.action = "loginaction! Method1"; form.submit (); } // Метод 2, добавьте метод, который не перехватывает кнопку 2 Метод функции 2 () {var form = document.forms [0]; form.action = "loginaction! Method2"; form.submit (); } // Метод 3, добавьте метод, который не перехватывает кнопку 3 Метод функции 3 () {var form = document.forms [0]; form.action = "loginaction! Method3"; form.submit (); } </script> </head> <body> <form> имя пользователя: <input type = "text" name = "username"> <br> Пароль: <input type = "text" name = "password"> <br> <input type = "Отправить" name = "ok" value = "inclick =" method1 () "> <input =" name = "ok1" vally = "2" () "()" () "()" () "()" () "()" () "()" () "()" () "()". type = "Отправить" name = "ok2" value = "button3" onclick = "method3 ()"> </form> </body> </html> Просмотр страницы после завершения прогона:
(5) Проанализируйте результаты запуска, нажмите кнопки 1, 2 и 3 соответственно, и выводите результаты в консоли. Кнопка 1 - это связанный метод1. Этот метод перехватывает в struts.xml. Если результат верен, будет отображаться перехваченный результат. Соответствующие кнопки 2 и 3 выводят только выполняемые результаты, потому что они не перехвачены. Затем посмотрите на диаграмму результатов ниже:
Диаграмма результатов является именно результатом нашего анализа. Кнопка 1 была перехвачена, и был выполнен метод DoIntercept в интерфейсе. Соответствующие кнопки 2 и 3 из двух не были перехвачены. Другими словами, метод1 помещается в белый список метода перехватчика, и метод должен быть перехвачен при выполнении; Метод2 помещается в черный список перехватчика, и нет необходимости перехватывать метод; Метод3 ничего не делает.
7. Заключение
Содержание перехватчика суммируется здесь. Interceptor предоставляет очень мощные функции, позволяя разработчикам управлять результатами выходных результатов во время выполнения, увеличивая гибкость программирования. Кроме того, не пытайтесь помнить какие -либо теоретические вещи. Вы должны проанализировать их рационально, больше практиковать и сделать несколько примеров, чтобы более глубокое понимание результатов анализа.
PS: функциональное описание перехватчика, предоставленного Struts2 (Xwork)
Перехватчик | имя | иллюстрировать |
Псевдоним перехватчик | псевдоним | Параметры запроса преобразуются в различные файлы имен между различными запросами, и содержание запроса остается неизменным |
Цепочка перехватчика | цепь | Пусть свойства предыдущего действия получают доступ к следующему действию и теперь используются в сочетании с результатом типа цепи (<result type = "chain">). |
Перехватчик флажки | флажок | Добавлен флажок Автоматической обработки, установив содержимое Uncheckbox в False, в то время как HTML не отправляет Uncheckbox по умолчанию. |
Печенье -перехватчик | Печенье | Используйте настроенное имя и значение для обозначения файлов cookie |
Ошибка преобразования перехватчик | ConversionError | Добавляет ошибку из ActionContext в поле свойства действия. |
Создать перехватчик сеанса | создание | Автоматически создайте HTTPSession для использования для служб перехвата, которые требуют HTTPSession. |
Отладка перехватчика | отладка | Предоставьте различные страницы отладки, чтобы показать статус внутреннего данных. |
Выполнять и подождать перехватчик | execandWait | Выполните действие в фоновом режиме, перенести пользователя на промежуточную страницу ожидания. |
Exception Interceptor | Исключение | Позиционировать исключение на экране |
Загрузить файл перехватчик | FileUpload | Укажите функцию загрузки файла |
I18N Interceptor | i18n | Запишите локаль, выбранную пользователем |
Перехватчик регистрации | регистратор | Имя действия вывода |
Перехватчик магазина сообщений | магазин | Хранить или получить доступ к сообщениям, ошибкам, ошибкам поля и т. Д., Которые отображаются в классах действий, которые реализуют интерфейс ValidationAware. |
Модельный перехватчик | модель | Если класс реализует модель, поместите результат, полученный GetModel в стеке значений. |
Освещенная модель модели | Освещенная модель, управляемая | Если действие реализует ScopedModeldriven, перехватчик выберет модель из соответствующей области, вызовет метод действия SetModel действия и помещает ее внутрь действия. |
Параметры перехватчик | параметры | Установите параметры в запросе на действие. |
Подготовьте перехватчик | Подготовьте приготовление | Если Acton реализует подготовку, перехватчик вызывает метод подготовки класса действия. |
Область перехватчика | объем | Простой способ сохранить состояние действия в сессию и приложение. |
Сервлетовой конфигуратор перехватчик | ServletConfig | Предоставляет методы для доступа к httpservletrequest и httpservletresponse, доступа в виде карты. |
Статические параметры перехватчик | StaticParams | Установите содержимое в <Param> в <cection> в соответствующее действие из файла struts.xml. |
Роли перехватчика | роли | Определяет, играет ли пользователь определенную роль JAAS, иначе она не будет выполнена. |
Таймер перехватчик | таймер | Время выполнения действий вывода |
Токен перехватчик | токен | Избегайте двойного щелчка через токен |
Токен сеанс перехватчик | токенсессия | Однако, как перехватчик токена, при дважды щелкнув, запрашиваемые данные хранятся в сеансе |
Валидационный перехватчик | Валидация | Проверьте представленные данные, используя контент, определенный в файле validation.xml. |
Перехватчик рабочего процесса | рабочий процесс | Метод проверки Action Call, и после того, как появится ошибка, он будет перемещен на экран ввода. |
Перехватчик фильтра параметров | N/a | Удалить ненужные параметры из списка параметров |
Профилирование перехватчика | Профилирование | Активировать профиль через параметры |