반응형
서블릿 컨텍스트
서블릿 컨텍스트 객체에 대하여
1. 애플리케이션을 위한 유틸기능(메서드)를 제공한다.
ex) 파일의 MIME타입 정보 가져오기, 요청정보 보내기(forward), 로깅작업 등.
2. 웹애플리케이션 당 1개씩 생성된다. (애플리케이션을 대표하는 객체임)
+ forward : 하나의 서블릿에서 다른 서블릿 또는 jsp를 연동하는 방법. 서로 작업을 전달한다.
package kr.or.ddit.basic;
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;
public class T06ServletContextTest extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext ctx = req.getServletContext();
System.out.println("서블릿 컨텍스트의 기본 경로 : " + ctx.getContextPath());
System.out.println("서버 정보 : " + ctx.getServerInfo());
System.out.println("서블릿 API의 메이저 버전 정보 : " + ctx.getMajorVersion());
System.out.println("서블릿 API의 마이너 버전 정보 : " + ctx.getMinorVersion());
System.out.println("파일에 대한 MIME타입 정보 : " + ctx.getMimeType("abc.jpg"));
System.out.println("파일시스템상의 실제 경로 : " + ctx.getRealPath("/"));
// 속성값 저장하기
ctx.setAttribute("attr1", "속성1");
// 속성값 변경
ctx.setAttribute("attr1", "속성11");
// 속성값 가져오기
System.out.println("attr1의 속성값 : " + ctx.getAttribute("attr1"));
// 속성값 제거하기
ctx.removeAttribute("attr1");
// 로깅작업 하기
ctx.log("서블릿 컨텍스트 객체를 이용한 로깅 작업 중입니다...");
// 포워딩 처리
ctx.getRequestDispatcher("/T05ServletSessionTest").forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
서블릿 필터
: 요청이 들어오기 전, 서블릿을 거쳐서 필터링 하는 것.
서블릿에 호출되기 전에 수행되게 하고 싶거나 호출되고 난 뒤 수행하고 싶을 때 사용한다.
서블릿 필터에 대하여...
1. 사용 목적
- 클라이언트의 요청을 수행하기 전에 가로채 필요한 작업을 수행할 수 있다.
- 클라이언트에 응답정보를 제공하기 전에 응답정보에 필요한 작업을 수행할 수 있다.
2. 사용 예
- 인증 필터
- 데이터 압축필터
- 인코딩 필터
- 로깅 및 감사처리 필터
- 이미지 변환 필터 등
서블릿 필터 예시
package kr.or.ddit.basic;
import java.io.IOException;
import java.util.Date;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("[T07ServletFilter] init() 호출됨");
// 초기화 파라미터 정보 가져오기
String initParam = filterConfig.getInitParameter("init-param");
System.out.println("init-param : " + initParam);
}
@Override
public void destroy() {
// 필터 객체가 서블릿 컨테이너에서 제거되기 전에 호출됨
System.out.println("[T07ServletFilter] destroy() 호출됨");
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
System.out.println("[T07ServletFilter] doFilter() 시작....");
// 클라이언트의 접속정보 및 접속시간 출력하기
String ipAddr = req.getRemoteAddr();
System.out.println("IP주소 : " + ipAddr + "\n포트번호 : " + req.getRemotePort()
+ "\n현재 시간 : " + new Date());
// 다음 필터를 실행한다. (req, resp 객체 전달)
chain.doFilter(req, resp);
System.out.println("[T07ServletFilter] doFilter() 끝....");
}
}
<?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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name>ServletTest</display-name>
<servlet>
<servlet-name>T05ServletSessionTest</servlet-name>
<servlet-class>kr.or.ddit.basic.T05ServletSessionTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>T05ServletSessionTest</servlet-name>
<url-pattern>/T05ServletSessionTest</url-pattern>
</servlet-mapping>
<filter>
<filter-name>T07ServletFilter</filter-name>
<filter-class>kr.or.ddit.basic.T07ServletFilter</filter-class>
<init-param>
<param-name>init-param</param-name>
<param-value>박채연</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>T07ServletFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
package kr.or.ddit.basic;
import java.io.IOException;
import java.util.Date;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class T07ServletFilter implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("[T07ServletFilter] init() 호출됨");
// 초기화 파라미터 정보 가져오기
String initParam = filterConfig.getInitParameter("init-param");
System.out.println("init-param : " + initParam);
}
@Override
public void destroy() {
// 필터 객체가 서블릿 컨테이너에서 제거되기 전에 호출됨
System.out.println("[T07ServletFilter] destroy() 호출됨");
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
System.out.println("[T07ServletFilter] doFilter() 시작....");
// 클라이언트의 접속정보 및 접속시간 출력하기
String ipAddr = req.getRemoteAddr();
System.out.println("IP주소 : " + ipAddr + "\n포트번호 : " + req.getRemotePort()
+ "\n현재 시간 : " + new Date());
// 다음 필터를 실행한다. (req, resp 객체 전달)
chain.doFilter(req, resp);
System.out.println("[T07ServletFilter] doFilter() 끝....");
}
}
<?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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name>ServletTest</display-name>
<servlet>
<servlet-name>T05ServletSessionTest</servlet-name>
<servlet-class>kr.or.ddit.basic.T05ServletSessionTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>T05ServletSessionTest</servlet-name>
<url-pattern>/T05ServletSessionTest</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>1</session-timeout>
</session-config>
<filter>
<filter-name>T07ServletFilter</filter-name>
<filter-class>kr.or.ddit.basic.T07ServletFilter</filter-class>
<init-param>
<param-name>init-param</param-name>
<param-value>박채연</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>T07ServletFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>T07ServletFilter2</filter-name>
<filter-class>kr.or.ddit.basic.T07ServletFilter2</filter-class>
</filter>
<filter-mapping>
<filter-name>T07ServletFilter2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
package kr.or.ddit.basic;
import java.io.IOException;
import java.util.Date;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class T07ServletFilter2 implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("[T07ServletFilter2] init() 호출됨");
// 초기화 파라미터 정보 가져오기
String initParam = filterConfig.getInitParameter("init-param");
System.out.println("init-param : " + initParam);
}
@Override
public void destroy() {
// 필터 객체가 서블릿 컨테이너에서 제거되기 전에 호출됨
System.out.println("[T07ServletFilter2] destroy() 호출됨");
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
System.out.println("[T07ServletFilter2] doFilter() 시작....");
// 서블릿 수행시간 계산하기
long startTime = System.nanoTime();
// 다음 필터를 실행한다. (req, resp 객체 전달)
chain.doFilter(req, resp);
long endTime = System.nanoTime();
System.out.println("서블릿 수행시간(ns) : " + (endTime - startTime));
System.out.println("[T07ServletFilter2] doFilter() 끝....");
}
}
세션 리스너 객체
: 특정한 이벤트가 발생했을 때, 특정 메소드가 자동 호출된다.
<?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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name>ServletTest</display-name>
<servlet>
<servlet-name>T08SessionListenerTest</servlet-name>
<servlet-class>kr.or.ddit.basic.T08SessionListenerTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>T08SessionListenerTest</servlet-name>
<url-pattern>/T08SessionListenerTest</url-pattern>
</servlet-mapping>
<listener>
<listener-class>kr.or.ddit.basic.MySessionListener</listener-class>
</listener>
</web-app>
package kr.or.ddit.basic;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class MySessionListener implements HttpSessionListener, HttpSessionAttributeListener{
@Override
public void sessionCreated(HttpSessionEvent se) { // 처음 세션이 만들어질 때 호출됨
System.out.println("[MySessionListener] sessionCreated : 세션ID => "
+ se.getSession().getId());
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("[MySessionListener] sessionDestroyed : 세션ID => "
+ se.getSession().getId());
}
@Override
public void attributeAdded(HttpSessionBindingEvent event) {
System.out.println("[MySessionListener] attributeAdded : "
+ event.getName() + ":" + event.getValue() + " 추가됨.");
}
@Override
public void attributeRemoved(HttpSessionBindingEvent event) {
System.out.println("[MySessionListener] attributeRemoved : "
+ event.getName() + " 삭제됨.");
}
@Override
public void attributeReplaced(HttpSessionBindingEvent event) {
System.out.println("[MySessionListener] attributeReplaced : "
+ event.getName() + " 변경됨.");
}
}
반응형
'자바' 카테고리의 다른 글
[Java 고급] 31장 파일 첨부 (0) | 2024.02.26 |
---|---|
[Java 고급] 30장 서블릿 예시 (0) | 2024.02.22 |
[Java 고급] 28장 세션 (1) | 2024.02.21 |
[Java 고급] 27장 쿠키 (0) | 2024.02.21 |
[Java 고급] 26장 서블릿 및 설정 (0) | 2024.02.19 |