저번 시간까지는 실습환경의 구축과 기본적인 웹의 환경에 대해 알아보았다.
이번 시간엔 본격적으로 JSP 웹프로그래밍을 시작하기에 앞서 사용하는 데 필요한 기본지식에 대해 알아보자!
JSP에서 HTML 문서를 생성하는 기본 코드 구조
JSP의 주된 목적은 웹 브라우저에서 보여줄 HTML 문서를 생성하는 것이다. JSP 페이지는 다음과 같이 설정부분과 생성부분으로 구성된다.
1~2 Line 이 설정부분, 4~15 Line 이 생성부분이다.
- 설정부분
: JSP페이지에 대한 정보가 위치하며 다음과 같은 정보를 입력한다.
* JSP 페이지가 생성하는 문서의 타입
* JSP 페이지에서 사용할 커스텀 태그
* JSP 페이지에서 사용할 자바 클래스 지정
▶ <%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%>
위의 부분을 page 디렉티브라고 부른다. JSP 페이지의 정보를 나타낼 때 사용된다. page의 언어는 java를 사용하고 html 문서를 생성하며 캐릭터 셋과 pageEncoding에 EUC-KR을 사용한다는 것을 나타낸다.
- 생성부분
: 생성할 문서의 데이터와 문서를 생성하는 데 필요한 스크립트 코드 같은 것들이 위치한다. HTML 코드 및 JSP 스크립트를 작성하는 부분이다. 스크립트 코드는 HTML 문서를 생성하는 데 필요한 데이터를 생성하고 출력하는데 사용한다.
* 캐릭터 셋(character set)
: 문자의 집합을 나타낸다. 각 문자마다 별도의 집합을 정의하고 있다. 한글을 나타내는 집합은 EUC-KR, 알파벳 및 라틴문자를 나타내는 집합은 ISO-8859-1 과 같이 각 문자별로 집합이 존재한다.
기본 캐릭터 셋은 ISO-8859-1 이며 한글 윈도우의 경우 생성시 독자적인 셋으로 MS949 를 사용한다.
전세계의 주요 문자를 모아 하나의 집합으로 묶은 것이 있는데 이것이 유니코드(Unicode)이다. 유니코드와 관련된 셋은 몇 가지가 존재하는데 가장 많이 사용되는 캐릭터 셋이 UTF-8 이다.
UTF-8 은 다국어를 지원하는 사이트의 대부분이 사용하는데 국내의 경우 대다수의 사이트가 EUC-KR 셋을 사용하여 구축되었기 때문에 다국어를 지원하는 경우는 매우 드물다.
JSP 페이지의 구성요소
* 디렉티브(Directive)
* 스크립트(Script) : 스크립트릿(Scriptlet), 표현식(Expression), 선언부(Declaration)
* 표현 언어(Expression Language)
* 기본 객체(Implicit Object)
* 정적인 데이터
* 표준 액션 태그(Action Tag)
* 커스텀 태그(Custom Tag)와 표준 태그 라이브러리(JSTL)
위의 7가지 구성요소를 익히는 과정이 JSP를 공부하는 과정이 되겠다.
우선 간단하게 하나씩 살펴본 뒤 자세한 내용을 알아보자!
- 디렉티브
: JSP 페이지에 대한 설정정보를 저장할 때 사용하며 앞서 설명한 JSP 페이지의 설정부분에 해당한다. JSP가 제공하는 디렉티브는 다음과 같이 3가지가 있다.
page |
JSP 페이지에 대한 정보를 지정. 생성하는 문서의 타입, 출력 버퍼의 크기, 에러 페이지 등을 지정한다. |
taglib |
JSP 페이지에서 사용할 태그 라이브러리를 지정한다. |
include |
JSP 페이지의 특정 영역에 다른 문서를 포함시킨다. |
우선 이번시간엔 page에 대해서만 알아보고 나머지에 대해선 이후에 차례대로 알아보도록 하자!
- 스크립트 요소
: 실시간으로 문서의 내용을 생성하기 위해 사용된다. 예를 들면 폼에 입력한 정보를 DB에 저장할 수 있고 DB로 부터 게시글 목록을 읽어올 수도 있다. 또한 자바의 다양한 기능도 사용이 가능하다.
다음과 같이 세가지 요소를 가진다.
표현식(Expression) |
값을 출력한다. |
스크립트릿(Scriptlet) |
자바 코드를 작성하고 실행한다. |
선언부(Declaration) |
자바의 메서드를 만들어 선언한다. |
- 기본 객체
: request, response, session, application, page 등 다수의 기본 객체들이 존재하며 별도의 선언 없이도 사용이 가능하다.
이 기본 객체들은 각각 요청 파라미터 읽어오기, 응답 결과 전송, 세션 처리, 웹 어플리케이션 정보 읽어오기 등의 기능을 제공한다.
- 표현 언어
: JSP의 경우 자바에 대한 지식이 없다면 사용하기 어려운 특징이 있는데 이러한 문제를 해결하기 위해 나온 것이 표현 언어이다.
- 표준 액션 태그와 태그 라이브러리
액션 태그 |
JSP 페이지 내에서 특별한 기능을 제공한다. 액션 태그는 <jsp:액션태그이름> 의 형태를 띠며 여러가지 종류가 있다. ex) <jsp:include>의 경우 특정 페이지의 실행 결과를 현재 위치에 포함시킨다. |
커스텀 태그 |
액션 태그처럼 태그 형태로 기능을 제공하지만 사용자가 직접 개발해 주어야 한다는 차이점이 있다. |
태그 라이브러리 |
커스텀 태그 중에서 자주 사용하는 것들을 별도로 표준화한 것이다. 이것이 JSTL 이다. 조건문과 반복문을 커스텀 태그를 이용하여 구현할 수 있도록 해준다. 스크립트 코드보다 이해하기 쉽기 때문에 어느 정도 논리적인 연산을 처리할 수 있다. |
page 디렉티브
JSP 페이지에 대한 정보를 입력하기 위해 사용한다.
여러가지 속성을 가지고 있는데 이 중에서 많이 사용되는 몇 가지 속성을 우선 알아보고 나머지는 이후에 하나씩 알아보도록 하자.
- contentType 속성 / 캐릭터 셋
: contentType 속성은 JSP가 생성할 문서의 타입을 지정한다. TYPE 또는 TYPE; charset=캐릭터 셋 으로 구성된다.
TYPE은 생성할 문서의 MIME 타입을 입력한다. 주로 사용하는 MIME 타입으로는 "text/html", "text/xml", "text/plain" 등이 있다. 기본값은 "text/html"이다.
; charset=캐릭터 셋 부분은 생략이 가능하다. 기본값은 ISO-8859-1이며, 한글로 구성된 HTML 문서를 생성할 때에는 euc-kr 셋을 사용한다. 캐릭터 셋을 언어에 맞게 입력하지 않으면 응답 결과에서 글자가 올바르게 출력되지 않는다.
* MIME (Multipurpose Internet Mail Extensions)
: 이메일의 내용을 설명하기 위해 정의. HTTP 등의 프로토콜에서도 응답 데이터의 내용을 설명하기 위해 사용된다.
- import 속성
: JSP 페이지에서 자바의 클래스를 사용하기 위해서 page 디렉티브의 import 속성을 사용한다.
▶ <%@ page import="java.util.*" %>
위의 예제는 Calendar 클래스를 사용하여 오늘 날짜를 보여주는 예제이다. 자바에 익숙한 사람이라면 특징이 그대로 반영된 것을 알 수 있을 것이다.
- trimDirectiveWhitespaces 속성
: 불필요하게 생성되는 공백 문자를 제거할 수 있다. 속성값을 true로 지정해주면 된다.
▶ <%@ page trimDirectiveWhitespaces="true"%>
- JSP 페이지의 인코딩과 pageEncoding 속성
: JSP 파일을 읽을 때는 page 디렉티브의 pageEncoding 속성과 contentType 속성을 사용해서 캐릭터 인코딩을 결정한다.
파일이 유니코드가 아닌 경우 또는 파일의 시작이 BOM 이 아닌 경우, 우선 pageEncoding 속성을 검색하고 그 다음 contentType 속성의 charset의 값을 검색한다.
따라서 pageEncoding 속성을 지정하지 않고 contentType 속성의 charset을 잘못 지정하면 파일을 잘못된 인코딩을 이용하여 읽어오게 된다.
pageEncoding 속성에서 명시한 인코딩과 contentType 속성에서 명시한 인코딩이 서로 다를 수 있다.
▶ <%@ page contentType="text/html; charset=utf-8"%>
▶ <%@ page pageEncoding="euc-kr"%>
스크립트 요소
JSP 프로그래밍에서 로직을 수행하는 데 필요한 부분으로서, 스크립트 코드를 사용해서 프로그램이 수행해야 하는 기능을 구현할 수 있다.
스크립트릿(Scriptlet) / 표현식(Expression) / 선언부(Declaration)
위의 세가지 요소로 구성되어 있다.
- 스크립트릿(Scriptlet)
: 코드 블럭은 <% 으로 시작해서 %> 으로 끝나며 그 사이에는 실행할 자바코드가 위치한다. 한 개 이상의 스크립트릿 코드 블럭을 포함할 수 있다.
아래 예제는 스크립트릿을 사용한 1부터 10까지의 합을 출력하는 코드이다.
- 표현식(Expression)
: 어떤 값을 출력 결과에 포함시키고자 할 때 사용된다. <%= 로 시작해서 %>로 끝난다.
변수 뿐만 아니라 숫자나 문자열 등의 값을 표현식에서 사용할 수 있다. 리턴값이 있는 메서드의 경우 표현식에 호출하여 리턴값을 받아 출력할 수 있다.
- 선언부(Declaration)
: 메서드를 작성할 때 사용된다. <%! 로 시작해서 %> 로 끝난다.
* 실제로 JSP를 사용하여 웹 어플리케이션을 개발할 때는 선언부를 거의 사용하지 않고,
선언부에서 정의한 메서드와 같은 기능을 제공하는 클래스를 작성해서 사용하는 것이 일반적이다.
request 기본 객체
JSP 에서 가장 많이 사용되는 기본 객체로서 웹 브라우저의 요청과 관련이 있다.
클라이언트가 요청한 정보를 제공하는 것이 request 기본 객체이다.
다음과 같은 기능을 가지고 있다.
* 클라이언트(웹 브라우저)와 관련된 정보 읽기 기능
* 서버와 관련된 정보 읽기 기능
* 클라이언트가 전송한 요청 파라미터/헤더/쿠키 읽기 기능
* 속성 처리 기능
- 클라이언트 정보 및 서버 정보 읽기
: 클라이언트가 전송한 정보 및 서버정보를 구할 수 있는 메서드를 제공한다.
getRemoteAddr() |
클라이언트의 IP주소 |
getContentLength() |
클라이언트 요청정보의 길이. 알수 없는 경우 -1 리턴 |
getCharacterEncoding() |
클라이언트가 요청정보를 전송할 때 사용한 캐릭터의 인코딩 |
getContentType() |
클라이언트가 사용한 contentType |
getProtocol() |
클라이언트가 요청한 프로토콜 |
getMethod() |
웹 브라우저가 정보를 전송할 때 사용한 방식 |
getRequestURI() |
웹 브라우저가 요청한 URL 경로 |
getContextPath() |
JSP 페이지가 속한 웹 어플리케이션의 컨텍스트 경로 |
getServerName() |
서버 이름 |
getServerPort() |
서버가 실행 중인 포트 번호 |
- HTML 폼과 요청 파라미터의 처리
: 웹 브라우저 폼에 입력한 값을 처리하는 것은 가장 많이 사용하는 기능 중 하나이다. request 기본 객체는 전송한 파라미터를 읽어올 수 있는 메서드를 제공한다.
getParameter(String name) |
이름이 name인 파라미터의 값. 존재하지 않을 경우 null |
getParameterValues(String name) |
이름이 name인 모든 파라미터의 값을 배열로 구한다. 존재하 지 않을 경우 null |
getParameterNames() |
웹 브라우저가 전송한 파라미터의 이름 |
getParameterMap() |
웹 브라우저가 전송한 파라미터의 맵 |
이 메서드들을 예제를 통해 알아보자!
다음과 같이 두 개의 jsp 파일을 만들어준다.
< formTest.jsp >
12~21 Line : <form> </form> 은 폼에 입력한 값을 지정한 URL로 넘겨서 처리한다는 것을 의미한다. post 방식으로 데이터를 전송하겠다는 것도 명시해 주었다.
16~18 Line : input type 으로 text 와 checkbox 를 사용했는데 이 외이도 password, radio, file 등의 다양한 타입이 있다.
* get 방식과 post 방식
: get 방식으로 전송할 경우 URL 뒤에 쿼리문자열이 생성된다. 즉, get 방식은 굳이 폼을 사용하지 않더라도 파라미터를 전송할 수 있다. post 방식은 데이터 영역을 이용하여 전송한다.
get 방식은 웹 브라우저, 웹 서버 또는 웹 컨테이너에 따라 전송할 수 있는 파라미터 값의 길이에 제한이 있을 수 있다. post 방식은 데이터 영역을 이용하여 전송하기 때문에 파라미터 길이에 제한이 없다.
< viewParameter.jsp >
5 Line : 파라미터 값을 euc-kr 로 디코딩 해서 가져온다는 것을 의미한다. 파라미터 값을 사용하기 전에 실행해 주어야 하기 때문에 import 속성 다음에 써줬다.
* get 방식으로 전송된 파라미터에 대해서는 request.setCharacterEncoding() 메서드로 지정한 캐릭터 셋이 적용되지 않는다.
메서드 별로 다음과 같은 결과가 출력된다. 각 메서드별 특징을 잘 파악하고 숙지해야겠다.
- 요청 헤더 정보의 처리
: 웹 브라우저는 HTTP 프로토콜에 따라서 요청 정보를 웹 서버에 전송한다. 웹 브라우저는 웹브라우저의 종류에 대한 정보를 헤더에 담아서 전송하는데 request 기본 객체는 이러한 헤더 정보를 읽어올 수 있는 기능을 제공한다.
다음과 같은 메서드가 있다.
getHeader(String name) |
지정한 이름의 헤더 값 / 리턴타입 String |
getHeaders(String name) |
지정한 이름의 헤더 목록 / 리턴 타입 Enumeration |
getHeaderNames() |
모든 헤더의 이름 / 리턴 타입 Enumeration |
getIntHeader(String name) |
지정한 헤더의 값을 정수 값으로 / 리턴 타입 int |
getDateHeader(String name) |
지정한 헤더의 값을 시간 값으로 읽어온다.(1970년 1월 1일 기준, 1/1000초 단위) / 리턴 타입 long |
response 기본 객체
request 기본 객체와 정반대의 기능을 수행한다. 즉, 웹 브라우저에 보내는 응답 정보를 담는다.
- 웹 브라우저에 헤더 정보 전송하기
: 응답 정보를 헤더에 추가하는 기능을 가지고 있다. 관련 메서드는 다음과 같다.
addDateHeader(String name, long date) |
name 헤더에 date 를 추가 |
addHeader(String name, String value) |
name 헤더에 value 값을 추가 |
addIntHeader(String name, int value) |
name 헤더에 정수 값 value 를 추가 |
setDateHeader(String name, long date) |
name 헤더의 값을 date 로 지정 |
setHeader(String name, String value) |
name 헤더의 값을 value 로 지정 |
setIntHeader(String name, int value) |
name 헤더의 값을 정수 값 value 로 지정 |
containsHeader(String name) |
이름이 name 인 헤더를 포함할 경우를 true/false 로 리턴 |
* 헤더 정보에는 웹 서버에 대한 정보를 많이 담고 JSP 프로그래밍 자체에서는 많이 사용되지 않는다. 부가적인 정보를 지정하는 경우에만 사용된다.
- 웹 브라우저 캐시 제어를 위한 응답 헤더 입력
: 서버에서 실제로 데이터가 변경되었음에도 불구하고 변경된 내역을 출력하지 않는 이유는 캐시에 저장된 데이터를 출력하기 때문이다. 관련 헤더는 다음과 같다.
Cache-Control 응답 헤더 |
헤더의 값을 "no-cache"로 지정하면 웹 브라우저는 응답 결과를 캐시 에 저장하지 않는다. (HTTP 1.1 버전) |
Pragma 응답 헤더 |
헤더의 값을 "no-cache"로 지정하면 웹 브라우저는 응답 결과를 캐시 에 저장하지 않는다. (HTTP 1.0 버전) |
Expires 응답 헤더는 HTTP 1.0 응답 헤더로서 0이나 1과 같은 값을 입력해서 현재 시간 이전으로 만료일을 지정해준다. 이것은 응답 결과가 캐시되지 않도록 설정하는 것이다.
- 리다이렉트를 이용한 페이지 이동
: 리다이렉트는 response 기본 객체에서 많이 사용되는 기능 중 하나이다.
리다이렉트 기능은 웹 서버가 다른 페이지로 이동하라고 지시하는 것을 의미한다. 특정 페이지를 실행 한 후 지정한 페이지로 이동하길 원할 때 사용한다.
아래 메서드를 사용하여 웹 브라우저에 리다이렉트를 지시할 수 있다.
▶ response.sendRedirect(String location)
이제 예제를 통해 알아보자.
3개의 jsp 파일을 만든다. 하나는 아이디의 파라미터 값을 받는 jsp 파일을 만들고 로그인 결과에 따라 성공과 실패, 각각의 파일을 하나씩 만든다.
위의 파일에서 로그인에 성공했을 경우 아래 파일로 리다이렉트한다.
화면 출력 결과는 다음과 같다.
* 추가로 URLEncoder.encode(String value, character set); 메서드(리턴타입 String) 를 사용하여 파라미터 값으로 사용될 문자열을 지정한 캐릭터 셋으로 인코딩할 수 있다.
이상으로 JSP 웹 프로그래밍을 시작하기에 앞서 기본적으로 숙지해야할 내용들을 알아보았다.
중요한 내용이기 때문에 빠짐없이 알아두어야 되겠다.