JSP 기초 문법 - page 디렉티브 (2)
JSP 기초 문법 - page 디렉티브
page 디렉티브는 JSP 페이지에 대한 정보를 입력하기 위해서 사용된다. page 디렉티브를 사용하면 JSP페이지가 어떤 문서를 생성하는지, 어떤 자바 클래스를 사용하는지, 세션(session)에 참여하는지, 출력 버퍼의 존재 여부와 같이 JSP 페이지를 실행하는 데 필요한 정보를 입력할 수 있다.
import 속성
자바는 클래스의 완전한 이름 대신 단순 이름을 사용하기 위해 import구문을 사용한다. 이와 유사하게 JSP는 page 디렉티브의 import 속성을 사용해서 JSP 코드에서 클래스의 단순 이름을 사용할 수 있다.
<%@ page import = "java.util.Calendar" %>
<%@ page import = "java.util.Date" %>
<%@ page import = "java.util.Calendar, java.util.Date" %>
<%@ page import = "java.util.*" %>
import 속성 값으로 여러 타입을 지정할 때는 콤마로 구분해줘야 한다. 패키지 이름 뒤에 별표('*')를 사용하면 해당 패키지에 속해 있는 모든 타입을 단순 이름으로 사용할 수 있다.
<!-- import 속성을 사용하지 않았을 때 -->
<% java.util.Calendar cal = java.util.Calendar.getInstance(); %>
<!-- import 속성을 사용했을 때-->
<%@ page import = "java.util.*" %>
<% Calendar cal= Calendar.getInstance(); %>
import속성을 사용하지 않으면 완전한 클래스 이름을 사용해야 하므로 번거롭기 때문에 import 속성을 사용하는 것이 좋다.
trimDirectiveWhitespaces 속성을 이용한 공백 처리
jsp파일을 실행한 뒤 웹 브라우저에서 소스 보기를 해보면 첫 줄에 빈 줄이 생성된다. 해당 공백은 page 디렉티브가 있던 위치에서 만들어 진다. JSP2.0 버전까지는 디렉티브나 스크립트 코드로 인해서 만들어진 줄바꿈 공백 문자를 제거하는 기능이 없었는데, 이 기능이 JSP 2.1 버전부터 새롭게 추가되었다.
trimDirectiveWhitespaces 속성을 사용하면 불필요하게 생성되는 줄바꿈 공백 문자를 제거할 수 있다. (default = false)
<%@ page contentType="text/html; charset=utf-8" %>
<%@ page trimDirectiveWhitespaces="true" %>
JSP 페이지의 인코딩과 pageEncoding 속성
캐릭터 셋을 잘못 지정하면 응답 결과의 글자가 올바르게 출력되지 않는 것을 확인할 수 있다. 톰캣과 같은 컨테이너는 JSP코드를 분석하는 과정에서 어떤 인코딩을 이용해서 코드를 작성했는지 검사하며, 그 결과로 선택한 캐릭터 셋을 이용해서 JSP페이지의 문자를 읽어오게 된다.
웹 컨테이너가 JSP 페이지를 읽어올 때 사용할 캐릭터 셋을 결정하는 기본 과정은 다음과 같다.
1. 파일이 BOM을 시작하지 않을 경우,
기본 인코딩을 이용해서 파일을 처음부터 읽고, page 디렉티브의 pageEncoding 속성을 검색한다. (ASCII 문자 이외의 글자가 포함되어 있지 않은경우에만 적용.) pageEncoding 속성이 값을 갖고 있다면, 파일을 읽어올 때 속성값을 캐릭터 셋으로 사용한다. pageEncoding 속성이 없다면, contentType 속성을 검색해 contentType의 charset에 지정한 값을 사용한다. 모두 해당하지 않을 경우 ISO-8859-1을 캐릭터 셋으로 사용한다.
2. 파일이 BOM으로 시작할 경우,
BOM을 이용해서 결정된 인코딩을 이용해 파일을 읽고, page 디렉티브의 pageEncoding 속성을 검색한다. 만약 pageEncoding 속성의 값과 BOM을 이용해서 결정된 인코딩이 다르면 에러를 발생시킨다.
JSP 파일을 읽을 때는 page 디렉티브의 pageEncoding속성과 contentType 속성을 사용해 캐릭터 인코딩을 결정한다.
*BOM(Byte Order Mark) : 유니코드 인코딩에서 바이트의 순서가 Little Endian 인지 Big Endian 인지의 여부를 알려주는 16비트 값이다.
pageEncoding 속성에 지정한 인코딩과 contentType속성에 지정한 인코딩이 서로 다를 수도 있다.
<%@ page contentType="text/html; charset=euc-kr" %>
<%@ page pageEncoding="utf-8" %>
위와 같이 작성하면 JSP 파일은 UTF-8로 작성하고 응답 결과는 EUC-KR로 생성된다.