Recent Posts
Recent Comments
Link
06-30 12:53
Today
Total
관리 메뉴

삶 가운데 남긴 기록 AACII.TISTORY.COM

ServletContext 본문

DEV&OPS/Java

ServletContext

ALEPH.GEM 2022. 6. 13. 16:54

 

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 를 실행해야 합니다.

context3
context4

 

 

 

 

 

 

 

728x90

'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