2.11. JSP 기본문법, 작동원리
JSP란
Java Server Pages(JSP)는 다이나믹한 웹 페이지를 쉽게 만들 수 있는 방법을 제공하며 웹 애플리케이션을 만드는 작업을 간단하게 처리할 수 있도록 해 주는 Server Side Script입니다.
JSP는 기존의 단순한 html을 서비스하던 웹서버의 기능을 보다 발전시켜 웹 기반의 프로그램을 할 수 있도록 만든 것입니다. 그리고 서블릿을 기반으로 하고 있으며 서블릿의 프로그램적인 요소를 발전시켜 사용자가 보다 쉽게 다룰 수 있도록 만든 스크립트 기반의 프로그램입니다.
JSP 와 Servlet의 차이점
1. Servlet
- 동적 웹 구현 기술
- CGI를 자바에서 구현한 서버 전용 프로그램 모듈.
- 서버에서 실행되는 프로그램
- 서버페이지를 스크립트 레벨에서 프로그램한다.
- 스크립트로 작성된 JSP는 .class로 컴파일되고 이는 Servlet Container에 적재되어 서비스 된다.
- 서비스를 요청할 때 서블릿은 인프로세스방식으로 서비스된다.
- Servlet이 프로그램 레벨에서 서비스를 처리한다면, JSP는 스크립트 레벨에서 서비스을 처리한다.
JSP 실행 원리
JSP와 Servlet 내부 주기 비교
jsp변환 서블릿 프로그램은 jspInit(), _jspService(), jspDestroy()세가지 메서드에 의해서 초기화, 서비스, 파괴의 과정을 거친다고 위에서 언급했습니다.
아래의 그림과 같이 jspInit 메서드를 단 한번 호출한 후 _jspService 메서드를 서비스 요청이 있을 때마다 호출하게 됩니다.
JSP 실행 루틴
1. Webserver나 Servlet 엔진에서 클라이언트의 요청을 받게 됩니다.
2. JSP Handler 즉, JSP Container Process라고 불리우는 루틴을 거치게 되면서 Servlet 객체존재여부와 파일변경여부를 확인하게 됩니다.
3. 변경되었다면 새로 source파일을 생성하고 그리고 compile과정을 거쳐 실행하게 되고 그리고 이미 로딩되어 있는데 변경처리되지 않았다면 기존에 존재하는 것을 이용하게 됩니다.
4. 로딩을 하지않았다면 처음부터 로딩을 시작하여 source파일을 만들고 compile과정을 거쳐 새로 실행합니다.
5. 다른 서블릿들도 Servlet Container에 적재하는 과정을 반복하게 됩니다.
기본문법
page 지스문
page지시문은 JSP페이지의 속성을 지정하는데 사용됩니다. page지시문의 속성을 지정하는 방식은 다음과 같습니다.
<%@page attribute1= "value1" attribute2= "value2" attribute3= "value3" ... %>
속성명 | 설명 | Default 설정 값 | 사용빈도 |
---|---|---|---|
language | 스크립트 내에 언어명 | language="java" | 거의사용하지않음 |
contentType | 페이지의 MIME Type지정 | "text/html;charset=ISO-8859-1" | 매우높음 |
pageEncoding | 현재JSP페이지에 대한 문자집합 지정 | pageEncoding="UTF-8" | 거의사용하지않음 |
info | 텍스트 | 없음 | 중간 |
extends | class | 없음 | 거의사용하지 않음 |
import | class,package import | 없음 | 높음 |
session | 세션의 사용여부 결정 | session = "true" | 중간 |
buffer | 버퍼의 크기 결정 | buffer="8kb" | 중간 |
autoFlush | 자동 flush기능 | autoFlush = "true" | 중간 |
isThreadSafe | SingleThreadModel Interface 구현여부 결정 | isThreadSafe ="true" | 거의사용하지않음 |
errorPage | 에러 페이지 지정 | 없음 | 중간 |
isErrorPage | 에러 페이지 사용여부 결정 | isErrorPage = "false" | 중간 |
사용법
languageJSP페이지의 프로그래밍 언어를 지정합니다. 기본값은 java이며 현재 쓰일 수 있는 유일한 값도 java입니다. JSP에서는 현재 스크립팅 언어로 java외의 언어가 쓰이는 일이 없기 때문입니다.
<%@page language = "java" >
contentType
클라이언트에게 응답할 문서의 MIME타입을 지정합니다. 그 형식을 보면 type에는 응답할 타입을 지정하고 추가로 인코딩 방식이 필요할 때에는 charset이란 속성을 써 주면 됩니다.
<% page contentType = "text/html; charset = euc-kr">
text/html이외에 서블릿의 기본 타입인 text/plain 그리고 이미지를 위한 image/gif등의 타입도 있습니다.
pageEncoding
contentType 속성에서 utf-8 인코딩 방법을 지정합니다.
<% page contentType = "text/html; charset = utf-8" pageEncoding="utf-8">
한글이 사용되는 JSP 페이지 내에서 contentType은 명확하게 "text/html;charset=utf-8"으로 지정하고 pageEncoding 속성은 생략합니다.
extends
JSP페이지 요청시 생성되는 서블릿의 부모클래스를 지정하는데 쓰입니다. 하지만 서블릿 컨테이너는 컨테이너 개발사에서 이미 만들어진 최적의 부모 클래스를 사용하여 동적으로 서블릿을 생성하는 경우가 대부분입니다. 따라서 사용빈도가 거의 없는 속성이라고 볼 수 있습니다.
<%@page extends = "father.class" %>
info
해당 페이지에 대한 설명을 지정할 때 쓰이는 속성으로 이것을 지정하면 나중에 getServerInfo() 메서드로 지정한 정보를 알아볼 수 있습니다.
<%@ page info = "소설JSP info페이지" %>
import
JSP가 요청되어 변환된 서블릿이 import할 클래스를 지정합니다. 즉, 서블릿이 기본적으로 import하는 java.lang.*, javax.servlet.*, javax.servlet.jsp.*, javax.servlet.http.*외에 필요한 패키지가 있을 경우 import로 지정해서 사용을 해야 합니다.
사용 형식은 다음과 같습니다.
<%@page import = "java.util.*" %> <%@page import = "chap4.*, chap5.*" %>
사용자가 로그인을 한 이후 계속적으로 로그인이 되어있는지에 관한 정보, 쇼핑몰에서 장바구니에 담긴 아이템의 정보 등을 저장해 놓을 때 세션을 활용
session
페이지가 HttpSession을 사용할지 여부를 지정합니다. 속성은 true와 false로 나뉘어져, true일 경우에는 세션이 이미 존재할 경우 그 세션을 유지하고 존재하지 않을 경우는 새로운 세션을 생성하여 연결되지만, false일 경우에는 세션이 연결되지 않습니다. 기본값은 true 입니다.
<%@page session = "true" %> <%@page session = "false" %>
buffer
클라이언트로의 전송을 담당하는 out객체(JspWirter out)의 버퍼 크기를 설정합니다. 버퍼를 설정하면 지정된 버퍼 크기만큼의 데이터 단위로 클라이언트에 전송됩니다. 즉 버퍼의 크기가 30kb이라면 버퍼는 30kb의 데이터를 채우기 전까지는 클라이언트에게 전송하지 않고 30kb가 되는 순간 또는 30kb가 안되더라도, 페이지 처리가 완료되는 순간 클라이언트로 전송하게 되는 것입니다.
<%@page buffer = "30kb" %> <%@page buffer = "none" %>
위에서 none으로 한 경우는 버퍼를 사용하지 않는다는 것을 의미합니다.
out 객체의 기본 버퍼 크기는 8Kbyte입니다.
autoflush
출력버퍼가 꽉 찼을 때 이를 제어할 방법을 지정합니다. true로 지정할 경우 출력버퍼를 클라이언트로 보내주고 내용을 비우며, false로 할 경우 버퍼를 비우지 않고 예외를 발생시킵니다. 위에서 buffer의 크기를 none으로 지정했다면 autoflush 속성을 true로 지정할 수 없습니다. 기본값은 true입니다.
<%@page autoflush = "true" %> <%@page autoflush = "false" %>
isThreadSafe
JSP에서 생성된 서블릿이 SingleThreadModel Interface를 구현하는지의 여부를 지정합니다. SingleThreadModel은 4장에서 이미 살펴보았던 것으로, 서블릿에서 스레드로 자원에 접근할 때 공유로 인한 문제점이 있을 경우 한번에 하나의 스레드만 자원에 접근하도록 해 주는 표시(marker)인터페이스 입니다. 기본값은 true로 되어 있으며 SingleThreadModel을 구현하려면 값을 false로 지정해야 합니다.
<%@page isThreadSafe = "true" %> <%@page isThreadSafe = "false" %>
errorPage
페이지에서 어떠한 예외상황이 발생할 경우 그 에러를 처리할 페이지를 지정합니다. 이렇게 지정된 페이지로 exception객체가 에러를 가지고 넘어갑니다.
<%@page errorPage= "errManage.jsp" %>
isErrorPage
페이지가 다른 페이지의 에러처리 페이지가 될 것인가의 여부를 지정합니다. 즉, 위에서 errorPage속성으로 exception을 넘겼을 때 그것을 받아서 처리할 것인가의 여부를 결정하는 것입니다. 기본값은 false입니다.
<%@page isErrorPage= "true" %> <%@page isErrorPage= "false" %>
include지시문
include지시문은 말 그대로 지정한 파일을 JSP파일에 삽입하는데 사용합니다. 지시문의 include는 pageContext와 application의 include와 약간 다른 면을 가지고 있습니다. pageContext와 application의 include는 제어권과 관련이 있지만 지시문의 include는 문서의 단순한 include이지 제어권과는 관련이 없습니다. 즉, 단순히 파일만 포함하는 정적인 include입니다. 정적으로 include해서 .jsp내의 구문이 그대로 현재의 페이지에서 실행되는 것입니다.
그 사용방법은 다음과 같습니다.
<%@include file = "include.jsp(html)" %>
지시문으로 .jsp파일을 include했을 때 JSP내용이 실행되는 것이 아니라 소스가 그대로 출력됩니다. 이 점에 주의하시기 바랍니다.
구분 | pageContext의 include | include지시문 |
---|---|---|
사용방법 | pageContext.include(“include.jsp”); | <%@ include file = “include.jsp” %> |
처리방법 | 동적 * include될 페이지에서 처리하여 결과만을 가져와서 포함 * include될 페이지가 이미 컴파일 되어 있어야 함 |
정적 * include될 페이지를 그대로 텍스트로 읽어와 원래 페이지에서 삽입 후 처리 * include될 페이지의 컴파일 여부 상관없음 |
요청 및 제어권 | include할 페이지로 잠시 넘김 | 전혀 상관없음(정적) |
출처 : 소설같은 JSP