2.11. JSP 기본문법, 작동원리

JSP란


Java Server Pages(JSP)는 다이나믹한 웹 페이지를 쉽게 만들 수 있는 방법을 제공하며 웹 애플리케이션을 만드는 작업을 간단하게 처리할 수 있도록 해 주는 Server Side Script입니다.
JSP는 기존의 단순한 html을 서비스하던 웹서버의 기능을 보다 발전시켜 웹 기반의 프로그램을 할 수 있도록 만든 것입니다. 그리고 서블릿을 기반으로 하고 있으며 서블릿의 프로그램적인 요소를 발전시켜 사용자가 보다 쉽게 다룰 수 있도록 만든 스크립트 기반의 프로그램입니다.

JSP 와 Servlet의 차이점


1. Servlet
  • 동적 웹 구현 기술
  • CGI를 자바에서 구현한 서버 전용 프로그램 모듈.
  • 서버에서 실행되는 프로그램
2. JSP
  • 서버페이지를 스크립트 레벨에서 프로그램한다.
  • 스크립트로 작성된 JSP는 .class로 컴파일되고 이는 Servlet Container에 적재되어 서비스 된다.
  • 서비스를 요청할 때 서블릿은 인프로세스방식으로 서비스된다.
3. 차이점
  • Servlet이 프로그램 레벨에서 서비스를 처리한다면, JSP는 스크립트 레벨에서 서비스을 처리한다.
4. HTML과 JSP 동작원리
HTML과 JSP 동작원리

JSP 실행 원리


JSP 실행 원리

JSP와 Servlet 내부 주기 비교


jsp변환 서블릿 프로그램은 jspInit(), _jspService(), jspDestroy()세가지 메서드에 의해서 초기화, 서비스, 파괴의 과정을 거친다고 위에서 언급했습니다.
아래의 그림과 같이 jspInit 메서드를 단 한번 호출한 후 _jspService 메서드를 서비스 요청이 있을 때마다 호출하게 됩니다.
JSP 내부주기

JSP 실행 루틴


JSP 실행 루틴

1. Webserver나 Servlet 엔진에서 클라이언트의 요청을 받게 됩니다.
2. JSP Handler 즉, JSP Container Process라고 불리우는 루틴을 거치게 되면서 Servlet 객체존재여부와 파일변경여부를 확인하게 됩니다.
3. 변경되었다면 새로 source파일을 생성하고 그리고 compile과정을 거쳐 실행하게 되고 그리고 이미 로딩되어 있는데 변경처리되지 않았다면 기존에 존재하는 것을 이용하게 됩니다.
4. 로딩을 하지않았다면 처음부터 로딩을 시작하여 source파일을 만들고 compile과정을 거쳐 새로 실행합니다.
5. 다른 서블릿들도 Servlet Container에 적재하는 과정을 반복하게 됩니다.

참고
Eclipse를 이용한 개발환경에서 JSP가 실행되면 어떻게 되는지 확인해 봅시다.
1. Server를 실행합니다.

2. index.jsp를 실행합니다.

3. index.jsp 파일이 Eclipse Plugin 환경으로 옮겨집니다.
예) C:\Menbung_Project\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps

4. index.jsp -> java 파일로 변경되고, Class 파일로 컴파일 됩니다.
예) C:\Menbung_Project\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\_\org\apache\jsp

5. index.jsp 파일이 브라우저에 보여집니다.


참고 : Web 개발환경 설정


기본문법


지시문(Directive)에서 사용되는 형태
  • <%@page %>
  • <%@include %>
  • <%@taglib %>

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" 중간

사용법

language
JSP페이지의 프로그래밍 언어를 지정합니다. 기본값은 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입니다.
버퍼를 사용하지 않을 때의 제약사항
  • 출력이 한번이라도 보내진 이후에 HTTP 헤더 내용을 변경할 수 없다.
  • 보내어진 내용 자체를 취소할 수 없다.
  • 보내어진 내용을 새로운 내용으로 바꿀 수 없다.
  • 액션 태그인 사용이 불가하다.
autoflush
출력버퍼가 꽉 찼을 때 이를 제어할 방법을 지정합니다. true로 지정할 경우 출력버퍼를 클라이언트로 보내주고 내용을 비우며, false로 할 경우 버퍼를 비우지 않고 예외를 발생시킵니다. 위에서 buffer의 크기를 none으로 지정했다면 autoflush 속성을 true로 지정할 수 없습니다. 기본값은 true입니다.
<%@page autoflush = "true" %>
<%@page autoflush = "false" %>

autoFlush 속성
  • autoFlush="true" (디폴트) : 버퍼가 가득 차게 되면 버퍼의 내용을 브라우저로 보내고 계속해서 작업을 진행한다.
  • autoFlush="false" : 버퍼가 가득차게 되면 java.io.IOException 발생시키고 JSP 페이지 수행 작업을 중지한다.
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할 페이지로 잠시 넘김 전혀 상관없음(정적)
@include file의 처리방법
include page

의 처리방법
jsp:include

스크립트릿 (Scriptlet)
  • 가장 많이 활용되는 JSP 구성 요소로서 JSP 페이지 내에서 코드 구현을 위해 사용
<%
for (int i=0; i<=10; i++) {
out.println("Hello World" + i + "<br/>");
}
%>

표현식 (Expression)
  • 간단한 데이터 출력이나 메소드 호출을 통한 데이터 출력을 위해 활용
  • 코드 마지막에 세미콜론(;)이 없다는 것에 주의
<%= result + resultSum() %>

선언 (Declaration)
  • JSP 페이지 전체에서 활용할 변수 및 메소드를 선언
<%!
String name="Gildong Hong";
public boolean isExist() {
return true;
}
%>

주석 (Comment)
  • 코드 상에 부가적인 설명을 덧붙이기 위해 사용
  • JSP에서 활용할 수 있는 주석의 종류는 총 3가지
<%-- This is JSP Comment --%>
// Java 주석 첫 번째
/* Java 주석 두 번째 */
/** Java 주석 세 번째 */

<!-- HTML 주석 -->




출처 : 소설같은 JSP