본문 바로가기
학습/JSP

11. ServletContext

by Elfen Lied 2022. 11. 8.
반응형

- ServletContext

  • 서블릿과 컨테이너 간의 연동을 위해 사용.
  • 컨텍스트(웹 애플리케이션)마다 하나의 ServletContext가 생성됨
  • 서블릿끼리 자원(데이터)을 공유하는데 사용
  • 컨테이너 실행 시 생성되고 컨테이너 종료 시 소멸됨

 

- ServletContext에서 제공하는 메서드

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

 


 

setServletContext()

  • getServletContext()

src/main/java에 서블릿 생성

 

- SetServletContext

package sec05.ex01;

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 ctx = getServletContext();
		List<String> list = new ArrayList<>();
		list.add("이순신");
		list.add("류성룡");
		// 서블릿 컨텍스트에 데이터 바인딩
		// 애플리케이션 어디서나 getAttribute를 통하여 참조할 수 있음
		ctx.setAttribute("members", list);
		
		out.print("<h1>서블릿 컨텍스트 데이터 바인딩</h1>");
		out.print("이순신, 류성룡....");
	}

}

 

 

- GetServletContext

package sec05.ex01;

import java.io.IOException;
import java.io.PrintWriter;
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();
		
		// 서블릿 컨텍스트 얻기
		ServletContext ctx = getServletContext();
		List<String> memberList = (List<String>) ctx.getAttribute("members");
		String member1 = memberList.get(0);
		String member2 = memberList.get(1);
		out.print(member1 + "<br>");
		out.print(member2 + "<br>");
		
	}
}

 

 

- GetServletContext를 복사해서 GetServletContext2들 만든다

맵핑은 /cget2로 수정

package sec05.ex01;

import java.io.IOException;
import java.io.PrintWriter;
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("/cget2")
public class GetServletContext2 extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		// 서블릿 컨텍스트 얻기
		ServletContext ctx = getServletContext();
		List<String> memberList = (List<String>) ctx.getAttribute("members");
		String member1 = memberList.get(0);
		String member2 = memberList.get(1);
		out.print("cget2<br>");
		out.print(member1 + "<br>");
		out.print(member2 + "<br>");
		
	}
}

 

 

 

- requst와 ServletContext 비교

package sec05.exam01;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
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("/sample/first")
public class FirstServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		ServletContext ctx = getServletContext();// 서블릿 컨텍스트 객체 얻기
		
		request.setAttribute("name", "charlee"); // 리퀘스트 객체에 데이터바인딩
		ctx.setAttribute("subject", "java"); // 서블릿 컨텍스트 객체에 데이터바인딩
		
		RequestDispatcher rd = request.getRequestDispatcher("/sample/second");
		rd.forward(request, response);
	}	

}

 

package sec05.exam01;

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("/sample/second")
public class SecondServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		
		// 리퀘스트에 바인딩 된 데이터 얻기
		String name = (String) request.getAttribute("name");
		
		// 서블릿 컨텍스트에 바인딩 된 데이터 얻기
		ServletContext ctx = getServletContext();
		String subject = (String) ctx.getAttribute("subject");
		
		out.print("서블릿 컨텍스트 객체 데이터 : " + name + "<br>");
		out.print("서블릿 컨텍스트 객체 데이터 : " + subject + "<br>");
		
	}	

}

request를 사용하려면 RequestDispatcher, forward 를 해줘야한다

 

 

 

- ServletContext 객체의 초기화 파라미터

WEB-INF안에 web.xml 수정

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  
  <!-- ServletContext 객체의 초기화 파라미터 -->
	<context-param>
		<param-name>menu_member</param-name>
		<param-value>회원등록 회원조회 회원수정</param-value>
	</context-param> 
</web-app>

 

 

- ContextParamServlet 서블릿 생성

package sec05.ex02;

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 {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		ServletContext ctx = getServletContext();
		String menu_member = ctx.getInitParameter("menu_member");
		String menu_order = ctx.getInitParameter("menu_order");
		String menu_goods = ctx.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>");
	}

}

 

 

 

- ServletContext의 파일 입출력 기능

  • webapp \ WEB-INF \ bin \ init.txt 파일 생성
  • src/main/java에 ContextFileServlet 서블릿 생성

 

- init.txt

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

 

 

- 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 ctx = getServletContext();

		// 루트경로 : webapp
		// 서블릿 컨텍스트는 리소스파일을 읽기 위해 getResourceAsStream 메소드를 제공한다.
		// InputStream(입력스트림) : 데이터가 입력되는 통로
		InputStream is = ctx.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;
		
		// 버퍼가 가득차거나 개행문자가 나타나면 버퍼의 내용을 전송
		// 버퍼가 가득차지 않는 이상 한줄 씩 읽는다.
		// readLine() 메소드는 init.txt 파일에 있는것을 한줄로 읽어온다.
		while ((menu = buffer.readLine()) != null) {
			StringTokenizer tokens = new StringTokenizer(menu, ",");
			menu_member = tokens.nextToken();
			menu_order = tokens.nextToken();
			menu_goods = tokens.nextToken();
		}
		
		out.print(menu_member + "<br>");
		out.print(menu_order + "<br>");
		out.print(menu_goods + "<br>");
		
		out.close();
		buffer.close();
	}

}

 

반응형

'학습 > JSP' 카테고리의 다른 글

13. <hidden>태그와 URL Rewriting 이용해 웹 페이지 연동  (0) 2022.11.09
12. ServletConfig  (0) 2022.11.09
10. JSP파일에 출력하기  (0) 2022.11.08
9. 포워드  (0) 2022.11.07
8. 데이터베이스 데이터 조회, 추가, 삭제  (0) 2022.11.04

댓글