이전글



ServletRequest 객체
ServletRequest 객체는 JSP/Servlet에서 클라이언트로부터의 요청이 왔을때 그 요청 정보를 객체화한것입니다, HTTP 환경에서 클라이언트인 브라우저가 톰캣같은 서블릿 컨테이너로 요청을 보낼때마다 ServletRequest의 하위객체인 HttpServletRequest 객체가 하나씩 생성되며, 컨테이너에서 요청을 처리한 후 응답을 보낼때 사라지게 됩니다.

ServletRequest에는 객체를 저장하고 꺼내어 쓸 수 있는데, 저장할떄는 public void setAttribute() 메서드를 사용하며, 꺼낼때는 getAttribute() 메서드를 사용합니다. 앞서 말했듯 ServletRequest는 요청을 처리하고 나면 소멸되기 때문에 attribute와 관련된 메서드를 통해 하나의 요청이 처리되는 범위 안에서 데이터를 공유할 수 있습니다.
public void setAttribute(String name, Object o) //데이터 저장시 사용
public Object getAttribute(String name) //데이터 꺼낼 때 사용
cs




ServletRequestListener 리스너
ServletRequestListener는 클라이언트가 웹 어플리케이션으로 요청을 보내어 ServletRequest 객체가 생성될때와 요청 처리를 마치고 ServletRequest 객체가 소멸될때의 이벤트를 처리할 수 있습니다. 여기서 요청이라 함은 경로와 관계없이 클라이언트가 서버로 보내는 모든 요청(html 등의 파일 요청 포함)을 의미합니다.

리스너는 기본적으로 인터페이스이고 구현하여 사용하는것이므로 ServletRequestListener에 선언되어 있는 메서드를 보자면 다음과 같습니다.
public interface ServletRequestListener extends EventListener {
 
    public void requestInitialized(ServletRequestEvent sre);
 
    public void requestDestroyed(ServletRequestEvent sre);
}
cs

  • public void requestInitialized(ServletRequestEvent sre) - ServletRequest 객체가 생성될 때 호출됨
  • public void requestDestroyed(ServletRequestEvent sre) - ServletRequest 객체가 소멸될 때 호출됨




ServletRequestListener 호출 과정
클라이언트로부터 요청과 응답 사이에서 ServletRequestListener가 동작하는 과정은 다음과 같습니다.


1. 브라우저가 톰캣과 같은 서블릿컨테이너로 HTTP 요청을 보냅니다.
2. 서블릿컨테이너에서 요청에 대한 ServletRequest객체(HttpServletRequest)를 생성합니다.
3. 이렇게 ServletReqeust객체가 생성되었을때 ServletRequestEvent 이벤트가 발생됩니다.
4. 서블릿컨테이너는 구현되어 있는 ServletRequestListener가 있는지 확인하여 requestInitialized() 메서드에 ServletRequestEvent 객체를 넘겨주면서 호출합니다.
5. 서블릿에서 요청을 처리하고 클라이언트에 처리 결과를 응답하면서 ServletRequest객체는 소멸하고 이때 다시 ServletRequestEvent 이벤트가 발생합니다.
6. 서블릿컨테이너는 구현되어 있는 ServletRequestListener가 있는지 확인하여 requestDestroyed() 메서드에 ServletRequestEvent 객체를 넘겨주면서 호출합니다.






 
ServletRequestListener 구현 및 테스트

원하는 패키지에 ServletRequestListener 인터페이스를 상속받아 구현합니다.  요청 객체(ServletRequest)가 생성되었을 때 호출되는 requestInitialized() 메서드와 요청 객체가 소멸될 때 호출되는 requestDestroyed() 메서드를 각각 구현하면 됩니다.

저는 요청객체 생성시에는 !!!요청정보 생성!!! 이라는 로그를 콘솔로 출력하고 서버정보와 name이라는 파라미터를 출력하도록 했고, 요청객체 소멸시에는 !!!요청정보 소멸!!! 이라는 로그를 출력하도록 구현해 주었습니다.
package listener;
 
 
import javax.servlet.ServletContext;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;
 
 
public class MyRequestListener implements ServletRequestListener{
 
 
    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        System.out.println("!!!요청정보 생성!!!");
        
        ServletContext ctx = sre.getServletContext();
        HttpServletRequest request =  (HttpServletRequest)sre.getServletRequest();
        
        System.out.println(ctx.getServerInfo());
        //ServletRequestListener 리스너에서는 요청 파라미터를 얻을 수 있습니다.
        System.out.println("이름 : " + request.getParameter("name"));
    }
    
    
    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        System.out.println("!!!요청정보 소멸!!!");
    }
 
 
}
cs



ServletRequestEvent의 메서드
구현 메서드에는 ServletRequestEvent라는 이벤트 객체가 매개변수로 넘어오는데, ServletRequestEvent 객체에는 중요한 몇가지 메서드가 있습니다.
  • getServletContext() - 현재 요청이 발생한 웹 어플리케이션의 정보를 담은 ServletContext 객체를 반환합니다.
  • getServletRequest() - 현재 요청정보를 담은 ServletRequest 객체를 반환합니다.





web.xml에 리스너 등록
WEB-INF/web.xml 파일에는 <web-app> 태그 하위에 다음과 같이 구현해둔 리스너를 설정으로 등록만 해두면 됩니다.
      <listener>
            <listener-class>listener.MyRequestListener</listener-class>
      </listener>
cs



test.html
추가적으로 브라우저로 호출할 대상이 필요하니 test.html 파일을 작성해둡니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
      환영합니다.
</body>
</html>
cs



테스트
모두 작성했다면 서버를 기동합니다. 저는 톰캣을 사용했습니다. 서버가 모두 기동됐다면 localhost/test.html?name=dololak 과 같이 요청을 보냅니다. 리스너에서 name 파라미터 값을 출력되도록 했기 때문에 뒤에 쿼리스트링을 포함시켜줍니다.



브라우저에는 html의 내용이 보이고 콘솔 혹은 톰캣의 터미널을 보면 아래와 같이 출력된것을 볼 수 있습니다. 





블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

,