본문 바로가기
멀티캠퍼스 풀스택 과정/백엔드

백엔드2-2. Servlet-2 ServletConfig, ServletContext(초기화)

by 이쟝 2022. 3. 5.

2022.03.05 - [멀티캠퍼스 풀스택 과정/백엔드] - 백엔드2-1. Servlet-1 Servlet기초와예제, HttpServlet, web-xml, url

2022.03.05 - [멀티캠퍼스 풀스택 과정/백엔드] - 백엔드1-10. JSP-9: JSTL를 이용한 로그인 로그아웃


Servlet클래스의 ServletConfig(서블릿 초기화 파라미터) - Init( )

서블릿을 생성하고, 초기화할 때 자동으로 호출되는 메서드로 한 번만 호출한다. 

HttpServlet의 최상위 클래스인 Servlet 인터페이스에 정의되어 있다. 
public void init(ServletConfig config) throws ServletException;​

 

서블릿 컨테이너가 서블릿을 생성하려고 할 때 하나의 ServletConfig 객체를 생성한 후 이 객체를 이용해 서블릿을 초기화 할 수 있다. 

 

서블릿의 초기화 파라미터는 web.xml 파일에 기재한다.

초기화 파라미터는 String으로만 저장할 수 있고, 리턴 값 또한 String이다. 

서블릿 안에서 초기화 파라미터 값을 가져오려면 ServletConfig의 getInitParameter( )를 이용해야한다. 
- 이메서드는 서블릿클래스의 상위클래스(super)인 javax.servlet.GenericServlet 에 속하기 때문에 메서드 이름만 가지고 호출 가능하다. 
- 초기화 파라미터의 이름을 파라미터로 넘겨주면 이 메서드는 그 이름에 해당하는 초기화 파라미터의 값을 리턴한다.

web.xml 파일 servlet 클래스 파일
<servlet>
    <servlet-name>form</servlet-name>
    <servlet-class>projectName.servletClassName</servlet-class>
    <init-param>
        <param-name>name</param-name>
        <param-value>단호박</param-value>
    </init-param>
</servlet>
// 매개변수로 web.xml에서 지정했던 param-name 데이터를 가져오기
String name = getInitParameter("name");

 

ServletConfig의 과정

  1. 서블릿이 생성될 때 서블릿 컨테이너가 web.xml에 적혀진 파라미터를 읽는다. 
    1. ServletConfig은 web.xml에 매개변수(parameter)를 설정할때, init-param을 이용한다. 
    2. ServletConfin는 파라미터를 servlet항목에 포함시킨다.
  2. 서블릿 컨테이너는 ServletConfig객체를 만든 뒤, 읽었던 파라미터 정보를 ServletConfig에 넘겨준다. 
  3. 서블릿 컨테이너는 정보를 가지고 있는 ServletConfig를 해당 서블릿의 init()메서드의 파라미터로 넣어준다.
  4. 해당 Servlet의 초기화 완료

Servlet클래스의 ServletContext(서블릿 초기화 파라미터)

하나의 서블릿이 아니라 모든 웹 어플리케이션의 파라미터로 사용된다. 특정한 서블릿 외에 다른 서블릿이나 JSP에서도 파라미터를 사용할 수 있다.

서블릿의 정보를 가져오기 위해서는 서블릿 컨테이너에 접근해야 하는데, 이 접근을 가능하게 해주는 것이 ServletContext이다. 

ServletContext는 서블릿 컨테이너가 시작될 때 웹서버에 등록된 웹 애플리케이션 단위로 하나의 ServletContext 객체가 자동으로 생성되고 웹 애플리케이션 서비스가 중지될 때 소멸한다. 

 

ServletContext sc = getServletContext( );
- ServletContextServletConfig의 getServletContext( )를 사용해서 얻는다.
- servlet은 HttpServlet 상속, HttpServlet은 ServletConfig 구현 -> getServletContext( )
를 바로 사용 가능
- ServletContext
를 사용하기위해서는 import.javax.servlet.ServletContext을 해야한다.

 

ServletContext의 과정

  1. 어플리케이션이 시작될때 서블릿 컨테이너가 web.xml에 적혀진 파라미터를 읽는다. 
    1. ServletContext는 web.xml에 매개변수(parameter)를 설정할때, context-param을 이용한다. 
    2. ServletContext는 파라미터를 servlet항목이 아닌 web-app에 포함시킨다.
  2. 서블릿 컨테이너는 ServletContext객체를 만든 뒤, 읽었던 파라미터 정보를 ServletContext에 넘겨준다. 
  3. 같은 웹 어플리케이션에 있는 모든 Servlet과 JSP가 ServletContext에 접근할 수 있다. 

예제 

1. web.xml

<servlet>
	<servlet-name>InitParamServlet</servlet-name>
	<servlet-class>myApp.InitParamServlet</servlet-class>
	<init-param>
			<param-name>userid</param-name>
			<param-value>pumpkin</param-value>
	</init-param>
	<init-param>
			<param-name>username</param-name>
			<param-value>호박</param-value>
	</init-param>
</servlet>
	
<context-param>
	<param-name>userage</param-name>
	<param-value>20</param-value>	
</context-param>
	
<servlet-mapping>
	<servlet-name>InitParamServlet</servlet-name>
	<url-pattern>/init</url-pattern>
</servlet-mapping>
<init-param> 특정 서블릿에서만 사용가능한 파라미터 값(지역변수)
<context-param> 모든 서블릿에서 사용가능한 파라미터 값(전역변수)
어느 하나의 서블릿 태그안에 속하는 것이 아닌 독립적으로 추가
<param-name> 매개변수의 이름 정의
<param-value> 매개변수의 값 정의

 

2. 서블릿 생성(InitParamServlet.java)

package myApp;

//@WebServlet("/init")
public class InitParamServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
                // web.xml의 context-param 데이터를 가져오기
		// import.javax.servlet.ServletContext
		ServletContext sc = getServletContext();
		String age = sc.getInitParameter("userage");
		
		//web.xml의 init-param 데이터를 가져오기
		String id = getInitParameter("userid");
		String name = getInitParameter("username");
		
		// 한글인코딩
		response.setContentType("text/html;charset=UTF-8");
		
		// response 객체 쓰기를 하기위해 PrintWriter 객체를 얻어온다. 
		PrintWriter pw = response.getWriter();  // import PrintWriter
		pw.println("<!DOCTYOE html><html><head><title>init테스트</title></head><body>");
		pw.println("<ul><li>아이디="+id+"</li>");
		pw.println("<li>이름="+name+"</li>");
		pw.println("<li>나이="+age+"</li></ul></body></html>");
	}

}

 


ServletConfig와 ServletContext

  ServletConfig ServletContext
초기화 시기 서블릿을 생성할 때  웹 어플리케이션이 시작될 때
객체의 수  서블릿 당 하나  웹 어플리케이션 당 하나
접근 범위 특정 서블릿 모든 웹 어플리케이션
web.xml에서의 사용법 servlet항목 안에 <init-param> web-app항목 안에 <context-param>

 


https://dololak.tistory.com/47

https://matamong.tistory.com/entry/JAVA-%EC%84%9C%EB%B8%94%EB%A6%BF-%EC%B4%88%EA%B8%B0%ED%99%94-%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0-ServletConfig-ServletContext

https://kgvovc.tistory.com/38