위로
아래
ServletContext
- 웹 애플리케이션(프로젝트) 단위로 set, get 할 수 있는 데이터.
- Server 폴더의 server.xml 에 저장되어, 굳이 데이터를 전송하지 않아도 setServletContext로 데이터를 set하면 여러 서블릿에서 getServletContext로 데이터를 get할 수 있다.
- 서버가 꺼지면 set이 해제되어서, 서버를 재실행하면 set을 다시 하고 get을 해주어야 한다.
- 객체를 생성하고 써줘야 한다.
ServletContext 클래스
- 하나의 서블릿이 서블릿 컨테이너와 통신하기 위하여 사용되는 메소드들을 가지고 있는 클래스
- ServletContext 클래스는 톰캣 컨테이너 실행 시, 각 컨텍스트(웹 애플리케이션)마다 한 개의 ServletContext 객체를 생성하고 톰캣 컨테이너가 종료되면 ServletContext 객체도 소멸된다.
- ServletContext 객체는 웹 어플리케이션이 실행되면서 애플리케이션 전체의 공통 자원이나 정보를 미리 바인딩해서 서블릿들이 공유하여 사용한다.
- 서블릿과 컨테이너 간의 연동을 위해 사용
- 서블릿끼리 자원을 공유하는 데 사용
- ServletConfig는 컨텍스트당이 아니라, 서블릿당 하나식 생성된다.
- javax.servlet.ServletContext로 정의
제공하는 기능
- 서블릿에서 파일 접근 기능
- 자원 바인딩 기능
- 로그 파일 기능
- 컨텍스트에서 제공하는 설정 정보 제공 기능
메소드
- getAttribute(String name) : 주어진 name을 이용해 value를 가져온다. (name이 없으면 null 반환)
- getAttributeNames() : 바인딩된 속성들의 name을 반환
- getContext(String uripath) : 지정한 uripath에 해당되는 객체 반환
- getInitParameter(String name) : name에 해당되는 매개변수의 초기화 값 반환. 없으면 null 반환
- getInitParameterNames() : 컨텍스트의 초기화 관련 매개변수들의 이름들을 String 객체가 저장된 Enumeration 타입으로 반환 (없으면 null 반환)
- getMajorVersion() : 서블릿 컨테이너가 지원하는 주요 서블릿 API 버전을 반환
- getRealPath(String path) : 지정한 path에 해당되는 실제 경로를 반환
- getResource(String path) : 지정한 path에 해당되는 Resource를 반환
- getServerInfo() : 현재 서블릿이 실행되고 있는 서블릿 컨테이너의 이름과 버전을 반환
- getServletContextName() : 해당 애플리케이션의 배치 관리자가 지정한 ServletContext에 대한 해당 웹 애플리케이션의 이름을 반환
- log(String msg) : 로그 파일에 로그를 기록
- removeAttrivute(String name) : 해당 name으로 ServletContext에 바인딩된 객체를 제거
- setAttribute(String name, Object object) : 해당 name으로 객체를 ServletContext에 바인딩
- setInitPrameter(String name, String value) : 주어진 name으로 value를 컨텍스트 초기화 매개변수로 설정
예시
더보기
// SetServletContext 서블릿
import java.io.IOException;
import java.io.PrintWriter;
import java.util.*;
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 {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
ServletContext context = getServletContext();
List member = new ArrayList();
member.add("이순신");
member.add(30);
context.setAttribute("member", member);
out.print("<html><body>");
out.print("이순신과 30 설정");
out.print("</body></html>");
}
}
//GetServletContext 서블릿
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 {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
ServletContext context = getServletContext();
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>");
}
}
set 안 해주고 web.xml에 정의하기 (파라미터)
- web.xml에 <context-param>으로 context를 매개변수로 등록해놓으면, setServletContext해주지 않아도 getServletContext로 context 내에 저장된 데이터를 불러올 수 있다.
- 서버를 재실행해도 web.xml이 등록해주니까 set을 안 해주어도 된다.
web.xml에 등록하는 방법
<context-param>
<param-name> 이름 </param-name>
<param-value> 값 </param-value>
</context-param>
예시
더보기
<!-- 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">
<display-name>webTec</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.jsp</welcome-file>
<welcome-file>default.htm</welcome-file>
</welcome-file-list>
<filter>
<filter-name>Encoding Filter</filter-name>
<filter-class>filter.CommonEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Encoding Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<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>
</web-app>
// ContextParamServlet 서블릿
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 {
private static final long serialVersionUID = 1L;
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 context = getServletContext();
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>");
}
}
Context 파일 입출력
- InputStram과 getgetResourceAsStream을 이용해서 set 없이 파일을 get해서 정보를 불러올 수 있다.
예시
더보기
<!-- WEB-INF > bin > init.txt파일 -->
회원등록 회원조회 회원수정, 주문조회 주문수정 주문취소, 상품조회 상품등록 상품수정 상품삭제
//ContextFileServlet 서블릿
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 {
private static final long serialVersionUID = 1L;
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();
}
}