ServletConfig, ServletContext, ServletContextListener

기록하는 용도·2022년 9월 26일
0

ServletConfig

서블릿 설정 정보 객체로, 서블릿 당 하나 생성된다.
웹 컨테이너(or Servlet Container)가 init(ServletConfig config) 메소드를 실행할 때 ServletConfig interface 타입의 구현체를 해당 서블릿으로 전달한다.
ServletConfig 객체는 해당 서블릿이 실행되는데 필요한 설정 정보와
ServletContext 객체의 주소값을 가지고있다.

ex) 서블릿은 사원, ServletConfig는 사원증


ServletConfig 예제

web.xml

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();   
	}
}



ServletContext

웹 어플리케이션 내의 모든 자바 웹 프로그램(Servlet, JSP)들이
공유하는 환경 정보
웹 어플리케이션 당 하나 생성된다.


WAS가 웹 어플리케이션을 처음 시작할 때 ServletContext 객체가 생성되고 종료하기 직전에 ServletContext 객체가 소멸된다.

ex) 웹 어플리케이션 : 회사 ServletContext : 사내 인트라넷



ServletContext 예제

Web Application 의 공유 정보인 ServletContext 를 테스트 하는 예제로,

  • ServletContextTest1Servlet
  • ServletContextTest2Servlet
  • servletcontext-test.jsp
    위 2개의 서블릿과 1개의 jsp에서 공유자원인 ServletContext 의 init parameter 에 접근해서 정보를 사용할 수 있음을 확인한다.

web.xml

<web-app>
	<context-param>
	</context-param>
</web-app>    

context-param은 웹어플리케이션의 설정 정보이다.
context-param을 web-app안에 넣어주었고 "secutrity-info"라는 name의 value로 설정 파일 경로를 작성한것이다.



ServletContextTest1Servlet

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를 "웹어플리케이션 공유정보"를 할당한다.



ServletContextTest2Servlet

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 데이터 타입으로 변환 받아 출력할 수 있도록 한다.



servletcontext-test.jsp

<%@ 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> ServletContextTest1ServletServletContext에 공유한 정보:
<%=application.getAttribute("testInfo") %>

</div>
</body>
</html>



ServletContextListener

Application LifeCycle Listener

웹어플리케이션 시작시점과 종료시점의 이벤트를 감지하여 시작 시점에 필요한 초기화 작업과 종료 시점에 필요한 작업을 정의해 실행시킬 수 있다.

ServletContextListener Interface의 abstract method
contextInitialized() : 웹 어플리케이션 시작 시점에 호출되는 메소드 contextDestroyed() : 웹 어플리케이션 종료 직전에 호출되는 메소드

TestListener 예제

TestListener

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");
    }	
}

0개의 댓글