서블릿 설정 정보 객체로, 서블릿 당 하나 생성된다.
웹 컨테이너(or Servlet Container)가 init(ServletConfig config) 메소드를 실행할 때 ServletConfig interface 타입의 구현체를 해당 서블릿으로 전달한다.
ServletConfig 객체는 해당 서블릿이 실행되는데 필요한 설정 정보와
ServletContext 객체의 주소값을 가지고있다.
ex) 서블릿은 사원, ServletConfig는 사원증
servlet은 servlet lifecycel에 의해 객체 생성 -> init() 메소드가 실행될때 servletconfig를 전달하고, 이 때 init-param정보가 담겨 전달된다.
서블릿 레벨에서 init-param은 servletconfg정보를 생성할 때 컨테이너가 이를 읽어서 저장한다.
package step2;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* ServletConfig 의 init param 을 테스트하는 예제
*/
public class ServletConfigTestServlet 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();
out.print("<html>");
out.print("<body bgcolor=yellow>");
out.print("<h3>"+this.getServletName()+"</h3>");
String springConfig=this.getServletConfig().getInitParameter("contextConfigLocation");
out.print("ServletConfig로부터 스프링설정 파일경로를 얻어옴:"+springConfig);
// ServletConfig로부터 ServletContext 객체의 주소값을 받환받아 본다
out.print("<hr>ServletContext 객체 확인:"+this.getServletConfig().getServletContext());
out.print("</body>");
out.print("</html>");
out.close();
}
}
웹 어플리케이션 내의 모든 자바 웹 프로그램(Servlet, JSP)들이
공유하는 환경 정보로 웹 어플리케이션 당 하나 생성된다.
WAS가 웹 어플리케이션을 처음 시작할 때 ServletContext 객체가 생성되고 종료하기 직전에 ServletContext 객체가 소멸된다.
ex) 웹 어플리케이션 : 회사 ServletContext : 사내 인트라넷
Web Application 의 공유 정보인 ServletContext 를 테스트 하는 예제로,
<web-app>
<context-param>
</context-param>
</web-app>
context-param은 웹어플리케이션의 설정 정보이다.
context-param을 web-app안에 넣어주었고 "secutrity-info"라는 name의 value로 설정 파일 경로를 작성한것이다.
package step3;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class ServletContextTest1Servlet
*/
public class ServletContextTest1Servlet 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();
out.print("<html>");
out.print("<body bgcolor=yellow>");
out.print("<h3>"+this.getServletName()+"</h3>");
ServletContext context=getServletConfig().getServletContext();
String securityInfo=context.getInitParameter("security-info");
out.print("<h4>ServletContext의 init-param:"+securityInfo+"</h4>");
out.print("<hr><a href=ServletContextTest2Servlet>ServletContextTest2Servlet으로 이동해 테스트</a>");
out.print("<hr><a href=servletcontext-test.jsp>servletcontext jsp로 이동해 테스트</a>");
// ServletContext 객체에 특정 정보를 할당
context.setAttribute("testInfo", "웹어플리케이션 공유정보");
out.print("</body>");
out.print("</html>");
out.close();
}
}
ServletContext context=getServletConfig().getServletContext();
String securityInfo=context.getInitParameter("security-info");
각각의 servlet 객체당 하나씩 servletconfig가 만들어지는데, 이 servletcontext의 주소값을 servletconfig가 갖고있기때문에 이 주소값을 갖고있는 servlet들은 자원에 접근할 수 있다.
개별 서블릿들이 Init-param으로 정보를 확인했다면, Context-param은 개별 서블릿과는 다르게 전체 web.xml영역차원에서 설정하는 것이다.
context.setAttribute("testInfo", "웹어플리케이션 공유정보");
context 객체에 특정 정보를 할당한다.
"testInfo"라는 name의 value를 "웹어플리케이션 공유정보"를 할당한다.
package step4;
import java.io.IOException;
import java.io.PrintWriter;
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 ServletContextTest2Servlet 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();
out.print("<html>");
out.print("<body bgcolor=lime>");
out.print("<h3>"+this.getServletName()+"</h3>");
// ServletContext 를 받아와 init param 을 얻어온다
// ServletConfig 객체가 존재해야 ServletContext를 이용할 수 있다
ServletContext context=getServletConfig().getServletContext();
String securityInfo=context.getInitParameter("security-info");
out.print("<h4>ServletContext의 init-param:"+securityInfo+"</h4>");
out.print("<hr><a href=ServletContextTest1Servlet>ServletContextTest1Servlet으로 이동해 테스트</a>");
out.print("<hr><a href=servletcontext-test.jsp>servletcontext jsp로 이동해 테스트</a>");
//ServletContext에 ServletContextTest1Servlet이 set 한 정보를 받아와 본다
String info=(String) context.getAttribute("testInfo");
out.print("<hr>ServletContextTest1Servlet 이 ServletContext에 공유한 정보:"+info);
out.print("</body>");
out.print("</html>");
out.close();
}
}
String info=(String) context.getAttribute("testInfo");
out.print("<hr>ServletContextTest1Servlet 이 ServletContext에 공유한 정보:"+info);
servletTest1에서 "testInfo" 라는 name의 값을 String 데이터 타입으로 변환 받아 출력할 수 있도록 한다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>servletcontext-test.jsp</title>
</head>
<body>
<div class="container pt-3">
<h3>servletcontext-test.jsp</h3>
ServletContext로부터 가져온 init param 정보 :<%=application.getInitParameter("security-info") %>
<hr> <a href="ServletContextTest1Servlet">ServletContextTest1Servlet 이동</a>
<hr> <a href="ServletContextTest2Servlet">ServletContextTest2Servlet 이동</a>
<hr> ServletContextTest1Servlet이 ServletContext에 공유한 정보:
<%=application.getAttribute("testInfo") %>
</div>
</body>
</html>
웹어플리케이션 시작시점과 종료시점의 이벤트를 감지하여 시작 시점에 필요한 초기화 작업과 종료 시점에 필요한 작업을 정의해 실행시킬 수 있다.
ServletContextListener Interface의 abstract method
contextInitialized() : 웹 어플리케이션 시작 시점에 호출되는 메소드 contextDestroyed() : 웹 어플리케이션 종료 직전에 호출되는 메소드
package step5;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/**
* Application Lifecycle Listener implementation class TestListener
*
*/
public class TestListener implements ServletContextListener {
//웹어플리케이션 종료 직전에 한번 실행되는 메서드
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("contextDestroyed");
}
// 웹어플리케이션이 처음 시작할 때 한번 실행되는 메서드
public void contextInitialized(ServletContextEvent sce) {
System.out.println("contextInitialized");
}
}