레이블이 배포인 게시물을 표시합니다. 모든 게시물 표시
레이블이 배포인 게시물을 표시합니다. 모든 게시물 표시

2013년 9월 10일 화요일

[Head First]Servlets & JSP 내용정리-11장

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> 타입

  1. 정확하게 이름까지 일치 하는 것 : <url-pattern>/Beer/SelectBeer.do</url-pattern>
  2. 디렉토리까지만 일치하는 것 : <url-pattern>/Beer/*</url-pattern>
  3. 확장자만 일치하는 것 : <url-pattern>*.do</url-pattern>

서블릿 맵핑의 핵심

  1. 제일 먼저 정확히 이름이 일치하는 것을 찾음
  2. 다음으로 디렉토리가 일치하는 것을 찾음.
  3. 마지막으로 확장자가 일치하는 것을 찾음.
  4. 둘이상의 디렉토리가 일치할 때는 항상 많이 일치하는 것을 선택함.

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 아래에 있어야 합니다.