<%@ ... %>
JSP 지시어는 위와 같은 형식으로 표현되며 JSP 파일 내에서 JSP를 실행할 컨테이너에서 해당 페이지를 어떻게 처리할 것인가에 대한 설정 정보들을 지정해주는데 사용된다.
지시어의 종류는 다음과 같다.
- page지시어
- include 지시어
- taglib지시어
📌page 지시어
<%@ page 속성1="값1" 속성2="값2" 속성3="값3" ... %>
page속성에는 스크립트 언어, import할 패키지/클래스, 세션 사용 여부, 에러 페이지 등 다음 표와 같이 12개의 설정 정보를 지정해 사용할 수 있다. 각각의 속성을 하나의 page 지시어에 한 번에 지정할 수도 있으며 여러 개의 page 지시어에 나누어 지정할 수도 있다. 그러나 import 속성을 제외한 나머지 속성은 하나의 페이지에서 오직 한 번씩만 지정할 수 있다.
language 속성
<%@ page language="java" %>
JSP 파일 내에서 사용될 스크립트 언어를 지정하는 속성이다. 특별히 지정하지 않을 경우 JSP 컨테이너가 지원하는 기본 언어인 Java가 language 기본 속성으로 지정된다. include 지시어를 사용할 경우 include될 페이지의 language 속성과 include할 페이지의 language 속성은 반드시 동일해야 한다.
extends 속성
<%@ page extends="javax.servlet.jsp.HttpJspBase" %>
Jsp파일은 JSP컨테이너에서 실행되기 위해서는 파싱 과정을 거쳐 서블릿으로 변환되어야 한다. 이 때 서블릿 클래스로 변환되는 과정에서 상속할 부모 클래스를 지정하는 속성이 extends 속성이다. 기본적으로 이러한 상속은 JSP 컨테이너에서 자체적으로 알아서 처리하기 때문에 개발자가 특별히 지정하는 경우는 거의 없다. 또한 자바는 다중 상속을 허용하지 않기 때문에 사용자가 지정하는 경우 아무 클라스나 상속받아서는 안되고 반드시 기본적으로 JSP 컨테이너에서 상속받게 되는 클래스인 javax.servlet.jspHttpJspPage 도는 javax.servlet.jsp.JspBase 인터페이스를 구현한 클래스를 상속받아야 한다.
import 속성
<%@ page import="java.io.*, java.util.ArrayList" %>
Java에서 사용하는 import 구문과 같은 의미를 가지고 있는 속성으로 JSP페이지 내에서 사용할 패키지 또는 클래스를 import하는데 사용된다. 쉼표를 이용하여 여러 개의 패키지 또는 클래스를 한 번에 import하여 사용할 수 있다.
물론 따로따로 import하여 사용도 가능하다.
session 속성
<%@ page session="true" %>
HTTP 프로토콜은 클라이언트로부터 요청이 들어오면 새로운 커넥션을 생성하여 요청에 대한 응답을 회신한 후 그 커넥션을 끊는다. 이러한 특성을 Stateless 특성이라고 하며 HTTP 프로토콜의 가장 큰 특성이다. Stateless 특성으로 인해 커넥션을 매번 새로 생성하기 때문에 동일한 클라이언트에 대해 정보를 유지할 필요가 있는 경우 다른 클라이언트와 현재 정보가 유지되어야 할 클라이언트를 구별할 특별한 방법이 사용된다. 이러한 방법을 세션 관리라 하며 세션 관리에 의해 클라이언트의 정보가 유지되도록 만들어진 가상의 커넥션을 HTTP 세션이라고 한다. JSP 내에서 이러한 세션을 사용할 수 있도록 하는 설정이 바로 session 속성이다.
buffer 속성
<%@ page buffer="16kb" %>
JSP 페이지가 서블릿으로 변환되어 응답을 생성해 클라이언트에 전송할 때 사용되는 버퍼의 크기를 지정하는 속성이다. 기본적으로 "8kb"로 설정되어 있으며 만일 "none"으로 설정할 경우 응답을 생성할 때 버퍼를 사용하지 않고 바로 클라이언트에 응답을 전송한다.
autoFlush 속성
<%@ page autoFlush="true" %>
autoFlush 속성은 buffer 속성에서 지정한 버퍼가 다 채워졌을 경우 이를 어떻게 처리할 것인지 JSP 컨테이너에게 알려주는 속성이다. 기본값은 'true'로, 버퍼가 다 채워지면 클라이언트에 전송하고 버퍼를 비운다. autoFlush 속성을 'false'로 지정하면 버퍼가 다 채워졌을 경우에는 버퍼를 전송하는 것이 아니라 Exception을 발생시킨다. 만약 buffer속성을 'none'으로 지정했을 경우 autoFlush 속성을 'false'로 지정하는 것은 불가능 하다.
isThreadSafe 속성
<%@ page isThreadSafe="true" %>
JSP는 기본적으로 다중 스레드 기반으로 실행된다. 즉 JSP 파일이 JSP컨테이너에 의해 파싱되어 서블릿 인스턴스가 생성되고 사용자의 요청 각각에 대한 스레드가 하나씩 생성되어 그 스레드가 사용자의 요청을 처리하는 방식이다. 하지만 만일 다중 스레드에 의해 한 데이터에 대한 동시 접근이 이루어지면 그 데이터의 값이 의도되지 않은 값으로 변경될 가능성이 있을 경우 다중 스레드에 의한 동시 접근을 차단할 필요가 있다. 이러한 경우 isThreadSafe 속성을 "true"로 지정하면 JSP 파일이 실행되더라도 하나의 스레드에 의한 service() 메서드 실행이 완전히 끝날 대 까지 다른 스레드는 기다리게 된다. 따라서 해당 페이지에 의해 공유되는 데이터에 대한 사용자의 동시 접근을 막을 수 있게 된다. 기본적으로 다중 스레드의 동시 실행을 허용하지 않고 순서대로 요청을 처리하려면 위 예시 같이 설정하면 된다.
info 속성
<%@ page info="이 페이지는 이클리스로 만들어진 페이지입니다." %>
해당 페이지 전체에 대한 주석의 역할을 하는 속성으로 개발자가 해당 페이지의 기능이나 특성을 설명해 놓을 때 활용된다.
errorPage 속성
<%@ page errorPage="error/error.jsp" %>
errorPage 속성은 JSP 페이지를 처리하는 과정에서 예외가 발생했을 때 해당 페이지에서 직접 처리하지 않고 에러 페이지를 지정해 지정된 에러 페이지에서 예외를 처리하도록 할 때 사용하는 속성이다. 에러 페이지를 지정할 때는 같은 컨텍스트 루트 내의 JSP 파일을 직접 지정하여 사용한다.
에러 페이지를 지정한다고 해도 모든 예외가 반드시 에러 페이지에서 처리되는 것은 아니다. 이는 buffer 속성과 연관이 있는데 만일 buffer 속성이 "none"으로 지정되어 있다면 응답이 즉시 전송되기 때문에 예외가 발생하더라도 JSP 컨테이너에서 에러 페이지로 제어권을 넘겨줄 수 없다. 또한 buffer 속성에 특정 값이 지정되어 있고 autoFlush가 "true"로 지정되어 있을 경우 만일 버퍼가 다 채워져서 클라이언트로 응답이 전송된 이후에는 마찬가지로 예외가 발생하더라도 JSP 컨테이너가 제어권을 에러 페이지로 넘겨줄 수 없기 때문에 에러 페이지를 사용할 수 없게 된다.
contentType 속성
<%@ page contentType="text/html" %>
contentType 속성은 JSP 페이지가 전송할 응답의 형태가 어떠한 MIME 형식으로 되어 있는지를 지정하는 속성이다. MIME(Multipurpose Internet Mail Extension)란 인터넷을 통해 문제를 주고 받을 때 사용되는 문서 형식을 정의해 놓은 것으로 단순한 아스키 파일뿐 아니라 이미지, 비디오, 오디오 등 멀티미디어 형식의 문서도 원활히 주고 받을 수 있도록 text/html, image/git, video/avi 등 여러 가지 타입을 제공한다. contentType의 속성 값을 지정할 때는 위 예시처럼 "type/subtype"의 형식으로 앞에 대분류를 지정하고 "/"뒤에 그 대분류의 하위에 있는 소분류를 지정한다.
또한 문자셋의 인코딩 방식을 ";charset:"을 사용해 추가할 수 있다.
<%@ page contentType="text/html; charset=euc-kr" %>
isErrorPage 속성
<%@ page isErrorPage="true" %>
isErrorPage 속성은 현재 페이지가 다른 페이지에서 발생한 예외를 처리할 페이지일 때 지정하는 속성이다. 기본값은 "false"이고 특정 JSP 페이지의 예외를 처리할 JSP에러 페이지를 만들었다면 다음처럼 그 에러 페이지의 isErrorPage 속성을 "true"로 지정하여 사용한다. isErrorPage 속성 값을 true로 설정하면 에러가 발생한 페이지에서 전달된 exeception 객체를 사용할 수 있다.
pageEncoding 속성
<%@ page pageEncoding="euc-kr" %>
JSP 페이지의 문자셋 인코딩 방식을 지정할 때 사용하는 속성이다. 기본값은 "ISO-8859-1"로 이는 북유럽의 문자셋 인코딩 방식이므로 한글을 처리할 수가 없다.
📌include 지시어
include 지시어는 특정한 JSP 파일 또는 HTML 파일을 해당 JSP 페이지에 삽입할 수 있도록 하는 기능을 제공하는 지시어이다. 여러 JSP 페이지에서 공통되는 부분이 많을 때 이러한 공통되는 부분을 따로 파일로 만들어 include 지시어로 삽입하면 매번 같은 내용을 입력하지 않고도 간단하게 공통되는 부분을 포함시킬 수 있다.
예시)
<%@ include file="header.jsp"%>
<%@ include file="footer.jsp" %>
이 때 include 되는 파일들은 실제 컴파일 과정을 거쳐서 그 결과가 해당 JSP 페이지에 포함되는 것이 아니라 JSP 소스 코드 자체가 해당 JSP 페이지에 복사되어 더해지므로 서블릿 컴파일 과정은 include되는 파일의 개수가 아무리 많다고 하더라도 단 한 번만 이루어지게 된다. 또한 include 지시어는 중첩 사용이 가능하기 때문에 include되는 파일 안에서 또 다른 파일을 include하여도 문제없이 동작한다.
📌taglib 지시어
taglib 지시어는 JSTL이나 커스텀 태그 등 태그 라이브러리를 JSP에서 사용할 때 접두사를 지정하기 위해 사용된다.
taglib 지시어는 uri 속성과 prefix 속성의 두 가지 속성으로 이루어지는데 uri 속성은 태그 라이브러리에서 정의한 태그와 속성 정보를 저장한 TLD(Tag Library Descriptor) 파일이 존재하는 위치를 지정하고, prefix 속성에는 사용할 커스텀 태그의 네임스페이스를 지정한다.
<%@ taglib uri="http://taglibi.com/sampleURI" prefix="samplePrefix" %>
이런 형식으로 taglib 지시어를 사용해 커스텀 태그를 지정하면 해당 uri에 존재하는 TLD파일에 정의된 태그들을 prefix로 지정한 네임 스페이스를 통해 다음과 같이 사용할 수 있다.
<samplePrefix: table col="2" reow"2" border="1">
태그 라이브러리를 이용한 테이블입니다.
</samplePrefix: table>
JSP 페이지를 개발할 때 taglib 지시어를 사용해 커스텀 태그를 활용하면 코드의 길이가 줄어들고 인식성이 좋아지는 등 다양한 이점이 있다. 나중에 JSTL에 대한 설명도 하도록 하겠다.
'JSP & Servlet > 개념' 카테고리의 다른 글
[JSP & Servlet] JSP 내장 객체 (0) | 2022.03.28 |
---|---|
[JSP] JSP 스크립트 요소 (선언문, 스크립틀릿, 표현식) (0) | 2022.03.28 |
[JSP] JSP 주석 (0) | 2022.03.28 |
forward와 redirect 방식 (0) | 2022.03.28 |
Server Tomcat v8.5 Server at localhost failed to start. Error (0) | 2022.03.25 |