|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Request уничтоженПри этом класс «обработчик событий» должен быть зарегистрирован в файле web.xml следующим образом: <listener> <listener-name>MyRequestListener</listener-name> <listener-class>chapt21.MyRequestListener</listener-class> </listener> Фильтры Реализация интерфейса Filter позволяет создать объект, который может трансформировать заголовок и содержимое запроса клиента или ответа сервера. Фильтры не создают запрос или ответ, а только модифицируют его. Фильтр выполняет предварительную обработку запроса, прежде чем тот попадает в сервлет, с последующей (если необходимо) обработкой ответа, исходящего из сервлета. Фильтр может взаимодействовать с разными типами ресурсов, в частности Основные действия, которые может выполнить фильтр: · перехват инициализации сервлета и определение содержания запроса, прежде чем сервлет будет инициализирован; · блокировка дальнейшего прохождения пары request-response; · изменение заголовка и данных запроса и ответа; · взаимодействие с внешними ресурсами; · построение цепочек фильтров; · фильтрация более одного сервлета. При программировании фильтров следует обратить внимание на интерфейсы Filter, FilterChain и FilterConfig из пакета javax.servlet. Сам фильтр определяется реализацией интерфейса Filter. Основным методом этого интерфейса является метод void doFilter(ServletRequest req, ServletResponse res, FilterChain chain), которому передаются объекты запроса, ответа и цепочки фильтров. Он вызывается каждый раз, когда запрос/ответ проходит через список фильтров FilterChain. В данный метод помещается реализация задач, обозначенных выше. Кроме того, необходимо реализовать метод void init(FilterConfig config), который принимает параметры инициализации и настраивает конфигурационный объект фильтра FilterConfig. Метод destroy() вызывается при завершении работы фильтра, в тело которого помещаются команды освобождения используемых ресурсов. Жизненный цикл фильтра начинается с однократного вызова метода init(), затем контейнер вызывает метод doFilter() столько раз, сколько запросов будет сделано непосредственно к данному фильтру. При отключении фильтра вызывается метод destroy(). С помощью метода doFilter() каждый фильтр получает текущий запрос и ответ, а также список фильтров FilterChain, предназначенных для обработки. Если в FilterChain не осталось необработанных фильтров, то продолжается передача запроса/ответа. Затем фильтр вызывает chain.doFilter() для передачи управления следующему фильтру. В следующем примере рассматривается обращение к объекту request JSP-страницы demofilter.jsp и изменение значения атрибута запроса testName. <!--пример # 7: обращение к атрибуту: demofilter.jsp --> <%@ page language="java" contentType="text/html; charset=ISO-8859-5" pageEncoding="ISO-8859-5"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <html><head><title>Demo Filter</title></head> <body> <c:out value="Info from filter: ${info}"/> <br> <P>Дублирование действий фильтра смотреть в консоли</P> </body></html> Если фильтр не подключать, то переменная info значения не получит. Реализация интерфейса Filter для поставленной задачи выглялит следующим образом: /* пример # 8: простая фильтрация значения атрибута: MyFilter.java */ package chapt21; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse;
public class MyFilter implements Filter { private FilterConfig filterConfig;
public void init(final FilterConfig filterConfig) { this. filterConfig = filterConfig; } public void doFilter(final ServletRequest request, final ServletResponse response, FilterChain chain) throws java.io.IOException, javax.servlet.ServletException { System. out. println("Вход в фильтр"); String value = "Simple Filter";
request.setAttribute("info", value);
chain.doFilter(request, response); System. out. println("info = " + value); System. out. println("Окончание фильтрa"); } public void destroy() { System. out. println("Уничтожение фильтрa"); } } Чтобы к фильтру происходило обращение, необходимо включить упоминание о фильтре и обрабатываемом ресурсе в элемент <web-app> дескрипторного файла web.xml в виде: <filter> <filter-name>simplefilter</filter-name> <filter-class>chapt21.MyFilter</filter-class> </filter> <filter-mapping> <filter-name>simplefilter</filter-name> <url-pattern>/demofilter.jsp</url-pattern> </filter-mapping> Фильтр может модифицировать ответ сервера клиенту. Одним из распространенных приемов использования фильтра является модификация кодировки ответа. Когда сервлет посылает ответ клиенту через поток PrintWriter, используется установленная в сервлете кодировка. В следующем примере рассматривается фильтр, изменяющий кодировку ответа на кириллицу UTF-8. // пример # 9: фильтр, устанавливающий кодировку запроса: SetCharFilter.java package chapt21; import java.io.IOException; import javax.servlet.*;
public class SetCharFilter implements Filter { private FilterConfig filterConfig = null;
public void init(FilterConfig config) throws ServletException { this. filterConfig = config;
} public void doFilter(ServletRequest request, ServletResponse response, FilterChain next) throws IOException, ServletException { // чтение кодировки из запроса String encoding = request.getCharacterEncoding(); System. out. println(encoding); // установка UTF-8, если не установлена if (!"UTF-8".equalsIgnorCase(encoding)) response.setCharacterEncoding("UTF-8"); next.doFilter(request, response); } public void destroy() { } } И его конфигурации в web.xml: <filter> <filter-name>setCharFilter</filter-name> <filter-class>chapt21. SetCharFilter</filter-class> </filter> <filter-mapping> <filter-name>setCharFilter</filter-name> <url-pattern>/DemoCharServlet</url-pattern> </filter-mapping> Таким образом, ответ сервлета DemoCharServlet будет в необходимой кодировке. /*пример # 10: без установки кодировки ответ сервлета будет нечитаем: package chapt21; import java.io.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class DemoCharServlet extends HttpServlet { public void init() throws ServletException { } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.print("Кодировка установлена успешно!"); } public void destroy() { super. destroy(); } } В результате в браузер будет выведено: Кодировка установлена успешно! Задания к главе 21 Вариант А Для всех заданий использовать авторизованный вход в приложение. Параметры авторизации, дату входа в приложение и время работы сохранять в сессии. 1. В тексте, хранящемся в файле, определить длину содержащейся в нем максимальной серии символов, отличных от букв. Все такие серии символов с найденной длиной сохранить в cookie. 2. В файле хранится текст. Для каждого из слов, которые вводятся в текстовые поля HTML-документа, вывести в файл cookie, сколько раз они встречаются в тексте. 3. В файле хранится несколько стихотворений, которые разделяются строкой, состоящей из одних звездочек. В каком из стихотворений больше всего восклицательных предложений? Результат сохранить в файле cookie. 4. Записать в файл cookie все вопросительные предложения текста, которые хранятся в текстовом файле. 5. Код программы хранится в файле. Подсчитать количество операторов этой программы и записать результаты поиска в файл cookie, перечислив при этом все найденные операторы. 6. Код программы хранится в файле. Сформировать файл cookie, записи которого дополнительно слева содержат уровень вложенности циклов. Ограничения на входные данные: а) ключевые слова используются только для обозначения операторов; б) операторы цикла записываются первыми в строке. 7. Подсчитать, сколько раз в исходном тексте программы, хранящейся на диске, встречается оператор, который вводится с терминала. Сохранить в файле cookie также номера строк, в которых этот оператор записан. Ограничения: ключевые слова используются только для обозначения операторов. 8. Сохранить в cookie информацию, введенную пользователем, и восстановить ее при следующем обращении к странице. 9. Выбрать из текстового файла все числа-полиндромы и их количество. Результат сохранить в файле cookie. 10. В файле хранится текст. Найти три предложения, содержащие наибольшее количество знаков препинания, и сохранить их в файле cookie. 11. Подсчитать количество различных слов в файле и сохранить информацию в файл cookie. 12. В файле хранится код программы. Удалить из текста все комментарии 13. В файле хранится HTML-документ. Проверить его на правильность 14. В файле хранится HTML-документ. Найти и вывести все незакрытые теги с указанием строки и позиции начала в файл cookie. При выполнении задания учесть возможность присутствия тегов, которые не требуется закрывать. Например: <BR>. 15. В файле хранится HTML-документ с незакрытыми тегами. Закрыть все незакрытые теги так, чтобы документ HTML стал правильным, и записать измененный файл в файл cookie. При выполнении задания учесть возможность присутствия тегов, которые не требуется закрывать. Например: <BR>. 16. В файле хранятся слова русского языка и их эквивалент на английском языке. Осуществить перевод введенного пользователем текста и записать его в файл cookie. 17. Выбрать из файла все адреса электронной почты и сохранить их в файле cookie. 18. Выбрать из файла имена зон (*.by, *.ru и т.д.), вводимые пользователем, и сохранить их в файле cookie. 19. Выбрать из файла все заголовки разделов и подразделов (оглавление) 20. При работе приложения сохранять в сессии имена всех файлов, к которым обращался пользователь. Вариант B Для заданий варианта В главы 4 каждому пользователю должен быть поставлен в соответствие объект сессии. В файл cookie должна быть занесена информация Тестовые задания к главе 21 Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.012 сек.) |