[서블릿/JSP] ServletRequestAttributeListener 리스너로 ServletRequest attribute 변경시 이벤트 처리하기
Servlet&Jsp 2019. 7. 16. 00:30이전글
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 |
ServletRequestAttributeListener 리스너
ServletRequestAttributeListener를 이용하면 ServletRequest 객체에 데이터(attribute)를 저장하고, 수정하고, 꺼내올때의 이벤트를 처리할 수 있습니다. 즉 특정 ServletRequest 객체의 attribute에 조작이 발생하면 그것에 대한 ServletRequestAttributeListener의 메서드가 호출됩니다.
ServletRequestAttributeListener의 선언부를 보면 다음과 같이 세가지의 메서드가 있는것을 볼 수 있습니다.
public interface ServletRequestAttributeListener extends EventListener {
public void attributeAdded(ServletRequestAttributeEvent srae);
public void attributeRemoved(ServletRequestAttributeEvent srae);
public void attributeReplaced(ServletRequestAttributeEvent srae);
} |
cs |
public void attributeAdded(ServletRequestAttributeEvent srae) - ServletRequest 객체에 데이터를 저장했을때 호출됨
public void attributeRemoved(ServletRequestAttributeEvent srae) - ServletRequest 객체에 저장된 데이터를 제거했을때 호출됨
public void attributeReplaced(ServletRequestAttributeEvent srae) - ServletRequest 객체에 저장된 데이터가 변경되었을때 호출됨
ServletRequestAttributeListener 구현 예제
ServletRequestAttributeListener의 동작의 이해를 위해 이를 구현해보고 테스트 해보도록 하겠습니다.
ServletRequestAttributeListener 구현
ServletRequestAttributeListener 리스너 구현 클래스를 다음과 같이 작성합니다. 데이터가 추가, 제거, 수정될때마다 해당 속성명과 값을 출력하도록 했습니다.
package listener;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
public class MyRequestAttributeListener implements ServletRequestAttributeListener{
@Override
public void attributeAdded(ServletRequestAttributeEvent srae) {
System.out.println("!!!속성값 추가!!!");
String attrName = srae.getName();
Object attrValue = srae.getValue();
System.out.println("추가된 속성명 : " + attrName);
System.out.println("추가된 속성값 : " + attrValue);
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent srae) {
System.out.println("!!!속성값 제거!!!");
String attrName = srae.getName();
Object attrValue = srae.getValue();
System.out.println("제거된 속성명 : " + attrName);
System.out.println("제거된 속성값 : " + attrValue);
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent srae) {
System.out.println("!!!속성값 수정!!!");
String attrName = srae.getName();
Object attrValue = srae.getValue();
System.out.println("수정된 속성명 : " + attrName);
System.out.println("수정된 속성값 : " + attrValue);
}
} |
cs |
ServletRequestAttributeEvent의 메서드
이벤트가 발생될때마다 호출되는 메서드에는 매개변수로 ServletRequestAttributeEvent라는 이벤트 객체가 넘어오는것을 볼 수 있습니다. 이 이벤트 객체에는 다음과 같은 메서드들을 가지고 있기때문에 메서드에서 여러가지 처리가 가능합니다.
getServletContext() - 현재 웹 어플리케이션에 대한 ServletContext 객체를 리턴합니다.
getServletRequest() - 속성이 조작된 ServletRequest 객체를 리턴합니다.
getName() - 조작된 속성(Attribute)의 name을 문자열로 리턴합니다.
getValue() - 조작된 속성(Attribute)의 값을 Object 타입으로 리턴합니다. (사용시 형변환 필요)
MyServlet 작성
Servlet을 하나 작성합니다. JSP를 작성해도 무관한데, 리스너의 동작을 확인하기 위해 ServletRequest의 Attribute를 조작하는 부분이 있어야 합니다.
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("속성 추가");
request.setAttribute("name", "dololak");
System.out.println("속성 변경");
request.setAttribute("name", "tistory");
System.out.println("속성제거");
request.removeAttribute("name");
PrintWriter out = response.getWriter();
out.println("hello");
}
} |
cs |
web.xml에 서블릿과 리스너 등록
작성한 리스너와 서블릿을 등록합니다.
<listener>
<listener-class>listener.MyRequestAttributeListener</listener-class>
</listener>
<servlet>
<servlet-name>myServlet</servlet-name>
<servlet-class>servlet.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>/myServlet</url-pattern>
</servlet-mapping> |
cs |
테스트
톰캣을 시작하고 브라우저를 열고 http://localhost:8080/servletTest/myServlet 로 요청해보도록 합니다.
중요한점은 브라우저에서 보여지는 결과가 아니라 콘솔에 찍힌 출력 내용입니다. Attribute가 조작되는 시점마다 각각에 맞는 리스너의 메서드가 호출된것을 볼 수 있습니다.
여기서 가장 최초에 속성값 수정이 이루어진것은 MyServlet이 아닌 톰캣이 내부적으로 필요에 의해 조작하여 호출된 부분입니다. 이것으로 우리가 아닌 톰캣이 자체적으로 서블릿의 Attribute를 조작하더라도 리스너가 동작한다는것을 알 수 있습니다.
'Servlet&Jsp' 카테고리의 다른 글
[서블릿/JSP] HttpSessionAttributeListener 리스너로 세션 Attribute 변경시 이벤트 처리하기 (0) | 2019.07.18 |
---|---|
[서블릿/JSP] HttpSessionListener 리스너로 세션 생성 및 종료시 이벤트 처리하기 (0) | 2019.07.17 |
[서블릿/JSP] ServletRequestListener 리스너로 ServletRequest 생성 소멸시 이벤트 처리하기 (0) | 2019.07.15 |
[서블릿/JSP] HttpSessionBindingListener의 바운드와 언바운드 조건 (0) | 2019.07.15 |
[서블릿/JSP] HttpSessionBindingListener 리스너 사용법 (0) | 2019.07.14 |