[서블릿] ServletContext

hoonak·2023년 6월 22일
0

서블릿

목록 보기
8/16

ServletContext 클래스는 톰캣 컨테이너 실행 시 각 컨텍스트(웹 애플리케이션)마다 한 개의 ServletContext 객체를 생성함. 그리고 톰캣 컨테이너가 종료하면 ServletContext 객체 역시 소멸 됨.

ServletContext 객체는 웹 애플리케이션이 실행되면서 애플리케이션 전체의 공통 자원이나 정보를 미리 바인딩해서 서블릿들이 공유하여 사용함.

ServletContext 클래스의 특징
- javax.servlet.ServletContext로 정의되어 있음.
- 서블릿과 컨테이너 간의 연동을 위해 사용함.
- 컨텍스트(웹 애플리케이션)마다 하나의 ServletContext가 생성됨.
- 서블릿끼리 자원(데이터)을 공유하는 데 사용함.
- 컨테이너 실행 시 생성되고 컨테이너 종료 시 소멸 됨.

ServletContext가 제공하는 기능
- 서블릿에서 파일 접근 기능.
- 자원 바인딩 기능.
- 로그 파일 기능.
- 컨텍스트에서 제공하는 설정 정보 제공 기능.

ServletContext에서 제공하는 여러 가지 메서드

  • getAttribute(String name) :
  1. 주어진 name을 이용해 바인딩 value를 가져옴.
  2. name이 존재하지 않으면 null을 반환함.
  • getAttributeNames() :
  1. 바인딩된 속성들의 name을 반환함.
  • getContext(String uripath) :
  1. 지정한 uripath 해당되는 객체를 반환함.
  • getInitParameter(String name) :
  1. name에 해당되는 매개변수의 초기화 값을 반환함.
  2. name에 해당되는 매개변수가 존재하지 않으면 null을 반환함.
  • getInitParameterNames() :
  1. 컨텍스트의 초기화 관련 매개변수들이 이름들을 String 객체가 저장된 Enumeration 타입으로 반환함.
  2. 매개변수가 존재하지 않으면 null을 반환함.
  • getMajorVersion() :
  1. 서블릿 컨테이너가 지원하는 주요 서블릿 API 버전을 반환함.
  • getRealPath(String path) :
  1. 지정한 path에 해당되는 실제 경로를 반환함.
  • getResource(String path) :
  1. 지정한 path에 해당되는 Resource를 반환함.
  • getServerInfo() :
  1. 현재 서블릿이 실행되고 있는 서블릿 컨테이너의 이름과 버전을 반환함.
  • getServletContextName() :
  1. 해당 애플리케이션의 배치 관리자가 지정한 ServletContext에 대한 해당 웹 애플리케이션의 이름을 반환함.
  • loni(String msg) :
  1. 로그 파일에 로그를 기록함.
  • removeAttribute(String name, Object object) :
  1. 해당 name으로 객체를 ServletContext에 바인딩함.
  • setInitParameter(String name, String value) :
  1. 주어진 name으로 value를 컨텍스트 초기화 매개변수로 설정함.

예 1) ServletContext 바인딩 기능

getServletContext() 메서드를 이용해 ServletContext 객체에 접근한 다음 ArrayList에 이름과 나이를 저장한 후 다시 ServletContext 객체에 setAttribute() 메서드를 이용해 바인딩함.

setServletContext.java

package sec01.ex09;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/cset")
public class SetServletContext extends HttpServlet{
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		response.setContentType("text/html; charset = utf-8");
		PrintWriter out = response.getWriter();
         // ServletContext 객체를 가져옴.
		ServletContext context = getServletContext();
		List member = new ArrayList();
		member.add("이순신");
		member.add("30");
        // ServletContext 객체에 데이터를 바인딩 함.
		context.setAttribute("member", member);
		out.print("<html><body>");
		out.print("이순신과 30 설정");
		out.print("</body></html>");		
	}
	
}

getServletContext() 메서드를 이용해 ServletContext 객체에 접근함. 그리고 getAttribute() 메서드를 이용해 다른 서블릿에서 바인딩한 ArrayList를 가져와 회원 정보를 출력함.

GetServletContext.java

package sec01.ex09;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/cget")
public class GetServletContext extends HttpServlet{
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html; charset = utf-8");
		PrintWriter out = response.getWriter();
        // ServletContex 객체를 가져옴.
		ServletContext context = getServletContext(); 
        //member로 이전에 바인딩된 회원정보를 가져옴.
		List member = (ArrayList)context.getAttribute("member"); 
		String name = (String)member.get(0);
		int age = (Integer)member.get(1);
		out.print("<html><body>");
		out.print(name + "<br>");
		out.print(age + "<br>");
		out.print("</body></html>");
	}
	
}

ServletContext에 바인딩된 데이터는 모든 데이터는 모든 서블릿들(사용자)이 접근할 수 있음. 따라서 웹 애플리케이션에서 모든 사용자가 공통으로 사용하는 데이터는 ServletContext에 바인딩해 놓고 사용하면 편리함.

예 2) ServletContext의 매개변수 설정 기능

대부분의 웹 애플리케이션에서 메뉴는 공통으로 사용하는 기능임. 따라서 web.xml에 설정해 놓고 프로그램 시작 시 초기화할 때 가져와서 사용하면 편리함. 그러면 새로운 메뉴 항목이 생성되거나 기존 메뉴 항목을 추가, 삭제할 때도 쉽게 수정할 수 있음.

context-param 태그 안에 param-name 태그와 param-value 태그를 이용해 메뉴에 대한 하위 메뉴 항목을 설정함.

web.xml

<!-- <context-param> 태그 안에 다시 <param-name>과 <param-value>태그로 초기 값을 설정함. -->
  <context-param> 
  	<param-name> menu_member </param-name> 
  	<param-value> 회원등록 회원조회 회원수정 </param-value>
  </context-param>
  
  <context-param>
  	<param-name> menu_order </param-name>
  	<param-value> 주문조회 주문등록 주문취소 </param-value>
  </context-param>
  
  <context-param>
  	<param-name> menu_goods </param-name>
  	<param-value> 상품조회 상품등록 상품수정 상품삭제 </param-value>
  </context-param>

getServletContext() 메서드로 ServletContext 객체에 접근함. 그리고 getInitParameter() 메서드의 인자로 각각의 메뉴 이름을 전달한 후 메뉴 항목들을 가져와 이를 브라우저로 출력함.

ContextParameterServlet.java

package sec01.ex10;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/initMenu")
public class ContextParamServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html' charset=utf-8");
		PrintWriter out = response.getWriter();
		// ServletContext 객체를 가져옴.
		ServletContext context = getServletContext(); 
		//web.xml <param-name> 태그의 이름으로 <param-value>태그의 값인 메뉴 이름들을 받아옴.
		String menu_member = context.getInitParameter("menu_member"); 
		String menu_order = context.getInitParameter("menu_order");
		String menu_goods = context.getInitParameter("menu_goods");
		
		out.print("<html><body>");
		out.print("<table border = 1 cellspacing = 0> <tr> 메뉴 이름 </tr>");
		out.print("<tr><td>" + menu_member + "</td></tr>");
		out.print("<tr><td>" + menu_order + "</td></tr>");
		out.print("<tr><td>" + menu_goods + "</td></tr>");
		out.print("</tr></table></body></html>");
	}

}

모든 브라우저에서 같은 메뉴를 출력하는 것을 확인할 수 있음. 즉 메뉴는 ContextServlet 객체를 통해 접근하므로 모든 웹 브라우저에서 공유하면서 접근할 수 있음.

예 3) ServletContext의 파일 입출력 기능
ServletContext의 파일에서 데이터를 읽어 오는 기능. 먼저 폴더를 하나 생성함. 프로젝트 > WebContent/WEB/INF에 폴더(폴더이름 bin) 생성. 이후 init.txt 파일 생성.

init.txt

회원등록 회원조회 회원수정, 주문조회 주문수정 주문취소, 상품조회 상품등록 상품수정 상품삭제

init.txt에서 메뉴 데이터를 읽어와 출력하는 기능을 구현. getServletContext() 메서드로 ServletContext에 접근하여 getResourceAsStream() 메서드에서 읽어 들일 파일 위치를 지정한 후 파일에서 데이터를 입력 받음.

ContextFileServlet

package sec05.ex03;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.StringTokenizer;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/cfile")
public class ContextFileServlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html; charset = utf-8");
		PrintWriter out = response.getWriter();
		
		ServletContext context = getServletContext();
		
		// 해당 위치의 파일을 읽어 들임.
		InputStream is = context.getResourceAsStream("/WEB-INF/bin/init.txt");
		
		BufferedReader buffer = new BufferedReader(new InputStreamReader(is));
		
		String menu = null;
		String menu_member = null;
		String menu_order = null;
		String menu_goods = null;
		
		// 콤마(,)를 구분자로 하여 메뉴 항목을 분리함.
		while((menu = buffer.readLine()) != null) {
			StringTokenizer tokens = new StringTokenizer(menu, ",");
			menu_member = tokens.nextToken();
			menu_order = tokens.nextToken();
			menu_goods = tokens.nextToken();
		}
		
		out.print("<html><body>");
		out.print(menu_member + "<br>");
		out.print(menu_order + "<br>");
		out.print(menu_goods + "<br>");
		out.print("</body></html>");
		out.close();
	}

}
profile
Hello World!

0개의 댓글