티스토리 뷰
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
'KH 정보교육원 [ Java ]' 카테고리의 다른 글
KH 89일차 - Servlet / 커넥션 풀 (****) (0) | 2022.07.05 |
---|---|
KH 88일차 - ServletContext 2 (*****) + 리스너 / 필터 생성 (0) | 2022.07.04 |
KH 86일차 - Servlet 3 ( 파라미터 값 가지고 오기,초기화 파라미터 ) (***) (0) | 2022.06.30 |
KH 85일차 - Servlet 2 (****) (0) | 2022.06.29 |
KH 84일차 - Servlet 생성 (****) (0) | 2022.06.28 |