1. Interceptor в Struts2 (ядро функции Frame)
1. Фильтр против перехватчика
Функция фильтра против перехватчика - это одно. Фильтры - это технология в спецификации сервлета, которая может фильтровать запросы и ответы.
Перехватыватели-это технология в рамках Struts2, внедряя идею программирования AOP (разделение), которая подключена и может быть перехвачена до или после доступа к определенному методу действия.
Стек перехватчиков: присоединяйтесь к перехватчикам в цепочку в определенном порядке. При доступе к методу перехватчика перехватчики в цепочке перехватчиков Struts2 будут вызваны последовательно в порядке, в котором они определены ранее.
Принцип выполнения Struts2 - базовый анализ
2. Пользовательский перехватчик
Struts2 определяет интерфейс интерфейса интерфейса Interceptor.
В интерфейсе Interceptor есть три абстрактных метода
• init: этот метод будет вызван сразу после создания перехватчика, и он будет вызван только один раз в течение жизни перехватчика. Соответствующие ресурсы могут быть инициализированы в этом методе.
• Межстепенный: этот метод будет вызывать один раз каждый раз, когда перехвачен запрос на действие.
• Уничтожение: этот метод будет вызван до того, как перехватчик будет уничтожен, и он будет вызван только один раз в течение жизненного цикла перехватчика.
Спорты, в свою очередь, будут вызывать метод перехвата каждого перехвата, зарегистрированный программистом для действия. Каждый раз, когда называется метод перехвата, стойки будут передавать экземпляр интерфейса ActionInvocation.
ActionInvocation: представляет статус выполнения данного действия. Перехватчик может получить объект действия и объект результата, связанный с действием из объекта этого класса. После выполнения собственной задачи перехватчика, перехватчик будет называть метод ActionInvocate объекта ActionInvocation к следующему шагу в процессе обработки действий.
Вы также можете вызвать метод AddPreresultListener объекта ActionInvocation, чтобы «повесить» один или несколько слушателей PreResultListener. Этот объект слушателя может сделать что -то, прежде чем начать выполнять результат действия после выполнения действия.
Пользовательские шаги перехвата:
а Напишите класс для реализации интерфейса com.opensymphony.xwork2.interceptor.interceptor или наследовать
com.opensymphony.xwork2.interceptor.abstractinterceptor Class. (Режим адаптера), как правило, выбирайте наследовать Abstractinterceptor (Interceptor будет находиться в памяти). Потому что класс Abstractinterceptor реализует интерфейс Interceptor. Он обеспечивает пустую реализацию для init и уничтожения
Напишите два перехватчика receptordemo1 и receptordemo2
пакет com.itheima.interceptor; import com.opensymphony.xwork2.actionInvocation; импорт com.opensymphony.xwork2.interceptor.abstractinterceptor; открытый класс Interceptordemo1 расширяет AbstractInterceptor {// Этот метод называется каждый раз, когда действие обращается к общедоступному Interceptor (ActionInVocation Interceptor). String rtvalue = vocation.invoke (); // Выпуск, почему строка возвращается сюда? Поскольку конечный результат возвращает результат действия, а результатом действия является строка типа System.out.println ("Intercept demo1"); вернуть rtvalue; }} пакет com.itheima.interceptor; import com.opensymphony.xwork2.actionInvocation; импорт com.opensymphony.xwork2 vocation) Throws Exception {// vocation.addpreresultister (new preresultistener () {// // public void beforeresult (actionInvocation vocation, string resultCode) {// System.out.println («До отображения результата«); //} //}); System.out.println («До Demo2»); String rtvalue = vocation.invoke (); // выпуск system.out.println ("перехваченный demo2"); вернуть rtvalue; }}беременный Он должен быть определен в struts.xml, определить перехватчик и определить его первым перед использованием.
<package name = "p1" extends = "struts-default"> <!-определение Interceptor: только действителен для текущего пакета-> <receptor name = "urterceProtdemo1"> </receptor> <Interceptor name = "urterceprotdemo2"> </receptor> <//receptor> </receptor>
в Его можно использовать в конфигурации действия
<name = "action1" method = "execute"> <!- Используйте определенный перехватчик. Если перехватчик не указан, все перехватыватели в стеке по умолчанию используются по умолчанию; Как только любой перехватчик указан, по умолчанию недействительна-> <receptor-ref name = "urterceprotdemo1"> </receptor-ref> <receptor-ref name = "urterceprotdemo2"> </receptor-ref> <sesult> /success.jsp </result> </action>
Реализация демо1акции класса действий
пакет com.itheima.action; import com.opensymphony.xwork2.actionsupport; открытый класс demo1action extends actionsupport {@override public String execute () Throws exception {System.out.println ("execute выполнено"); вернуть успех; }}Результаты бега
Поскольку такие функции, как загрузка файлов, проверка данных, инкапсулирующие параметры запроса на действие в Struts2, реализованы перехватчиком в побочном по умолчании системы, перехватчик, который мы определяем, необходимо обратиться к по умолчанию по умолчанию системы, чтобы приложение мог использовать множество функций, предоставленных Framewring Sruts2.
Если перехватчик не указан, все перехватыватели в стеке по умолчанию используются по умолчанию; Как только какой -либо перехватчик указан, по умолчанию недействительна. В дополнение к использованию пользовательского перехватчика, вам также необходимо использовать DefaultStack. Вы можете сделать это
Метод 1: (используется сами), просто настройте пользовательский и по умолчанию в действии.
Метод 2: (Когда все используют его), если вы хотите, чтобы все действия в пакете использовали пользовательский перехватчик, вам необходимо использовать перехватчик Stack Stack-Stack, определить перехватчик-Stack, а затем в действии вы можете определить перехватчик как перехватчик по умолчанию через <defall-interceptor-ref name = "myDefaultstack"/>, и вы можете получить имя.
<Interceptors> <receptor name = "urterceProtdemo1"> </receptor> <intemptor name = "urterceProtdemo2"> </receptor> <receptor-stack name = "myDefaultstack"> <receptor-ref name = "defaultstack"> </receptor-ref> <receptor-ref name = "urterceProtDemo1"> </receptor-ref> <receptor-ref name = "urterceProtDemo2"> </receptor-ref> </receptor-stack> </receptortors> <action name = "action3" method = "login"> <receptor- name = "myDefaultStack"> <//reterceptor-ref> <//refceptor-ref> <//refceptor-ref> <//refceptor-ref ref name = "myDefaultStack" <sesult> /success.jsp </result> </action>
3. Собственный перехватчик Struts2
Случай 1: Проверьте, вошел ли пользователь
1. Напишите страницу Login.jsp
<body> <form action = "$ {pagecontext.request.contextpath} /login.action" method = "post"> <input type = "text" name = "username"/> <br/> <input type = "text" name = "password"/> <br/> <inpute = "Vade" value = vogin "/> </form> </> <br/> <input =" value = "login"/> </form> </> <br/> <input = "Vade"2. Напишите класс LoginCheckInterceptor для проверки входа в систему
пакет com.itheima.interceptor; import javax.servlet.http.httpsession; import org.apache.struts2.servletactionContext; импорт com.opensymphony.xwork2 vocation) выбрасывает исключение {httpsession session = servletactionContext.getRequest (). getSession (); // Получить объект сеанса через объект ServletActionContext Object = session.getAttribute ("user"); if (user == null) {// no login return "login"; // return в логическое представление} return vlocation.invoke (); // Выпуск}}3. Написать файл конфигурации struts.xml
<package name = "p2" extends = "struts-default"> <Interceptors> <interceptor name = "logincheckinterceptor"> </interceptor> <receptor-Stack name = "myDefaultStack"> <Interceptor-ref name = "defaultStack"> </receptor-ref> refceptor-ref name = "loginCheckceckertortortortortortortortortortortortortortorTor </receptor-ref> </receptor-stack> </receptor-stack> </receptors> <name = "login" method = "login"> <result> /login.jsp </result> </action> </package>
4. Напишите CustomerAction класса действий CustomerAction
пакет com.itheima.action; import org.apache.struts2.servletactionContext; импорт com.opensymphony.xwork2 ServletActionContext.getRequest (). GetSession (). SetAtTribute («Пользователь», «PPP»); вернуть успех; }}
Случай 2: мониторинг эффективности выполнения методов действия
Напишите TimerInterceptor
пакет com.itheima.interceptor; import com.opensymphony.xwork2.actioninvocation; импорт com.opensymphony.xwork2.interceptor.abstractinterceptor; открытый класс TimerInterceptor расширяет AbstractInterceptor {public String Intercept (ActionInvocation invocation) thripting Exception {long Time = System.nanotime (); String rtvalue = vocation.invoke (); System.out.println (rtvalue+"Время выполнения:"+(System.nanotime ()-Time)+"Nanosecond"); вернуть rtvalue; }}Напишите файлы конфигурации
<package name = "p2" extends = "struts-default"> <Interceptors> <intecpertor name = "logincheckinterceptor"> </receptor> <interceptor name = "timerInterceptor"> </receptor> <receptor-Stack name = "myDefaultStack"> <receptor-ref-ref-ref-ref-reff name = "logincheckinterceptor"> </receptor-ref> <receptor-ref name = "logincheckinterceptor"> </receptor-ref> <receptor-ref name = "timerInterceptor"> </receptor-ref> </receptor-Stack> <//name name = name = "/result gogin.
Как видно из вышеперечисленного, несколько фильтров могут быть настроены в одном действии.
4. Пользовательский перехватчик: может указать метод перехвата или метод не перехватывания
Он может указать метод перехвата или метод без перехвата. При написании фильтра вы можете реализовать класс MethodFilterInterceptor, который имеет два поля. При инъекции параметров вы можете указать те, кто не перехватывает. Можно использовать только один из двух параметров. Когда меньше перехватов, вы можете использовать includemethods. Когда есть больше перехватов, вы можете использовать ExcudeMethods.
excludemethods = collections.emptyset (); // исключить их
includemethods = collections.emptyset (); // включить эти
Случай: продолжить пример проверки входа в систему.
1. Напишите фильтр logincheckinterceptor
пакет com.itheima.interceptor; import javax.servlet.http.httpsession; импорт org.apache.struts2.servletactioncontext; импорт com.opensymphony.xwork2 com.opensymphony.xwork2.interceptor.methodfilterinterceptor; открытый класс logincheckinterceptor Extends MethodFilterInterceptor {Защищенный строка doIntercept (actionInvocation vocation) Throws Exception {httpsession session = servletactionContext.getRequest (). getSessess (); Object user = session.getAttribute ("user"); if (user == null) {// no login return "login"; // return в логическое представление} return vlocation.invoke (); // Выпуск}}2. Написать файлы конфигурации
3. Напишите CustomerAction класса действий.
пакет com.itheima.action; import org.apache.struts2.servletactionContext; импорт com.opensymphony.xwork2 вернуть успех;
4. Напишите страницу
addcustomer.jsp
<body> Добавить клиента </body>
editcustomer.jsp
<body> изменить клиента </body>
Login.jsp
<body> <form action = "$ {pagecontext.request.contextpath} /login.action" method = "post"> <input type = "text" name = "username"/> <br/> <input type = "text" name = "password"/> <br/> <inpute = "Vade" value = vogin "/> </form> </> <br/> <input =" value = "login"/> </form> </> <br/> <input = "Vade"Успех.jsp
<body> oyeah </body>
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.