반응형

 

서블릿 컨텍스트

 

 

서블릿 컨텍스트 객체에 대하여

 

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

 

 

 

서블릿 필터

 

: 요청이 들어오기 전, 서블릿을 거쳐서 필터링 하는 것.

서블릿에 호출되기 전에 수행되게 하고 싶거나 호출되고 난 뒤 수행하고 싶을 때 사용한다.

 

 

서블릿 필터에 대하여...
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() 끝....");
		
	}
}

 

결과 화면2

 

 

<?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() 끝....");
		
	}
}

 

위의 링크를 엔터시 아래와 같이 작동됨

 

결과 화면3 : web.xml의 param-value가 출력됨

 

 

<?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() 끝....");
		
	}
}

 

위의 링크를 엔터시 아래와 같이 작동됨

 

결과 화면3 : 흐름을 확인할 수 있음

 

 

 

세션 리스너 객체

 

: 특정한 이벤트가 발생했을 때, 특정 메소드가 자동 호출된다.

 

 

<?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() + " 변경됨.");
	}
	
}

 

결과 화면4

 

 

반응형

'자바' 카테고리의 다른 글

[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