78일차 Servlet 공유영역1

쿠우·2022년 7월 17일

-ServletContext

서블릿에서 웹 어플리케이션내의 특정 파일을 접근하기 위해서 ServletContext 객체를 사용
할 수 있다. 단, 읽기 모드만 가능하고 쓰기는 불가능

서블릿에서 읽을 텍스트 파일을 웹 어플리케이션의 WEB-INF 폴더에 testFile.txt 형식으로 작성하고, 내용을 입력 시킨 후에 저장
-WEB-INF 폴더는 유저의 직접 접근이 어렵워 보안성이 높다.
-web 폴더에 있을 경우 바로 파일을 확인가능

(1)ServletContext 객체를 통해 파일을 읽어내는 서블릿 예제

-알아보는 점들

  • getResourceAsStream() 메소드를 사용해서 파일을 사용

    Class.getResourceAsStream() 메소드는 ClassLoader.getResourceAsStream() 메소드를 호출한다.

    Class.getResouceAsStream() 메소드가 하는 일은 리소스의 경로를 ClassLoader의 기준에 맞춰서 재조합해준 후에 ClassLoader.getResourceAsStream() 메소드를 호출해주는 것 뿐이다.

@WebServlet("/ContextFile")
public class ContextFileServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		log.trace("service invoked");
		
		// "src/main/webapp/WEB-INF/testFile.txt" 읽어내자!!
		// "/WEB-INF/testFile.txt" (웹어플리케이션 기준으로 보면, Content Root가 시작지점 )
		
		
		ServletContext sc = request.getServletContext();	
		
		@Cleanup
		InputStream is = sc.getResourceAsStream("/WEB-INF/textFile.txt");
		
		@Cleanup
		BufferedReader reader = new BufferedReader(new InputStreamReader(is));	
		
		response.setContentType("text/html; charset=utf8");
		
		
		
		@Cleanup
		PrintWriter  out = response.getWriter();
		
		out.println("<ul>");
		String line;
		while((line=reader.readLine())!=null ) {
			out.println("<li>"+line+"</li>");
		}// while
		out.println("</ul>");
		
	}//service

}// end class

(2)ServletContext 객체를 통해 요소를 객체의 공유범위에 등록

  • 알아본 점 setAttribute() 사용한다만 알고 있으면 될 거 같다.
@WebServlet("/ContextSet")
public class ContextSetServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       


	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		log.trace("service invoked");
		
		String name = "홍길동";
		int age =12;
		
		getServletContext().setAttribute("name", name);
		getServletContext().setAttribute("age", age);
	}// service

}// end class

(3)ServletContext 객체를 통해 등록된 요소를 가져온다.

  • 알아본 점 setAttribute() 등록이 안된채 사용하면

이런식으로 오류난다.

공유 범위의 생명주기를 생각해서 사용해야한다!

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

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		try {
		
		ServletContext sc = request.getServletContext();
			
		String name = (String) sc.getAttribute("name");
		int age = (int) sc.getAttribute("age");
	
		response.setContentType("text/html; charset=utf8");

		@Cleanup
		PrintWriter  out = response.getWriter();
		
		out.print("이름: " + name +"<br>");
		out.print("나이: " + age +"<br>");
		
		out.flush();
		
		
		sc.removeAttribute("name");
		sc.removeAttribute("age");
		
		
		}catch(Exception e) {
			throw new ServletException(e);
		}
	
	}// service

}// end class

-ServletContextListener API

웹 어플리케이션이 초기화되고 제거되는 이벤트를 감지하는 ServletContextListener API를 사용하면, 언제 초기화되고 제거 되었는지를 쉽게 알 수 있다.

리스너 생성시 어느영역에서 모니터링은 어떤걸 하고싶은지 체크.

(1) Listener 예제

-알아본 점

  • contextInitialized()
  • contextDestroyed() 메소드를 사용하여
    어느 시점에 생기고 어느시점에 종료되는지 체크할 수 있었다.

@WebListener
public class ContextListenerImpl implements ServletContextListener {


	// context = 웹앱의 별칭
	
	//우리가 만든 Web Application이 WAS를 따라 올라오면서, 초기화 될 때 called back by servlet container
	@Override
	public void contextInitialized(ServletContextEvent sce)  { 
		log.trace("contextInitialized {} invoked", sce);
	}//contextInitialized

	//우리가 만든 Web Application이 WAS를 따라 내려가면서, 초기화 될 때 called back by servlet container
	@Override
    public void contextDestroyed(ServletContextEvent sce)  { 
         log.trace("contextDestroyed {} invoked", sce);
    }//contextDestroyed 

	
} // end class

끝..!?..

profile
일단 흐자

0개의 댓글