서블릿에서 웹 어플리케이션내의 특정 파일을 접근하기 위해서 ServletContext 객체를 사용
할 수 있다. 단, 읽기 모드만 가능하고 쓰기는 불가능
서블릿에서 읽을 텍스트 파일을 웹 어플리케이션의 WEB-INF 폴더에 testFile.txt 형식으로 작성하고, 내용을 입력 시킨 후에 저장
-WEB-INF 폴더는 유저의 직접 접근이 어렵워 보안성이 높다.
-web 폴더에 있을 경우 바로 파일을 확인가능
-알아보는 점들
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
@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

이런식으로 오류난다.

공유 범위의 생명주기를 생각해서 사용해야한다!
@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를 사용하면, 언제 초기화되고 제거 되었는지를 쉽게 알 수 있다.

리스너 생성시 어느영역에서 모니터링은 어떤걸 하고싶은지 체크.
-알아본 점
@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
끝..!?..