삶 가운데 남긴 기록 AACII.TISTORY.COM
ServletContext 본문
ServletContext
서블릿 컨텍스트는 서버 쪽에서 웹 어플리케이션 단위로 값(정보)를 유지하는 방법입니다.
서블릿 컨테이너가 시작될 때 ServletContext 객체가 자동으로 생성되어 웹 어플리케이션이 종료될 때까지 계속 유지 합니다.
init() 메소드를 재정의하여 추출
작업중인 패키지에서 class 파일을 하나 생성하고 이름을 ServletContextTest.java로 만들고 아래처럼 작성합니다.
package net.aacii.test;
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;
@WebServlet("/context")
public class ServletContextTest extends HttpServlet {
ServletContext sc;
@Override
public void init(ServletConfig config) throws ServletException{
sc = config.getServletContext();
}
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
resp.setContentType("text/html;charset=UTF-8");
PrintWriter out = resp.getWriter();
out.print("context:"+sc);
out.close();
}
}
브라우저에서 http://localhost:8080/jsp/context 를 입력하여 테스트 해보세요.
ServletContext객체의 ID가 출력됩니다.
HttpServlet을 통해서 추출
작업중인 패키지에 ServletContextTest1.java 파일을 생성합니다.
package net.aacii.test;
import java.io.IOException;
import java.io.PrintWriter;
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;
@WebServlet("/context1")
public class ServletContextTest1 extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
resp.setContentType("text/html;charset=UTF-8");
PrintWriter out = resp.getWriter();
ServletContext sc = this.getServletContext();
out.print("context:"+sc);
out.close();
}
}
위의 서블릿은 HttpServlet을 상속받았고, HttpServlet은 GenericServlet을 상속받았으며, GenericServlet은 ServletConfig을 상속받아 재정의 했으므로 getServletContext()메서드를 사용할 수 있습니다.
브라우저에서 http://localhost:8080/jsp/context1 를 입력하여 테스트 해보세요.
ServletContext객체의 ID가 출력됩니다.
ServletContext 변수
ServletContext 객체가 가지고 있는 변수는 동일한 웹 어플리케이션에 속한 모든 웹페이지에서 사용하는 글로벌한 변수입니다.
web.xml에서 <servlet>태그 위에다가 아래와 같이 추가합니다.
<context-param>
<param-name>contextConfig</param-name>
<param-value>/WEB-INF/context.xml</param-value>
</context-param>
위에서 생성했던 ServletContextTest1.java 파일을 아래처럼 수정합니다.
package net.aacii.test;
import java.io.IOException;
import java.io.PrintWriter;
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;
@WebServlet("/context1")
public class ServletContextTest1 extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
resp.setContentType("text/html;charset=UTF-8");
PrintWriter out = resp.getWriter();
ServletContext sc = this.getServletContext();
String location = sc.getInitParameter("contextConfig");
out.print("context:"+location);
out.close();
}
}
web.xml에서 contextConfig이라는 변수와 값을 지정했는데, getInitParameter() 메소드를 통해서 해당 변수 값에 접근 할 수 있습니다.
서버 정보 추출
작업중인 패키지에 새 클래스 ServletContextTest2.java를 생성합니다.
package net.aacii.test;
import java.io.IOException;
import java.io.PrintWriter;
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;
@WebServlet("/context2")
public class ServletContextTest2 extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
resp.setContentType("text/html;charset=UTF-8");
PrintWriter out = resp.getWriter();
ServletContext sc = this.getServletContext();
out.print("서블릿 버전:"+sc.getMajorVersion()+"."+sc.getMinorVersion());
out.print("<br>서버 정보:"+sc.getServerInfo());
out.print("<br>웹 어플리케이션 경로:"+sc.getContextPath());
out.print("<br>웹 어플리케이션 이름:"+sc.getServletContextName());
out.print("<br>파일 실제 경로:"+sc.getRealPath("/name.html"));
sc.log("로그 기록!!");
out.close();
}
}
테스트는 브라우저에서 http://localhost:8080/jsp/context2 을 입력해보면 됩니다.
웹 어플리케이션 단위 객체 공유
작업중인 패키지에 새 클래스 ShareObject.java 를 생성합니다.
package net.aacii.test;
public class ShareObject {
private int count;
private String str;
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
}
다음으로 ServletContextTest3.java 서블릿을 새로 생성합니다.
package net.aacii.test;
import java.io.IOException;
import java.io.PrintWriter;
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;
@WebServlet("/context3")
public class ServletContextTest3 extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
resp.setContentType("text/html;charset=UTF-8");
PrintWriter out = resp.getWriter();
ServletContext sc = this.getServletContext();
ShareObject obj1 = new ShareObject();
obj1.setCount(100);
obj1.setStr("객체 공유 테스트 1");
sc.setAttribute("data1", obj1);
ShareObject obj2 = new ShareObject();
obj2.setCount(200);
obj2.setStr("객체 공유 테스트 2");
sc.setAttribute("data2", obj2);
out.print("ServletContext 객체에 등록했습니다.");
out.close();
}
}
계속해서 새 서블릿 ServletContextTest4.java 를 생성합니다.
package net.aacii.test;
import java.io.IOException;
import java.io.PrintWriter;
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;
@WebServlet("/context4")
public class ServletContextTest4 extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
resp.setContentType("text/html;charset=UTF-8");
PrintWriter out = resp.getWriter();
ServletContext sc = this.getServletContext();
ShareObject obj1 = (ShareObject) sc.getAttribute("data1");
ShareObject obj2 = (ShareObject) sc.getAttribute("data2");
out.print(obj1.getCount() + " , " + obj1.getStr() + "<br>");
out.print(obj2.getCount() + " , " + obj2.getStr() + "<br>" );
out.close();
}
}
테스트 해볼 때는 먼저 http://localhost:8080/jsp/context3 를 실행한 후에, 서버를 재시작 하지 않은 상태로
http://localhost:8080/jsp/context4 를 실행해야 합니다.
'DEV&OPS > Java' 카테고리의 다른 글
세션 Session (0) | 2022.06.14 |
---|---|
쿠키 Cookie (0) | 2022.06.14 |
서블릿 설정(web.xml)과 변수 (0) | 2022.06.10 |
Method GET POST (0) | 2022.06.10 |
Servlet request response (0) | 2022.06.08 |