Chapter.11 웹 애플리케이션 배포
배포 파일 및 디렉토리 구조
WAR 파일
- 전체 웹 어플리케이션 디렉토리를 jar로 압축하여(** 웹 애플리케이션 컨텍스트 디렉토리가 아닌 WEB-INF 바로 위에서 압축)
- 톰켓의 경우 WAR파일 이름이 웹 어플리케이션 이름
- META-INF/MANIFEST.MF 파일에 라이브러리 의존성을 작성하면, 배포 시 필요한 라이브러리를 확인 할 수있다.
정적인 컨텐츠 및 JSP를 브라우저에서 직접 접근 하려면..
- 직접 접근 이란 - 브라우저 주소창에 자원에 대한 경로를 표기하여 요청하면, 서버가 이 파일을 넘겨준다는 뜻
- 직접 접근을 막기 위해서 : WEB-INF 밑에 두던가 WAR의 경우에는 META-INF 아래에 두면 됨.(forward난 include를 통해서 접근 할 수 있다.)
- 파일 자원 접근
- WEB-INF/lib의 jar 일때 : 클래스 로더의 getResource() 나 getResourceAsStream() 사용
- JAR파일로 배포하지 않은 웹 애플리케이션 내부 자원 : ServeltContext API. getResource() 나 getResourceAsStream()
컨테이너가 클래스 찾는 순서
WEB-INF/classes -> WEB-INF/lib 순으로 찾는다.
서블릿 맵핑시 가상(논리적인) 디렉토리 구조를 사용할 수 있다.
http://www.huni.com/AdviceApp/Beer/BeerSelect.do
---------- -------------------------
1) 2)
1) web application context root
2) dd 상에만 존재하는 가상 디렉토리 Beer
|
3가지 <url-pattern> 타입
- 정확하게 이름까지 일치 하는 것 : <url-pattern>/Beer/SelectBeer.do</url-pattern>
- 디렉토리까지만 일치하는 것 : <url-pattern>/Beer/*</url-pattern>
- 확장자만 일치하는 것 : <url-pattern>*.do</url-pattern>
서블릿 맵핑의 핵심
- 제일 먼저 정확히 이름이 일치하는 것을 찾음
- 다음으로 디렉토리가 일치하는 것을 찾음.
- 마지막으로 확장자가 일치하는 것을 찾음.
- 둘이상의 디렉토리가 일치할 때는 항상 많이 일치하는 것을 선택함.
DD에 환영 파일(디폴트 페이지) 설정하기
- 전체 사이트 디폴트 웝페이지를 설정 가능 (conf/web.xml)
- 개별 윕 애플리케이션의 디폴트 웹 페이지 설정
- 선택 기준은 항목 리스트에 제일 먼저 일치하는 파일을 찾는다.
<web-app ..>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
|
DD에 오류 페이지 설정하기
예외사항별로 오류 페이지 정의하기
<error-page>
<exception-type>java.lang.ArithmethicException</exception-type>
<location>/arithmeticeError.jsp</location>
</error-page>
HTTP 상태 코드별로 오류 페이지 정의하기
<error-page>
<error-code>404</error-code>
<location>/arithmeticeError.jsp</location>
</error-page>
|
프로그램적으로 오류 코드 발생 시키는 예제
response.sendError(HttpServletResponse.SC_FORBIDDEN); 혹은 response.sendError(403);
DD에서 강제로 서블릿 초기화하기
- <load-on-startup> 값을 0 보다 큰 값을 설정하면 컨테이너는 애플리케이션이 배포되는 시점에 서블릿을 초기화합니다. 값이 가장 작은 값 부터 먼저 로딩 함.
- ** 값이 동일하면 먼저 설정된 것 부터 로딩합니다.
<servlet>
<servlet-name>KathyOne</servlet-name>
<servlet-class>foo.DeployTestOne</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
|
XML에 부합하는 JSP 만들기 : JSP 문서
항목
|
일반 JSP 페이지 문법
|
JSP 문서 문법
|
지시자
(taglib제외)
|
<%@ page import=”java.util.*” %>
|
<jsp:directive.page import=”java.util.*” />
|
선언문
|
<%! int y = 3; %>
|
<jsp:declaration>
int y = 3;
</jsp:declaration>
|
스크립틀릿
|
<% list.add(“Fred”); %>
|
<jsp:scriptlet>
list.add(“Fred”);
</jsp:scriptlet>
|
텍스트
|
There is no tags
|
<jsp:text>
There is no tags
</jsp:text
|
스크립팅
표현식
|
<%= it.next() %>
|
<jsp:expression>
it.next()
</jsp:expression>
|
EJB 관련 태그들
지역(로컬) 빈에 대한 참조
<ejb-local-ref>
<ejb-ref-name>ejb/Customer</ejb-ref-name> --> JNDI 로 검색
<ejb-ref-type>Entity</ejb-ref-type>
<local-home>com.wickedlysmart.CustomerHome</local-home>
<local>com.wickedlysmart.Customer</local>
</ejb-local-ref>
|
원격(리모트) 빈에 대한 참조
<ejb-ref>
<ejb-ref-name>ejb/Customer<ejb-ref-name> --> JNDI 로 검색
<ejb-ref-type>Entity<ejb-ref-type>
<home>com.wickedlysmart.CustomerHome</home>
<remote>com.wickedlysmart.Customer/<remote>
</ejb-ref>
|
** 관련 태크는 리모트가 먼저 생겼으면 지역빈 나중에 생겨서 이름위 같이 되었음.
JDNI <env-entry> DD 태크
<env-entry>
<env-entry-name>rates/discountRate</env-entry-name>
<env-entry-type>java.lang.Integer</env-entry-type>
<env-entry-value>10</env-entry-value>
</env-entry>
|
<mime-mapping> DD 태그
<mime-mapping>
<extension>mpg</extension> : 확장자
<mime-type>video/mpeg</mime-type> : MIME 타입
</mime-mapping>
|
어디로 가야 하나
자원 유형
|
배포 위치
|
배포 서술자
|
WEB-INF 바로 밑에(WEB-INF는 웹 애플리케이션 루트 바로 밑에 있음)
|
태그 파일
|
JAR 배포가 아닌 경우에는 WEB-INF/tags 혹은 WEB-INF/tags 하위 디렉토리로 배포
JAR 파일 배포 한다면, META-INF/tags 또는 META-INF/tags 하위 디렉토리로 배포 해야 함.
** 태그 파일을 JAR로 배포 하는 경우 JAR안에 TLD 파일이 들어 이어야 합니다.
|
HTML과 JSPs
(직접 접근 가능)
|
클라이언트가 접근할 수 있도록 HTML과 JSP를 배포하려면, WEB-INF와 WEB-INF 하위 디렉토리를 제외하고는 웹 어플리케이션 루트 밑이라면 어디라도 좋음. WAR파일로 배포 할때도 META-INF와 그 하위 디렉토리만 제외하고는 배포 가능 합니다.
|
HTML과 JSPs
(직접 접근 불가)
|
WEB-INF 하위 (WAR 배포시는 META-INF)
|
TLDs
(.tld)
|
JAR 배포가 아니라면 , TLD는 WEB-INF 또는 WEB-INF 하위 디렉토리로 배포
JAR 파일로 배포 한다면 TLD는 META-INF 또는 META-INF 하위 디렉토리로 배포 해야 합니다.
|
서블릿 클래스
|
서블릿 클래스는 WEB-INF/classes 디렉토리 밑에 패키지 구조가 그대로 디렉토리 구조로 바뀌어 들어가면 됨.
JAR 파일로 배포 한다면 패키지 디렉토리 구조를 JAR 파일로 만든 다음 WEB-INF/lib 아래에 배포 하면 됩니다. |
태그 핸들러 클래스
|
서블릿 클래스 규칙과 동일함.
|
JAR 파일
|
JAR파일은 WEB-INF/lib 아래에 있어야 합니다.
|