티스토리 뷰

1.    ServletContext API

-      웹 어플리케이션에서는 여러 가지 자원을 포함할 수 있으며, 다수의 JSP파일과 서블릿 등이 유기적으로 동작한다.

-      ServletContext(인터페이스)는 웹 어플리케이션마다 하나씩 생성되는 객체로써, 다수의 JSP파일과 서블릿에서 공유해서 사용할 수 있다.

-      ServletContext 객체는 웹 어플리케이션의 라이프 사이클과 동일하기에, 웹 어플리케이션이 Tomcat 컨테이너에 존재한다면 계속 사용할 수 있다. ( = application scope )

-       + application scope : 웹 어플리케이션의 라이프사이클과 동일한 scope를 의미한다.

-       + application scope은 웹 어플리케이션이 존재하는 동안에는 모든 서블릿과 JSP에서 접근이 가능하다.

 

2.    Web component ( Servlet / JSP )가 사용가능한 공유영역 4가지

-      1 ) Application Scope : ServletContext 객체가 관리

-      + 우리가 만든 웹 어플리케이션이 파괴되기 전까지는 유효

-      2 ) Session Scope : HttpSession 객체가 관리

-      + 클라이언트 웹 브라우저 창을 죽이기 전까지는 유효

-      3 ) Request Scope : HttpServletRequest 객체가 관리

-      + 응답문서가 나가기 전까지는 유효

-      4 ) Page Scope : Page 객체가 관리

-      + JSP에만 존재하는 영역으로, 서블릿에는 존재하지 않는다.

-      + JSP 페이지 하나가 실행될 때까지만 유효

 

-      + 여기서 Scope는 데이터의 공유가 가능한 유효범위를 의미한다.


[ 1.  ContextParam 설정 ] (***)

 

[ 1 - 1. web.xml에 ContextParam 등록 ]

 

    <!-- 컨텍스트 파라미터(공유 데이터) 2개 등록 : 모든 서블릿과 JSP가 공유해서 사용이 가능 -->

    <context-param>

      <param-name>jdbcDriver</param-name>
      <param-value>oracle.jdbc.OracleDriver</param-value>

    </context-param>

    <context-param>

      <param-name>savePath</param-name>
      <param-value>C:/save</param-value>

    </context-param>

 

[ 1 - 2. Servlet 생성 ]

 

package org.zerock.myapp;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletConfig;
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;

import lombok.Cleanup;
import lombok.NoArgsConstructor;
import lombok.extern.log4j.Log4j2;


@Log4j2
@NoArgsConstructor

@WebServlet("/ContextParam")
public class ContextParamServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	private String jdbcDriver;
	private String savePath;

	// ==========================================================
	
	@Override
	public void init(ServletConfig config) throws ServletException {
		
		log.info("init(config) invoked.");
		
		// ==========================================================
		// init은 1번만 호출되기 때문에, 여기서 컨텍스트 파라미터가 읽어져야 한다. (***)
		// ==========================================================
		
		ServletContext sc = config.getServletContext();
		log.info("\t + sc : " + sc);
		
		this.jdbcDriver = sc.getInitParameter("jdbcDriver");
		this.savePath = sc.getInitParameter("savePath");
		
		super.init(config); // (***)
		
	} // init
	
	// ==========================================================

	@Override
	public void destroy() {
		
		log.info("destroy() invoked.");
		
	} // destroy
	
	// ==========================================================

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		
		log.info("service(res, req) invoked.");
		
		// 컨텍스트 파라미터 얻기도 용량이 크기 때문에 init에서 다루어져야 한다. (***)
		
		res.setContentType("text/html; charset=utf8");
		
		// 응답문서 준비
		
		@Cleanup
		PrintWriter out = res.getWriter();
		
		out.print("<html><body>");
		out.print("1. 드라이버명 : " + jdbcDriver + "<br>");
		out.print("2. 저장경로 : " + savePath + "<br>");
		out.print("</body></html>");
		
		out.flush();

	} // service
	
	// ==========================================================

} // end class

[ 2. Application Scope에 올려 놓은 공유영역 데이터 다른 Servlet에서 가지고 오기 ] (****)

 

[ 2 - 1. .setAttribute로 공유영역에 올려 놓기 ]

 

package org.zerock.myapp;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletConfig;
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;

import lombok.Cleanup;
import lombok.NoArgsConstructor;
import lombok.extern.log4j.Log4j2;


@Log4j2
@NoArgsConstructor

@WebServlet("/ContextParam")
public class ContextParamServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	private String jdbcDriver;
	private String savePath;

	// ==========================================================
	
	@Override
	public void init(ServletConfig config) throws ServletException {
		
		log.info("init(config) invoked.");
		
		// ==========================================================
		// init은 1번만 호출되기 때문에, 여기서 컨텍스트 파라미터가 읽어져야 한다. (***)
		// ==========================================================
		
		ServletContext sc = config.getServletContext();
		log.info("\t + sc : " + sc);
		
		this.jdbcDriver = sc.getInitParameter("jdbcDriver");
		this.savePath = sc.getInitParameter("savePath");
		
		// ==========================================================
		
//		sc.setAttribute(name, value); : Application scope에 공유데이터(객체)를 올려 놓는다.
//		sc.getAttribute(name);		  : Application scope의 공유데이터를 지운다.
//		sc.removeAttribute(name);	  : Application scope의 공유데이터를 삭제
		
		// Application scope 이란 공유데이터 영역에 2개의 문자열을 올려 놓는다.
		sc.setAttribute("jdbcDriver", jdbcDriver);
		sc.setAttribute("savePath", savePath);
		
		// ==========================================================
		
		super.init(config); // 이걸 작성해야 본 기능인 초기화도 할 수 있다. (***)
		
	} // init
	
	// ==========================================================

	@Override
	public void destroy() {
		
		log.info("destroy() invoked.");
		
	} // destroy
	
	// ==========================================================

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		
		log.info("service(res, req) invoked.");
		
		// 컨텍스트 파라미터 얻기도 용량이 크기 때문에 init에서 다루어져야 한다. (***)
		
		res.setContentType("text/html; charset=utf8");
		
		// 응답문서 준비
		
		@Cleanup
		PrintWriter out = res.getWriter();
		
		out.print("<html><body>");
		out.print("1. 드라이버명 : " + jdbcDriver + "<br>");
		out.print("2. 저장경로 : " + savePath + "<br>");
		out.print("</body></html>");
		
		out.flush();

	} // service
	
	// ==========================================================

} // end class

 

[ 2 - 2. ServletContext / .getInitParameter로 가지고 오기 ]

 

package org.zerock.myapp;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Objects;

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;

import lombok.Cleanup;
import lombok.NoArgsConstructor;
import lombok.extern.log4j.Log4j2;


@Log4j2
@NoArgsConstructor

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

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		
		log.trace("service(req, res) invoked.");
		
		// ========================================
		
		req.setCharacterEncoding("UTF-8");
		
		// 이전 서블릿이 Application Scope에 공유한 2개의 문자열을 얻어낸다.
		ServletContext sc = this.getServletContext();
		Objects.requireNonNull(sc);
		
		String jdbcDriver = (String) sc.getInitParameter("jdbcDriver");
		String savePath = (String) sc.getInitParameter("savePath");
		
		// ========================================
		
		res.setContentType("text/html; charset=utf8");
		
		@Cleanup
		PrintWriter out = res.getWriter();
		
		out.println(String.format("1. jdbcDriver : %s", jdbcDriver));
		log.info("\t + 1 ) jdbcDriver : {}", jdbcDriver);
		out.println(String.format("2. savePath : %s", savePath));
		log.info("\t + 2 ) savePath : {}", savePath);
		
		// 이와 같이 공유영역에 올려 놓은 문자열을 다른 Servlet에서 사용할 수도 있다. (***)
		
		out.flush();
		
	} // service

} // end class
728x90
댓글
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
최근에 올라온 글
Total
Today
Yesterday
공지사항