이번 JSP 기본 포스팅에서는 생성한 JSP 프로젝트의 구조 및 JSP 파일의 기본 구조, 지시어(Directive), 스크립트 요소(Script Elements)에 대해 다뤄보고자 합니다.
Dynamic Web Project를 생성하고 나면, 왼쪽 Project Explorer 창에서 다음과 같이 생성된 폴더들을 조회할 수 있습니다.
이 각 폴더들이 어떤 역할을 하는지, 무엇이 들어가는지에 대해 설명해 보겠습니다.
방금 생성한 프로젝트를 나타냅니다.
자바 전용 폴더로, 자바파일(.java)이 저장됩니다.
이 폴더에 java 파일들을 배치합니다. 해당 폴더안에 있는 java 파일만 컴파일을 수행합니다.
src는 소스 컴파일을 수행하며 실행은 webContent에서 실행됩니다.
이 폴더에는 JSP파일이나 HTML파일과 같이 컴파일 되지 않아도 되는 파일들을 넣어줍니다.
이 폴더 안에는 META-INF와 WEB-INF 폴더가 들어있습니다.
이 폴더 안에는 확장 라이브러리인 lib 폴더와 배포 서술자 web.xml파일이 들어있습니다.
설정을 마친 톰캣 서버가 들어있습니다.
JSP는 클라이언트에 보여지는 결과 페이지를 생성할 때 주로 쓰입니다. (서블릿은 UI 요소가 없는 제어나 기타 처리 용도로 쓰임)
즉, JSP의 주된 목적은 웹 브라우저에 띄울 HTML 파일을 생성하는 것 입니다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%!
String str1 = "JSP";
String str2 = "안녕하세요..";
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Hello, JSP</title>
</head>
<body>
<h2>처음 만들어보는 <%= str1 %></h2>
<p>
<%
out.println(str2 + str1 + "입니다. 열공합시다! ^^");
%>
</p>
</body>
</html>
다음 코드에서 보듯이, JSP 파일은 일반적인 HTML 파일에 몇 가지 요소들이 추가된 형태입니다.
이 추가된 요소들을 크게 분류해 보면 지시어, 스크립트 요소 가 있습니다.
지시어는 JSP 페이지를 Java(서블릿) 코드로 변환하는데 필요한 정보를 JSP 엔진에 알려주는 역할을 합니다.
주로 스크립트 언어나 인코딩 방식 등을 설정합니다.
<%@ 지시어 종류 속성1="값1" 속성2="값2" ...%>
지시어의 기본 구문은 다음과 같이 지시어 종류 뒤에 다수의 속성을 지정할 수 있는 구조입니다.
사용할 수 있는 속성은 지시어마다 다릅니다.
지시어의 종류는 다음 세 가지로 나뉩니다.
page 지시어는 JSP 페이지에 대한 정보를 설정합니다.
예를 들어 문서의 타입, 에러 페이지, MIME 타입과 같은 정보 등...
이클립스에서 JSP 파일을 생성하면, 다음과 같이 해당 속성들(languate, contentType, pageEncoding)을 포함한 page 지시어가 기본적으로 삽입됩니다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
language
페이지에서 사용할 스크립팅 언어를 지정한다.
contentType
JSP 페이지가 생성할 문서의 타입을 지정한다. 이 타입으로는 생성할 응답 문서의 MIME 타입을 입력한다. ex) text/html
pageEncoding
인코딩을 지정한다. 해당 소스코드의 인코딩 방식은 UTF-8 이다.
JSP 파일에서 외부 클래스(파일)가 필요할 때 임포트하기 위해 사용하는 속성입니다.
(Java 에서 외부 클래스를 사용하려면 import문으로 해당 패키지/클래스를 가져오는 것과 비슷한 개념)
추가적으로 덧붙이면, java.lang 패키지에 속하지 않은 클래스를 JSP 문서에서 사용하기 위해 사용합니다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page import="java.util.Date" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Today is? | page 지시어 - import 속성 예제</title>
</head>
<body>
<%
Date today = new Date();
SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd");
String dateStr = dateformat.format(today);
out.println("오늘 날짜 : " + dateStr);
%>
</body>
</html>
다음은 SimpleDateFormat 클래스와 Date 클래스를 이용하여 오늘 날짜를 원하는 포맷으로 출력하는 코드입니다.
SimpleDateFormat 클래스와 Date 클래스는 java.lang 패키지에 속해있는 클래스가 아니기 때문에, 현재 JSP 문서에서 사용하기 위해서는 page 지시어 - import 속성을 이용해, 임포트 해 주어야 합니다.
JSP는 실행도중, 에러가 발생하면 HTTP Status 500
에러 화면을 웹 브라우저에서 표시해줍니다.
서비스 도중 이러한 에러화면을 그대로 노출시키는 것은 고객의 신뢰를 잃는 요인이 될 수도 있으며, 에러가 발생된 코드의 일부가 노출되게 되므로, 보안상으로도 좋지 않습니다.
에러가 발생하는 상황에서 에러화면 대신 개발자가 지정한 JSP 화면을 보여주는 방식으로 이러한 문제를 처리할 수 있는데 이때 page 지시어의 errorPage
, isErrorPage
속성을 사용합니다.
에러가 발생할 수 있는 jsp 페이지의 page 지시어 부분에 errorPage 속성을 입력하고 해당 속성에 에러발생 시 사용자에게 나타낼 jsp 페이지(에러 페이지)를 지정해 줄 수 있습니다. (HTTP Status 500 페이지 대신)
<%@ page language="java" contentType="text/html"; charset=UTF-8"
pageEncoding="UTF-8" errorPage="IsErrorPage.jsp"%>
... 생략 ...
이 방법을 통해 해당 페이지에서 에러가 발생하였을 시 직접 처리하지 않고, errorPage 속성으로 지정한 에러 페이지를 웹 브라우저에 나타냅니다.
위 코드에서는 해당 페이지에서 에러가 발생하면 IsErrorPage.jsp
가 웹 브라우저에 출력됩니다.
errorPage
속성에서 지정한 에러 페이지에서는 isErrorPage 속성을 "true"로 설정해 주어야 합니다. 그래야만 발생된 에러 내용을 그대로 넘겨받을 수 있습니다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isErrorPage="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Page 지시어 - isErrorPage 속성을 설정한 에러페이지 작성</title>
</head>
<body>
<h2>서비스 중 일시적인 오류가 발생하였습니다.</h2>
<p>
오류명 : <%= exception.getClass().getName() %> <br />
오류 메세지 : <%= exception.getMessage() %>
</p>
</body>
</html>
errorPage
속성을 통해 에러페이지로 위 IsErrorPage.jsp 파일을 지정한 jsp파일 ErrorPage.jsp를 실행해 보면 다음과 같은 결과를 확인할 수 있습니다.
주소 표시줄에는 ErrorPage.jsp 가 표시되지만, 화면에는 ErrorPage.jsp 파일에서 errorPage
속성을 통해 지정한( errorPage="IsErrorPage.jsp"
) 에러페이지 IsErrorPage.jsp 의 내용이 출력됩니다.