Web Listener

35550 단어 listener
회전:
http://gaojiewyh.iteye.com/blog/1759566
감청 기의 주요 역할 은 감청 이다.목표 가 변화 할 때 일정한 방법 을 촉발 하 는데 이것 이 바로 사건 촉발 메커니즘 이다.이런 메커니즘 에는 세 가지 요소 가 있어 야 한다.즉,사건,사건 원,사건 을 처리 하 는 방법 이다.이 세 가지 요소 사 이 는 서로 제약 하 는 것 이다.일단 사건 처리 방법 이 촉발 되면 반드시 사건 이 발생 하고 촉발 되 는 사건 을 얻 을 수 있 으 며 사건 을 통 해 사건 의 근원 을 얻 을 수 있 고 누가 사건 을 촉발 시 켰 는 지 에 따라 이 세 가지 요 소 를 연결 할 수 있다.하나의 사건 소스 는 여러 개의 트리거 사건 이 있 을 수 있 고 하나의 트리거 사건 의 발생 은 여러 가지 방법 으로 호출 될 것 이다.이것 이 바로 한 쌍 의 다 중 관계 이다.한 쌍 의 다 중 관 계 를 통 해 우 리 는 여러 끝 에서 한 끝 을 얻 기 쉬 우 며 반대로 한 끝 에서 여러 끝 을 얻 을 수 없다 는 것 은 대가족 이 잘 알 고 있다.그래서 사건 처리 방법 은 사건 대상 을 얻 을 수 있 고 사건 대상 은 사건 원 을 얻 을 수 있다 는 것 을 잘 이해 할 수 있다.
1.웹 모니터 개발 절차
    우선 listener 인 터 페 이 스 를 실현 하 는 클래스 를 만 듭 니 다.
자바 코드
   
public class ContextTestListener implements ServletContextListener {  
      
        public void contextInitialized(ServletContextEvent sce) {  
                    //       
            }  
      
        public void contextDestroyed(ServletContextEvent sce) {  
               //        
           }  
    }
 
    그 다음으로 웹 xml 에 모니터 를 설정 합 니 다.
Xml 코드
   
<listener>  
      <listener-class>com.jason.listener.ContextTestListener</listener-class>  
    </listener> 

2.웹 모니터 의 분 류 는 그림 에서 보 듯 이 현재 다음 과 같은 몇 가지 모니터 ServletContext,Session,Request 로 나 뉜 다.
3.각종 모니터 의 상세 한 소개 및 용법 예시
(1)ServletContext 와 관련 된 감청 기 인 터 페 이 스 는 ServletContextListener,ServletContextAttributeListener 이다.이 감청 기 는 전체 웹 프로그램의 생명 주 기 를 대상 으로 하고 그 범위 가 가장 크다.일반적으로 응용 프로그램 이 초기 화 될 때 데이터베이스 연결 대상 을 읽 고 응용 프로그램의 설정 을 초기 화 하 는 데 사 용 됩 니 다.그 인터페이스 정 의 는 다음 과 같다.
자바 코드
  
 public interface ServletContextListener {  
        public void contextInitialized(ServletContextEvent sce);  
        public void contextDestroyed(ServletContextEvent sce);  
    }

전형 적 인 응용 프로그램:웹 페이지 가 요청 한 방 문 량 을 통계 해 야 합 니 다.이 웹 프로그램 이 중단 되 었 을 때 방 문 량 수 치 를 설정 파일 에 기록 하고 프로그램 을 바 꾸 어 다시 시작 합 니 다.수 치 는 지난번 방 문 량 부터 시작 합 니 다.
      <1>ServletContextListener 인 터 페 이 스 를 실현 하고 초기 화 방법 에서 설정 파일 의 방 문 량 정 보 를 읽 고 소각 방법 에 방 문 량 정 보 를 저장 합 니 다.프로그램 이 시 작 될 때 contextInitialized 방법 을 호출 하고 프로그램 이 멈 출 때 contextDestroyed 방법 을 호출 하기 때 문 입 니 다.이 예 는 properties 의 동작 을 사 용 했 습 니 다.properties 에 익숙 하지 않 으 면 google 에서 사용 하 십시오.특히 파일 읽 기와 저장 파일 의 쓰기 에 주의 하 십시오.코드 는 다음 과 같 습 니 다.
자바 코드
   
public class ContextTestListener implements ServletContextListener {  
      
        private static final String COUNT_NAME = "count";  
          
        private static final String PROPERTIES_NAME = "WEB-INF/count.properties";  
      
        /* 
         * (non-Javadoc) 
         *  
         * @see 
         * javax.servlet.ServletContextListener#contextInitialized(javax.servlet 
         * .ServletContextEvent) 
         */  
        public void contextInitialized(ServletContextEvent sce) {  
      
            ServletContext context = sce.getServletContext();  
            InputStream inputstream = context.getResourceAsStream(PROPERTIES_NAME);  
              
            Properties prop = new Properties();  
            try {  
                prop.load(inputstream);  
            } catch (IOException e) {  
                throw new RuntimeException(e);  
            }  
              
            int count = Integer.parseInt(prop.getProperty(COUNT_NAME));  
            context.setAttribute(COUNT_NAME, count);  
        }  
      
        /* 
         * (non-Javadoc) 
         *  
         * @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet. 
         * ServletContextEvent) 
         */  
        public void contextDestroyed(ServletContextEvent sce) {  
      
            ServletContext context = sce.getServletContext();  
            Object countAttr = context.getAttribute(COUNT_NAME);  
            if(countAttr != null){  
                int count = (Integer) context.getAttribute(COUNT_NAME);  
                  
                InputStream inputstream = context.getResourceAsStream(PROPERTIES_NAME);  
                Properties prop = new Properties();  
                try {  
                    prop.load(inputstream);  
                    prop.setProperty(COUNT_NAME, String.valueOf(count));  
                } catch (IOException e) {  
                    throw new RuntimeException(e);  
                }  
          
                String filepath = context.getRealPath("/");  
                FileOutputStream fos = null;  
                try {  
                    fos = new FileOutputStream(filepath + PROPERTIES_NAME);  
                } catch (FileNotFoundException e) {  
                    throw new RuntimeException(e);  
                }  
          
                try {  
                    prop.store(fos, "add the count");  
                } catch (IOException e) {  
                    throw new RuntimeException(e);  
                } finally {  
                    if (fos != null) {  
                        try {  
                            fos.close();  
                        } catch (IOException e) {  
                            System.err.println("Cant close stream :" + e.getMessage());  
                        }  
                    }  
                }  
            }  
        }  
    }

<2>TestCountservlet 를 정의 합 니 다.웹 페이지 에 접근 을 요청 하 는 요청 URL 로 서 현대 코드 는 다음 과 같 습 니 다.방법 량 을 기록 하 는 동시에 방 문 량 페이지 로 이동 합 니 다.코드 는 다음 과 같 습 니 다.
자바 코드
   
package com.jason.servlet;  
      
    import java.io.IOException;  
      
    import javax.servlet.ServletContext;  
    import javax.servlet.ServletException;  
    import javax.servlet.http.HttpServlet;  
    import javax.servlet.http.HttpServletRequest;  
    import javax.servlet.http.HttpServletResponse;  
      
    /** 
     * Servlet implementation class TestAccountServlet 
     */  
    public class TestAccountServlet extends HttpServlet {  
        private static final long serialVersionUID = 1L;  
       
        /** 
         * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
         */  
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
            // TODO Auto-generated method stub  
            doPost(request,response);  
        }  
      
        /** 
         * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
         */  
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
            // TODO Auto-generated method stub  
            ServletContext context = request.getSession().getServletContext();  
            Integer count = (Integer) context.getAttribute("count");  
            if(count == null){  
                count = 1;  
            }else{  
                count ++;  
            }  
            context.setAttribute("count",count);  
            // do other things  
            response.sendRedirect(request.getContextPath() + "/count.jsp");  
        }  
    }

<3>webxml 의 설정,webxml 에 모니터,servlet 및 welcoen 페이지 가 설정 되 어 있 습 니 다.내용 은 다음 과 같 습 니 다.
자바 코드  모음 집 코드
   
<?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_2_5.xsd" id="WebApp_ID" version="2.5">  
      <display-name>WebListener</display-name>  
      <listener>  
        <listener-class>com.jason.listener.ContextTestListener</listener-class>  
      </listener>  
      <welcome-file-list>  
        <welcome-file>index.jsp</welcome-file>  
      </welcome-file-list>  
      <servlet>  
        <description></description>  
        <display-name>TestAccountServlet</display-name>  
        <servlet-name>TestAccountServlet</servlet-name>  
        <servlet-class>com.jason.servlet.TestAccountServlet</servlet-class>  
      </servlet>  
      <servlet-mapping>  
        <servlet-name>TestAccountServlet</servlet-name>  
        <url-pattern>/TestAccountServlet</url-pattern>  
      </servlet-mapping>  
    </web-app>

<4>WEB-INF 디 렉 터 리 에 count.properties 를 만 듭 니 다.내용 은 다음 과 같 습 니 다.
자바 코드  모음 집 코드
    count=0 
<5>index 와 count 페이지 를 만 듭 니 다.index 페이지 는 다음 과 같 습 니 다.
자바 코드
   
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>  
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>  
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
    <html>  
    <head>  
    <meta http-equiv="Content-Type" content="text/html; charset= UTF-8">  
    <title>index page</title>  
    </head>  
    <body>  
        <a href="${pageContext.request.contextPath}/TestAccountServlet">visit it to test </a>  
    </body>  
    </html>
 
index 페이지 에서${pageContext.request.contextPath}를 주의 하 십시오.jsp 페이지 에서 servlet 의 URL 을 호출 할 때 basepath 를 설정 하지 않 으 면 앞 에 contextpath 의 경 로 를 추가 해 야 합 니 다.그렇지 않 으 면 servlet 의 주 소 는 잘못 되 었 습 니 다.아니면Html 코드
   
<%@ 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/TR/html4/loose.dtd">  
    <html>  
    <head>  
    <meta http-equiv="Content-Type" content="text/html; charset= UTF-8">  
    <title>count here </title>  
    </head>  
    <body>  
        visit count:${applicationScope.count}  
        <%  
        System.out.println(application.getAttribute("count"));  
        %>   
    </body>  
    </html>

${applicationScope.count}을 이용 하여 수 치 를 가 져 옵 니 다.이 프로그램 은 실 행 됩 니 다.클릭 할 때마다 count 페이지 에 접근 합 니 다.방 문 량 은 1.
(2)Session 과 관련 된 감청 기 는 4 개의 Http Session Listener,Http Session Attribute Listener,Http Session Bind Listener 와 Http Session Activation Listener 가 있 습 니 다.
<1>HttpSession Listener 는 라 이 프 사이클 모니터 입 니 다.Session 대상 을 만 들 거나 끝 낼 때 해당 동작 을 하면 HttpSession Listener 를 실현 할 수 있 습 니 다.이 인터페이스의 정 의 는 다음 과 같 습 니 다.
자바 코드
   
public interface HttpSessionListener {  
        public void sessionCreated(HttpSessionEvent se) ;  
        public void sessionDestroyed(HttpSessionEvent se) ;  
    }

        이 모니터 의 사용법,예 를 들 어 사용자 가 다시 로그 인 하 는 것 을 방지 할 때 데이터베이스 에서 필드 상 태 를 정의 하여 로그 인 여 부 를 표시 합 니 다.로그아웃 할 때 저 희 는 그 상 태 를 수정 하지만 많은 경우 에 저 희 는 브 라 우 저 를 직접 닫 아서 데이터 베 이 스 를 업데이트 할 수 없습니다.또한 사용자 로그 인 session 도 생존 기한 이 있 습 니 다.이 때 저 희 는 session 이 삭 제 될 때 데이터베이스 상 태 를 바 꾸 기 를 원 합 니 다.HttpSession Listener 모니터 의 session Destroyed(se)방법 에서 session 에서 이 사용 자 를 가 져 오고 데이터 베 이 스 를 조작 하여 이 사용자 의 로그 인 상 태 를 로그 인 하지 않 은 것 으로 설정 할 수 있 습 니 다.
자바 코드
   
/** 
     * Application Lifecycle Listener implementation class OnlinePepoleListener 
     * 
     */  
    public class OnlinePepoleListener implements HttpSessionListener {  
      
        /** 
         * @see HttpSessionListener#sessionCreated(HttpSessionEvent) 
         */  
        public void sessionCreated(HttpSessionEvent se) {  
            // TODO Auto-generated method stub  
        }  
      
        /** 
         * @see HttpSessionListener#sessionDestroyed(HttpSessionEvent) 
         */  
        public void sessionDestroyed(HttpSessionEvent se) {  
            // TODO Auto-generated method stub  
            HttpSession session = se.getSession();  
            String user = (String)session.getAttribute("login");  
            //                 
        }  
    }

전형 적 인 응용:현재 사용자 의 온라인 수 를 통계 합 니 다.
(1)index 페이지
자바 코드
   
<%@ 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/TR/html4/loose.dtd">  
    <html>  
    <head>  
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">  
    <title>Insert title here</title>  
    </head>  
        <body>  
            <form action="login.jsp" method="post">  
               userName:<input type="text" name="username" />  
                <br />  
                <input type="submit" value="login" />  
            </form>  
        </body>  
    </html>

2.login 페이지
Html 코드
   
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>  
    <%@ page import="java.util.*"%>  
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
    <html>  
    <head>  
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">  
    <title>Insert title here</title>  
    </head>  
        <body>  
        <%  
            request.setCharacterEncoding("UTF-8");  
            //           
            String username = request.getParameter("username");  
            //        session  
            session.setAttribute("username", username);  
            //             
            List onlineUserList = (List) application.getAttribute("onlineUserList");  
            //       ,       
            if (onlineUserList == null) {  
                onlineUserList = new ArrayList();  
                application.setAttribute("onlineUserList", onlineUserList);  
            }  
            onlineUserList.add(username);  
            //     
            response.sendRedirect("result.jsp");  
        %>  
        </body>  
    </html>

3.result 페이지
Html 코드
   
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>  
    <%@ page isELIgnored="false"%>  
    <%@page import="java.util.List"%>  
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
    <html>  
    <head>  
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">  
    <title>Insert title here</title>  
    </head>  
    <body>  
        <h3>  :${username} [<a href="logout.jsp">  </a>]</h3>  
              :  
        <table>  
        <%  
           List onlineUserList = (List) application.getAttribute("onlineUserList");  
           for (int i = 0; i < onlineUserList.size(); i++) {  
           String onlineUsername = (String) onlineUserList.get(i);  
        %>  
           <tr>  
               <td><%=onlineUsername%></td>  
           </tr>  
        <%  
        }  
        %>  
        </table>  
    </body>  
    </html>
 
4,logout 페이지
Html 코드
   
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>  
    <%@ page import="java.util.*"%>  
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
    <html>  
    <head>  
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">  
    <title>Insert title here</title>  
    </head>  
    <body>  
    <%  
        //           
        String username = (String) session.getAttribute("username");  
        //   session  
        session.invalidate();  
        //              
        List onlineUserList = (List) application.getAttribute("onlineUserList");  
        onlineUserList.remove(username);  
        //     
        response.sendRedirect("index.jsp");  
    %>  
    </body>  
    </html>
 
5.모니터 코드
자바 코드
   
package com.jason.listener;  
      
    import java.util.List;  
      
    import javax.servlet.ServletContext;  
    import javax.servlet.http.HttpSession;  
    import javax.servlet.http.HttpSessionEvent;  
    import javax.servlet.http.HttpSessionListener;  
      
    /** 
     * Application Lifecycle Listener implementation class OnlineUserListener 
     * 
     */  
    public class OnlineUserListener implements HttpSessionListener {  
          
        public void sessionCreated(HttpSessionEvent event) {  
      
            System.out.println("  session:"+event.getSession().getId());  
        }  
      
        public void sessionDestroyed(HttpSessionEvent event) {  
      
            HttpSession session = event.getSession();  
            ServletContext application = session.getServletContext();  
            //           
            String username = (String) session.getAttribute("username");  
            //              
            List onlineUserList = (List) application.getAttribute("onlineUserList");  
            onlineUserList.remove(username);  
            System.out.println(username+"    !");  
        }  
      
    }

6 웹 설정
Html 코드
   
<?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_2_5.xsd" id="WebApp_ID" version="2.5">  
      <display-name>OnlinePepoleListener</display-name>  
      <welcome-file-list>  
        <welcome-file>index.jsp</welcome-file>  
      </welcome-file-list>  
      <listener>  
        <listener-class>com.jason.listener.OnlineUserListener</listener-class>  
      </listener>  
    </web-app>
 
모니터 가 session Destoryed 방법 을 호출 한 것 을 발견 하면 사용 자 를 온라인 인원수 에서 delete 합 니 다.다음 두 가지 상황 에서 session Destoryed 사건 이 발생 합 니 다.
a.session.invalidate()방법 을 실행 할 때
logout.jsp 에서 session.invalidate()방법 을 호출 하 였 습 니 다.
b.session 세 션 시간 초과
session 의 기본 시간 초과 이 벤트 는 30 분 입 니 다.30 분 후에 자동 으로 session 을 소각 합 니 다.
2、HttpSessionBindingListener
HttpSession BindingListener 는 감청 기 라 고 하지만 사용 방법 은 HttpSession Listener 와 완전히 다르다.우 리 는 실제로 그것 이 어떻게 사용 되 는 지 보 자.새 클래스 Online UserBinding Listener 는 HttpSession Binding Listener 인 터 페 이 스 를 실현 하고 구조 방법 은 username 파라미터 에 전 달 됩 니 다.HttpSession Binding Listener 에는 두 가지 방법 이 있 습 니 다.valueBound(HttpSession Binding Event event)와 valueUnbound(HttpSession Binding Event event)는 전 자 는 데이터 바 인 딩 이 고 후 자 는 바 인 딩 을 취소 하기 위해 이른바 session 에 대한 데이터 바 인 딩 을 합 니 다.session.setAttribute()를 호출 하여 HttpSession Binding Listener 를 session 에 저장 하 는 것 입 니 다.
login.jsp 에서 이 단 계 를 수행 합 니 다.
자바 코드
   
<%@page import="com.test.OnlineUserBindingListener"%>  
    <%@ page contentType="text/html;charset=utf-8"%>  
    <%@ page import="java.util.*"%>  
    <%  
        request.setCharacterEncoding("UTF-8");  
        //           
        String username = request.getParameter("username");  
           //             
        session.setAttribute("onlineUserBindingListener", new OnlineUserBindingListener(username));  
        //     
        response.sendRedirect("result.jsp");  
    %>
 
이것 이 바로 HttpSession Binding Listener 와 HttpSession Listener 간 의 가장 큰 차이 점 입 니 다.HttpSession Listener 는 웹.xml 에 만 설정 하면 전체 응용 프로그램의 모든 session 을 감청 할 수 있 습 니 다.HttpSession BindingListener 는 실례 화 된 후에 어떤 session 에 넣 어야 감청 할 수 있 습 니 다.감청 범위 에서 비교 하면 HttpSession Listener 는 한 번 설정 하면 모든 session 을 감청 할 수 있 습 니 다.HttpSession Binding Listener 는 보통 1 대 1 입 니 다.바로 이러한 차이 점 은 HttpSession Binding Listener 의 장점 을 이 루 었 습 니 다.우 리 는 모든 listener 가 하나의 username 에 대응 하도록 할 수 있 습 니 다.그러면 매번 session 에서 username 을 읽 지 않 아 도 되 고 모든 온라인 목록 을 조작 하 는 코드 를 listener 에 옮 겨 서 쉽게 유지 할 수 있 습 니 다.
자바 코드
   
package com.test;  
      
    import java.util.ArrayList;  
    import java.util.List;  
    import javax.servlet.ServletContext;  
    import javax.servlet.http.HttpSession;  
    import javax.servlet.http.HttpSessionBindingEvent;  
    import javax.servlet.http.HttpSessionBindingListener;  
      
    public class OnlineUserBindingListener implements HttpSessionBindingListener {  
        String username;  
         
        public OnlineUserBindingListener(String username){  
            this.username=username;  
        }  
      
        public void valueBound(HttpSessionBindingEvent event) {  
            HttpSession session = event.getSession();  
            ServletContext application = session.getServletContext();  
            //             
            List onlineUserList = (List) application.getAttribute("onlineUserList");  
            //       ,       
            if (onlineUserList == null) {  
                onlineUserList = new ArrayList();  
                application.setAttribute("onlineUserList", onlineUserList);  
            }  
            onlineUserList.add(this.username);  
        }  
      
        public void valueUnbound(HttpSessionBindingEvent event) {  
            HttpSession session = event.getSession();  
            ServletContext application = session.getServletContext();  
      
            //              
            List onlineUserList = (List) application.getAttribute("onlineUserList");  
            onlineUserList.remove(this.username);  
            System.out.println(this.username + "  。");  
        }  
    }

여기 서 listener 의 username 을 직접 사용 하여 온라인 목록 을 조작 할 수 있 습 니 다.session 에 username 이 존재 하 는 지 걱정 할 필요 가 없습니다.
valueUnbound 의 트리거 조건 은 다음 과 같은 세 가지 상황 입 니 다.
a.session.invalidate()를 실행 할 때.
b.session 시간 초과,자동 소각 시.
c.session.setAttribute("onlineUserListener","기타 대상")을 실행 합 니 다.또는 session.removeAttribute("onlineUserListener");listener 를 session 에서 삭제 할 때.
따라서 listener 를 session 에서 삭제 하지 않 으 면 session 의 폐 기 를 감청 할 수 있다.
전형 적 인 사례:사용 자 를 강제로 차 버 리 는 예
1.모니터 코드 는 다음 과 같다.
자바 코드
   
package com.jason.listener;  
      
    import java.util.HashMap;  
    import java.util.Map;  
      
    import javax.servlet.ServletContext;  
    import javax.servlet.http.HttpSession;  
    import javax.servlet.http.HttpSessionAttributeListener;  
    import javax.servlet.http.HttpSessionBindingEvent;  
      
    import com.jason.domain.User;  
      
    /** 
     * Application Lifecycle Listener implementation class SessionAttributeListener 
     * 
     */  
    public class SessionAttributeListener implements HttpSessionAttributeListener {  
      
        /** 
         * @see HttpSessionAttributeListener#attributeRemoved(HttpSessionBindingEvent) 
         */  
        public void attributeRemoved(HttpSessionBindingEvent arg0) {  
            // TODO Auto-generated method stub  
        }  
      
        /** 
         * @see HttpSessionAttributeListener#attributeAdded(HttpSessionBindingEvent) 
         */  
        public void attributeAdded(HttpSessionBindingEvent se) {  
            // TODO Auto-generated method stub  
            System.out.println("start");  
            Object obj = se.getValue();  
            if(obj instanceof User){  
                HttpSession session = se.getSession();  
                ServletContext application = session.getServletContext();  
                Map map = (Map) application.getAttribute("userMap");  
                if(map == null){  
                   map = new HashMap();  
                   application.setAttribute("userMap", map);  
                }  
                User user = (User) obj;  
                map.put(user.getUserName(), session);  
            }  
        }  
      
        /** 
         * @see HttpSessionAttributeListener#attributeReplaced(HttpSessionBindingEvent) 
         */  
        public void attributeReplaced(HttpSessionBindingEvent arg0) {  
            // TODO Auto-generated method stub  
        }  
          
    }

2.loginservlet
자바 코드
   
package com.jason.servlet;  
      
    import java.io.IOException;  
    import java.util.ArrayList;  
    import java.util.HashMap;  
    import java.util.Map;  
      
    import javax.servlet.ServletContext;  
    import javax.servlet.ServletException;  
    import javax.servlet.http.HttpServlet;  
    import javax.servlet.http.HttpServletRequest;  
    import javax.servlet.http.HttpServletResponse;  
    import javax.servlet.http.HttpSession;  
      
    import com.jason.domain.User;  
      
    /** 
     * Servlet implementation class LoginServlet 
     */  
    public class LoginServlet extends HttpServlet {  
      
        /** 
         * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
         */  
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
            // TODO Auto-generated method stub  
            doPost(request,response);  
        }  
      
        /** 
         * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
         */  
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
            // TODO Auto-generated method stub  
            String username = request.getParameter("username");  
            String password = request.getParameter("password");  
            User user = new User();  
            user.setUserName(username);  
            user.setPassword(password);  
            HttpSession session= request.getSession();  
            session.setAttribute("user", user);  
            response.sendRedirect(request.getContextPath()+"/user.jsp");  
        }  
      
    }

3、kickoutServelt
자바 코드
   
package com.jason.servlet;  
      
    import java.io.IOException;  
    import java.util.Map;  
      
    import javax.servlet.ServletException;  
    import javax.servlet.http.HttpServlet;  
    import javax.servlet.http.HttpServletRequest;  
    import javax.servlet.http.HttpServletResponse;  
    import javax.servlet.http.HttpSession;  
      
    /** 
     * Servlet implementation class KickUserServlet 
     */  
    public class KickUserServlet extends HttpServlet {  
        private static final long serialVersionUID = 1L;  
      
        /** 
         * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
         */  
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
            // TODO Auto-generated method stub  
            doPost(request,response);  
        }  
      
        /** 
         * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
         */  
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
            // TODO Auto-generated method stub  
            String username = request.getParameter("username");  
            Map map = (Map) request.getServletContext().getAttribute("userMap");  
            HttpSession session = (HttpSession) map.get(username);  
               if(session != null){  
                   session.invalidate();  
                   map.remove(username);  
               }  
               request.getRequestDispatcher("/listUser.jsp").forward(request, response);  
        }  
    }
 
6.index 페이지
Html 코드
   
<%@ 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/TR/html4/loose.dtd">  
    <html>  
    <head>  
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">  
    <title>Insert title here</title>  
    </head>  
    <body>  
    <form method="post" action="${pageContext.request.contextPath }/LoginServlet">  
          :<input type="text" name="username" /><br/>  
         : <input type="password" name="password" /><br/>  
       <input type="submit" value="  " /><br/>  
    </form>  
    </body>  
    </html>

2 사용자 페이지
자바 코드
   
<%@ 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/TR/html4/loose.dtd">  
    <html>  
    <head>  
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">  
    <title>Insert title here</title>  
    </head>  
    <body>  
        :${user.userName}  
    <a href="listUser.jsp" >user list</a>  
    </body>  
    </html>

3 사용자 목록 페이지
Html 코드
   
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>  
    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>  
    <%@page import="java.util.*"%>  
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
    <html>  
    <head>  
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">  
    <title>Insert title here</title>  
    </head>  
    <body>  
       :${user.userName}  
    <br/>  
           :<br/>  
    <%  
        Map onlineUserMap = (Map) application.getAttribute("userMap");  
        System.out.println(onlineUserMap.size());  
    %>  
    <c:forEach var="me" items="${userMap}">  
        ${me.key} <a href="${pageContext.request.contextPath}/KickUserServlet?username=${me.key}" >   </a>  
    </c:forEach>  
    </body>  
    </html>

(3)HttpServletRequest 와 관련 된 감청 기 는 ServletRequestListener,ServletRequestAttributeListener,비동기 처리 와 관련 된 감청 기 가 있 는데 이 감청 기 는 3.0 에 새로 추 가 된 것 이다.
ServletRequestListener 에 대해 서 는 통계 방문 량 등에 더 많이 사용 된다.

좋은 웹페이지 즐겨찾기