Servlet
서블릿 컨텍스트(ServletContext)
dev23
2024. 8. 12. 18:57
반응형
ServletContext
- ServletContext 클래스는 톰캣 컨테이너 실행 시 각 컨텍스트(웹 애플리케이션)마다 한 개의 ServletContext객체를 생성한다. 그리고 톰캣 컨테이너가 종료하면 ServletContext 객체 역시 소멸된다.
- ServletContext객체는 웹 애플리케이션이 실행되면서 애플리케이션 전체의 공통 자원이나 정보를 미리 바인딩해서
서블릿들이 공유하여 사용한다.
ServletContext 클래스의 특징
- javax.servlet.ServletContext로 정의되어 있다.
- 서블릿과 컨테이너 간의 연동을 위해 사용한다.
- 컨텍스트(웹 애플리케이션)마다 하나의 ServletConext가 생성된다.
- 서블릿끼리 자원(데이터)을 공유하는 데 사용한다.
- 컨테이너 실행 시 생성되고 컨테이너 종료 시 소멸된다.
Servlet Context 제공 기능
- 서블릿에서 파일 접근 기능
- 자원 바인딩 기능
- 로그 파일 기능
- 컨텍스트에서 제공하는 설정 정보 제공 기능
ServletContext 메서드
메서드 | 기능 |
getAttribute(String name) | - 주어진 name을 이용해 바인딩된 value를 가져온다. - name이 존재하지 않으면 null을 반환 |
getAttibuteNames() | 바인딩된 속성들의 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를 반환 |
getServerInfo() | 현재 서블릿이 실행되고 있는 서블릿 컨테이너의 이름과 버전을 반환 |
getServletContextName() | 해당 애플리케이션의 배치 관리자가 지정한 ServletContext에 대한 해당 웹 애플리케이션의 이름을 반환 |
removeAttribute(String name) | 해당 name으로 ServletContext에 바인딩된 객체를 제거한다. |
setAttribute (String name, Object obj) |
해당 name으로 객체를 ServletContext에 바인딩한다. |
setInitParameter (String name, String value) |
주어진 name으로 value를 컨텍스트 초기화 매개변수로 설정한다. |
log(String msg) | 로그 파일에 로그를 기록한다. |
ServletContext 바인딩
- ServletContext 바인딩의 기능을 이용한다.
* SetServletContext.java
package servlet;
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;
/**
* Servlet implementation class SetServletContext
*/
@WebServlet("/cset")
public class SetServletContext extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
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.java
package servlet;
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;
/**
* Servlet implementation class SetServletContext
*/
@WebServlet("/cget")
public class GetServletContext extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
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);
out.print("</body></html>");
}
}
- 코드 작성 후 톰캣을 재시작하고 브라우저에 localhost:[port]/[project_name]/cset 을 입력한다.
- 위 페이지에 접속 후 localhost:[port]/[project_name]/cget 에 접속한다.
- ServletContext에 바인딩된 데이터는 모든 서블릿들(사용자)이 접근할 수 있다. 따라서 웹 애플리케이션에서 모든
사용자가 공통으로 사용하는 데이터는 ServletContext에 바인딩해 놓고 사용하면 편리하다.
반응형