ТОР 5 статей: Методические подходы к анализу финансового состояния предприятия Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века Характеристика шлифовальных кругов и ее маркировка Служебные части речи. Предлог. Союз. Частицы КАТЕГОРИИ:
|
CookieCounter.printToBrowser(resp, req);В классе CookieCounter производится модификация файла cookie, хранимого на компьютере клиента. /* пример # 4: создание cookie и чтение количества вызовов сервлета из cookie: CookieCounter.java */ package chapt16; import java.io.IOException; import java.io.Writer; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;
public class CookieCounter { /* константа, которая будет использована для установки максимального public static final int MAX_AGE_COOKIE = 3600 * 24 * 30;
public static void printToBrowser( HttpServletResponse response, HttpServletRequest request) { try { Writer out = response.getWriter(); out.write("My Cookie counter: "); /* устанавливает счетчик количества вызовов сервлета пользователем */ out.write(String.valueOf(prepareCookieCounter( request,response))); out.flush(); out.close(); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException("Failed: " + e); } } // обновляет в сookie счетчик обращений пользователя к сервлету private static int prepareCookieCounter( HttpServletRequest request, HttpServletResponse response) { Cookie[] cookies = request.getCookies(); Cookie counterCookie; if (cookies!= null) { for (int i = 0; i < cookies.length; i++) { if ("counter".equals(cookies[i].getName())) { String counterStr = cookies[i].getValue(); int counterValue; try { counterValue = Integer.parseInt(counterStr); } catch (NumberFormatException e) { counterValue = 0; } counterValue++; counterCookie = new Cookie("counter", String.valueOf(counterValue)); counterCookie.setMaxAge(MAX_AGE_COOKIE); response.addCookie(counterCookie); return counterValue; } //end if } //end for } //end if counterCookie = new Cookie("counter", "1"); counterCookie.setMaxAge(MAX_AGE_COOKIE); response.addCookie(counterCookie); return 1; } } В результате в файле cookie будет содержаться следующая информация: Counter localhost/FirstProject/ * В браузер будет выведено следующее сообщение: My session counter: 1 Обработка событий Существует несколько интерфейсов, которые позволяют следить за событиями, связанными с сеансом, контекстом и запросом сервлета, генерируемыми во время жизненного цикла Web-приложения:
Регистрация блока прослушивания производится в дескрипторном файле приложения. Демонстрация обработки событий изменения состояния атрибутов сессии будет рассмотрена на примере №1 данной главы. Обрабатываться будут события добавления атрибута URL, а также добавления и изменения атрибута счетчика counter. Для этого необходимо создать класс, реализующий интерфейс HttpSessionAttributeListener и реализовать необходимые для выполнения поставленной задачи методы. /* пример # 5: обработка событий добавления и изменения атрибута сессии: MyAttributeListener.java */ package chapt21; import javax.servlet.http.HttpSessionAttributeListener; import javax.servlet.http.HttpSessionBindingEvent;
public class MyAttributeListener implements HttpSessionAttributeListener { private String counterAttr = "counter";
public void attributeAdded(HttpSessionBindingEvent ev) { String currentAttributeName = ev.getName(); String urlAttr = "URL";
if (currentAttributeName.equals(counterAttr)) {
Integer currentValueInt = (Integer) ev.getValue(); System. out. println("в Session добавлен счетчик=" + currentValueInt); } else if (currentAttributeName.equals(urlAttr)) {
StringBuffer currentValueStr = (StringBuffer)ev.getValue(); System. out. println("в Session добавлен URL=" + currentValueStr); } else System. out. println("добавлен новый атрибут"); } public void attributeRemoved(HttpSessionBindingEvent ev) { } public void attributeReplaced(HttpSessionBindingEvent ev) { String currentAttributeName = ev.getName(); // в случае изменений, произведенных со счетчиком, // выводит соответствующее сообщение if (currentAttributeName.equals(counterAttr)) { Integer currentValueInt = (Integer) ev.getValue(); System. out. println("В Session заменен cчетчик=" + currentValueInt); } } } Чтобы события обрабатывались, необходимо включить упоминание об обработчике событий в элемент <web-app> дескрипторного файла web.xml. <listener> <listener-class>chapt21.MyAttributeListener </listener-class> </listener> Тогда в результате запуска сервлета SessionServlet и нескольких обращений к нему в консоль будет выведено: в Session добавлен URL= http://localhost:8080/FirstProject/SessionServlet в Session добавлен счетчик=1 в Session заменен cчетчик=1 в Session заменен cчетчик=2 в Session заменен cчетчик=3 Интерфейс ServletRequestListener добавлен в Servlet API начиная /* пример # 6: обработка событий создания и уничтожения запроса к сервлету: MyRequestListener.java */ package chapt21; import javax.servlet.ServletContext; import javax.servlet.ServletRequest; import javax.servlet.ServletRequestEvent; import javax.servlet.ServletRequestListener; import javax.servlet.http.HttpServletRequest;
public class MyRequestListener implements ServletRequestListener { // счетчик числа обращений к сервлету private static int reqCount;
public void requestInitialized(ServletRequestEvent e) { //будет использован для доступа к log-файлу ServletContext context = e.getServletContext(); //будет использован для получения информации о запросе ServletRequest req = e.getServletRequest();
synchronized (context) { String name = ""; name = ((HttpServletRequest) req).getRequestURI(); // сохранение значения счетчика в log-файл context.log("Request for " + name + "; Count=" + ++reqCount); } } public void requestDestroyed(ServletRequestEvent e) { // вызывается при уничтожении запроса System. out. println("Request уничтожен"); }
} В результате запуска сервлета SessionServlet, в log-файл, расположенный в каталоге /logs контейнера сервлетов, будет выведено: Не нашли, что искали? Воспользуйтесь поиском:
|