20/08/31 웹 프로그래밍 기초 (절대경로 상대경로, 서블릿 콜백, java with resource)
자원의 종류
1. 파일시스템 리소스
2. 클래스패스 리소스
웹 리소스
URI: Uniform Resource Identifier 에 속하는 것들
URL (Uniform Resource Locator) - 이 방법만 쓴다
URN (Uniform Resource Naming)
URC (Uniform Resource Contents)
-------> naming, contents의 경우 유일성 확보가 어렵다.
절대 경로 vs. 상대 경로
1. 절대경로: root부터 depth 구조 상의 모든 경로를 표기
Client side: 반드시 context root부터 시작. localhost에서 시작할 경우, 배포 후 localhost가 도메인으로 바뀔 수도 있기 때문
Server side: 파일이 이미 서버 안에 있으니까 context root를 제외하고 그 이후 경로를 표기. !!서블렛에선 반드시 절대경로!!
2. 상대경로: 브라우저의 현재위치를 시작점으로 잡는다.
<img src = "<%=request.getContextPath()%>/images/cute1.png" />
** 경로 쓸땐 가장 먼저 해당 코드가 어디서 쓰이는지 고민해야함.
만약 html이면 클라이언트 사이드겠져?
서버에서는 컨텍스트 무조건 쓰지마
서블릿: 자바 기반의 서버 사이드 웹 어플리케이션 모듈을 구현하기 위한 스펙
1. 개발 단계
1) HttpServlet의 구현체 (=extends HttpServlet) 작성
2) compile, 현재 컨텍스트의 classpath에 배포
3) WAS에 서블렛을 등록
- web.xml : servlet 먼저 쓰고-> servlet name, servlet-class, init-param, load-on-startup
- @webServlet
4) 매핑: 클라이언트가 브라우저라는 에이전트를 통해 주소체계를 이용해 요청할 때, 해당 서블릿이 동작할 수 있는 Command URI 결정
- web.xml : servlet mapping 먼저 쓰고 -> servlet names, url-patterns
- @webServlet
5) WAS 재구동
2. W.A.S의 역할
: Server, WAS(Web Application Server) app = context.
was가 제공하는건 앱이자 컨텍스트, Container(=web container/ servlet container)
!!컨테이너란? 내부 컴포넌트의 life cycle을 관리하는 관리자
( e.g. javaFX- 에서 뭐 만들려면 버튼->페인->...페인 죽으면 버튼도 죽는다)
이 라이프사이클 내에서 컨테이너인 톰캣이 무슨 역할을 하는가?
lifecycle callback:
lifecycle 내에서 각 시점별로 호출할수있는 callback 메서드가 서블릿 스펙에 정의되어있다.
1) 초기화 - 아무런 설정(load-on-startup)이 없는 한, 해당 서블릿에 대한 최초의 요청이 발생하면 초기화 진행(톰캣이 서블릿객체를 생성.)
2) 소멸 - 아무런 설정이 없는 한, 서버는 서블릿을 싱글톤의 형태로 관리
=> 즉, 기본 설정에서는 서블릿에 요청이 발생해야 객체가 만들어지고 그 객체는 1개(싱글톤)다.
request callback:
service: 모든 request method에 공통적으로 적용될 코드를 정의
doXXX: 특정 request method에 대해서만 적용할 코드를 정의
String initName = config.getInitParameter("initName");
String filePath = getClass().getResource(initName).getFile();
----이렇게 servlet 안에서 init()을 하면 web.xml에서 init-param한 parameter를 getInitParmeter("")을 함으로써 불러올 수 있다.
<init-param>
init()을 호출할때 서블릿 컨테이너가 서블릿에 전달하는 데이터
<load-on-startup>
서버 시작과 동시에 그 서블랫 객체 생성됨 (서버 시작하자마자 init() 실행) (요청 없어도 미리 생성해두는 것) (안의 숫자는 객체를 만들어놓을 순서
+ service는 요청이 들어왔을 때 doGet()이나 doPost()를 실행해주기 위함. 만약 Get이던 Post던 똑같은 거 하고싶다! 그러면 아예 다 service()에 적으면 됨.
+doGet(), doPost()의 경우 super생성자를 무조건 지워줘야함.
객체 소멸시키기
try with resource구문 (자바 1.7부터 사용)
try(
FileInputStream fis = new FileInputStream(imageFile);
OutputStream os = resp.getOutputStream();
){
//예외발생할만한 코드 적기
}
=> try(Closable 가능 객체의 생성 및 코드 작성) {
}
이렇게 하면 try(){}블럭이 끝날 때 자동으로 해당 객체가 close()된다.
kr.or.ddit.utils;kr.or.ddit.utils;