JSP 파일 기본 구조
// 지시어
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
// 스크립트 요소 (선언부)
<%!
String str1 = "JSP";
String str2 = "안녕하세요..";
%>
<!doctype html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
// 스크립트 요소 (표현식)
<h2>처음 만들어보는 <%= str1 %></h2>
<p>
//스크립트 요소 (스크립틀릿)
<%
out.println(str2 + str1 + "입니다. 열공합니다!");
%>
</p>
</body>
</html>
크게 보면 지시어와 스크립트 요소가 있으며, 스크립트 요소는 다시 세 가지(선언부, 표현식, 스크립틀릿)로 나뉜다.
지시어는 래당 JSP 페이지의 처리 방법을 JSP 엔진에 지시해주는 역할을 한다.
스크립트 요소는 HTML 파일 중간에 자바 코드를 삽입할 때 사용한다.
지시어
지시어는 JSP 페이지를 자바(서블릿) 코드로 변환하는 데 필요한 정보를 JSP 엔진에 알려준다.
주로 스크립트 언어나 인코딩 방식 등을 설정한다.
지시자 혹은 디렉티브로 부르기도 한다.
<%@ 지시어종류 속성1="값1" 속성2="값2" ... %>
지시어 기본 구문
지시어 종류는 세가지가 있다.
- page 지시어: JSP 페이지에 대한 정보를 설정한다
- include 지시어: 외부 파일을 현재 JSP 페이지에 포함시킨다.
- taglib 지시어: 표현 언어에서 사용할 자바 클래스나 JSTL을 선언한다.
page 지시어
page 지시어는 JSP 페이지에 대한 정보를 설정한다.
예를 들어 문서의 타입, 에러 페이지, MIME 타입과 같은 정보를 설정한다.
속성 | 내용 | 기본값 |
info | 패이지에 대한 설명을 입력 | 없음 |
language | 페이지에서 사용할 스크립팅 언어를 지정 | java |
contentType | 페이지에서 생성할 MIME 타입을 지정 | 없음 |
pageEncoding | charset과 같이 인코딩을 지정 | ISE-8859-1 |
import | 페이지에서 사용할 자바 패키지와 클래스를 지정 | 없음 |
buffer | 출력 버퍼의 크기를 지정한다. 버퍼를 사용하지 않으려면 none으로 지정해야한다. |
8KB |
autoFlush | 출력 버퍼가 모두 채워졌을 때 자동으로 비울 지를 결정한다. buffer 송석이 none일 때 false로 지정하면 에러가 발생한다. |
true |
trimDirectiveWhitespaces | 지시어 선언으로 인한 공백을 제거할지 여부를 지정 | flase |
errorPage | 해당 페이지에서 에러가 발생했을 때 에러 발생 여부를 보여줄 페이지를 지정 | 없음 |
isErrorPage | 해당 페이지가 에러를 처리할지 여부를 지정 | false |
language, contnetType, pageEncoding 속성
<%@ page languag="java" contentType="text/html"; charset="UTF-8" pageEncoding="UTF-8" %>
위 예시 코드를 해석하면 아래와 같다.
language: 스크립팅 언어는 자바를 사용한다.
contentType: 문서의 타입, 즉 MIME 타입은 text/html이고, 캐릭터셋은 UTF-8이다.
pageEncoding: 소스 코드의 인코딩 방식은 UTF-8이다.
캐릭터셋이나 인코딩의 기본값은 ISO-8859-1인데ㅡ 영어와 서유럽어 문자만 포함하고 있어 한글도 표현할 수 있는 UTF08을 사용해야 한다.
import 속성
JSP 파일에서도 필요한 클래스가 있으면 임포트해야한다.
이때 사용하는 것이 page 지시어의 import 속성이다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%--1. 필요한 외부 클래스 임포트--%>
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page import="java.util.Date" %>
<!doctype html>
<head>
<meta charset="UTF-8">
<title>page 지시어 - import 속성</title>
</head>
<body>
<%
Date today = new Date(); //2. 외부 클래스 생성
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
String todayStr = dateFormat.format(today);
out.println("오늘 날짜: " + todayStr); //3. 오늘 날짜를 웹 브라우저에 출력
%>
</body>
</html>
errorPage, isErrorPage 속성
JSP는 실행 도중에 에러가 나면 "HTTP Status 500" 에러 화면을 웹 브라우저에 표시해준다.
개발을 진행하는 중이라면 어떤 에러가 발생되었는지 확인 할 수 있으므로 도움이 된다.
하지만 실제로 서비스하는 도중이라면 에러 화면이 뜬다면 고객의 신뢰를 잃을 수 있으므로 예외처리를 해주는게 일반적이다.
- try/catch를 사용하여 직접 에러를 처리한다
- errorPage, isErrorPage 속성을 사용하여 디자인이 적용된 페이지로 대체한다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!doctype html>
<head>
<meta charset="UTF-8">
<title>page 지시어 - errorPage, isErrorPage 속성</title>
</head>
<body>
<%
try {
int myAge = Integer.parseInt(request.getParameter("age")) + 10;
out.println("10년 후 당신의 나이는 " + myAge + "입니다.");
} catch (Exception e) {
e.printStackTrace();
}
%>
</body>
</html>
try/catch 구문으로 직접 처리한 코드
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ page errorPage="TryCatchHandling2.jsp" %>
<!doctype html>
<head>
<meta charset="UTF-8">
<title>page 지시어 - errorPage, isErrorPage 속성</title>
</head>
<body>
<%
int myAge = Integer.parseInt(request.getParameter("age")) + 10;
out.println("10년 후 당신의 나이는 " + myAge + "입니다.");
%>
</body>
</html>
errorPage 속성으로 에러 페이지 지정
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ page isErrorPage="true" %>
<!doctype html>
<head>
<meta charset="UTF-8">
<title>page 지시어 - errorPage, isErrorPage 속성</title>
</head>
<body>
<h2>서비스 중 일시적인 오류가 발생하였습니다.</h2>
<p>
오류명: <%= exception.getClass().getName()%>
오류 메세지: <%= exception.getMessage()%>
</p>
</body>
</html>
isErrorPage 속성을 설정한 에러 페이지
trimDirectiveWhitespaces 속성
앞의 예제들을 실행 후 [페이지 소스 보기]를 하면 상단에 공백이 있는 것을 확인 할 수 있다.
이는 page 지시어가 있던 부분이다.
page 지시어가 웹 서버에서 처리된 후 공백으로 남게 되는 것이다.
일반적으로는 큰 문제가 없지만 안드로이드와 같은 외부 기기 연동 시 가끔 문제가 일으키기에 만약 불필요한 공백을 지워주고 싶다면 trimDitectiveWhitespaces 속성을 사용하면 된다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ page trimDirectiveWhitespaces="true" %>
<!doctype html>
<head>
<meta charset="UTF-8">
<title>page 지시어 - trimDirectiveWhitespaces 속성</title>
</head>
<body>
<h2>page 지시어로 생긴 불필요한 공백 제거</h2>
</body>
</html>
buffer, autoFlush 속성
JSP 파일은 서블릿 코드로 변환된 후 컴파일 되어 class 파일로 만들어진다.
이를 실행한 결과물을 HTML 형태로 웹 브라우저에 보내 최종적으로 화면에 출력하는 것이다.
또한 이 과정에서 응답 결과를 웹 브라우저로 즉시 전송하지 않고, 출력할 내용을 *버퍼에 저장했다가 일정량이 되었을 때 전송하게 된다.
버퍼란
버퍼라는 개념은 매우 다양하게 사용되며, 가장 쉽게 접할 수 있는 곳은 유튜브이다.
네트워크로 영상 데이터를 전송할 때, 작은 단위로 여러 번 전송하는 것보다 큰 단위로 묶어서 한 번에 보내는 편이 훨씬 효율적이다.
그래서 이때 버퍼하는 임시 저장소를 두어 데이터들이 충분히 쌓일 때까지 기다렸다가 보내는 것이다.
JSP에서 버퍼를 사용함으로써 포워드(forwad: 페이지 전달)와 여러 페이지 처리를 할 수 있다.
JSP가 생성한 결과는 일단 버퍼에 저장된다. 만약 실행 도중 에러가 발생한다면 버퍼에 저장된 내용을 삭제하고 에러 화면을 표시하는 것이다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ page buffer="1kb" autoFlush="false" %>
<!doctype html>
<head>
<meta charset="UTF-8">
<title>page 지시어 - buffer, autoFlush 속성</title>
</head>
<body>
<%
for (int i = 0; i < 100; i++) {
out.println("abcde12345");
}
%>
</body>
</html>
page 지시어의 buffer 속성으로는 버퍼의 크기를 설정할 수 있으며 기본 값은 8kb이다.
버퍼를 사용하고 싶지 않다면 "none"으로 지정하면 된다. 단, buffer을 사용하지 않으면 포워드나 에러 페이지 기능을 사용할 수 없으므로 none으로 지정하는 경우는 거의 없다.
autoFlush 속성은 버퍼가 모두 채워졌을 때의 처리 방법을 정하는 데 쓰인다.
- true(기본값): 버퍼가 채워지면 자동으로 *플러시한다.
- false: 버퍼가 채워지면 예외를발생시킨다.
플러시
버퍼 안의 데이터를 목적지로 전송하고 버퍼를 비우는 작업을 말한다.
include 지시어
특정 정보가 여러 페이지에서 반복되어 사용되는 경우.혹은 세션 확인 같은 작업도 모든 페이지에 삽입해야 하는 경우가 많다.
이럴 때 반복되는 부분을 별도의 파일에 작성해두고 필요한 페이지에서 include 지시어로 포함시킬 수 있다.
<%@ include file-"포함할 파일의 경로" %>
<%@ page import="java.time.LocalDateTime" %>
<%@ page import="java.time.LocalDate" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%
LocalDate today = LocalDate.now();
LocalDateTime tomorrow = LocalDateTime.now().plusDays(1);
%>
공통 UI 요소를 담은 JSP 파일
이 파일은 다음에 작성할 IncludeMain.jsp에 포함시킬 페이지 이므로 <html>과 같은 태그는 모두 제거한 후 작성된다.
단, page 지시어까지 제거하면 JSP가 동작하지 않으므로 주의해야한다.
JSP 파일에서 page 지시어는 필수라는 사실을 절대 잊어서는 안된다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ include file="IncludeMain.jsp" %>
<!doctype html>
<head>
<meta charset="UTF-8">
<title>include 지시어</title>
</head>
<body>
<%
out.println("오늘 날짜: " + today);
out.println("</br>");
out.println("내일 날짜: " + tomorrow);
%>
</body>
</html>
다른 JSP 파일을 포함하는 JSP파일
include 지시어로 다른 문서를 포함시키면 먼저 파일의 내용 그대로를 문서에 삽입한 후 컴파일이 진행된다. 따라서 하나의 페이지가 된다.
taglib 지시어
taglib은 EL(표현 언어)에서 자바 클래스의 메서드를 호출하거나 JSTL(JSP 표준 태그 라이브러리)을 사용하기 위한 지시어이다.
스크립트 요소(Script Elements)
스크립트 요소는 JSP에서 자바 코드를 직접 작정할 수 있게 해준다.
용도에 따라 선언부, 스크립틀릿, 표현식이 있다.
JSP는 클라이언트의 요청을 받아 실행될 때 서블릿(자바 코드)으로 변환되고, 클래스로 컴파일된 후 응답하게 된다.
이 변환 과정에서 _jspService() 메서드가 생성되는데, 변환된 코드의 위치는 스크립트 요소에 따라 _jspService() 메서드 내부 혹은 외부에 놓일 수 있다.
선언부(Declatation)
선언부에서는 스크립틀릿이나 표현식에서 사용할 멤버 변수나 메서드를 선언한다.
서블릿으로 변환 시 _jspService() 메서드 외부에 선언된다.
<%! 메서드 선언 %>
스크립틀릿(Scriptlet)
JSP 페이지가 요청을 받을 때 실행돼야 할 자바 코드를 작성하는 영역이다.
서블릿으로 변환 시 _jspService() 메서드 내부에 그대로 기술된다.
<% 자바 코드 %>
자바에서는 메서드 내부에 또 다른 메서드를 선언하는 게 불가능하다.
만약 스크립틀릿에 메서드를 선언한다면 _jspService() 메서드 내부에 또 다른 메서드를 작성하는 꼴이 되므로 에러가 발생한다.
즉, 스크립틀릿에서는 선언부에서 정의한 메서드를 호출만 할 수 있을 뿐, 다른 메서드를 선언할 수 없다.
표현식(Experssion)
프로그래밍 언어에서 표현식은 실행 결과로 하나의 값이 남는 문장을 뜻한다.
즉, 반환값이 있는 메서드 호출 등이 모두 표현식에 속한다.
스클립틀릿 안에서 변수를 출력할 때는 out.print()를 사용해야 하지마느 좀 더 단순한 방법으로 출력하기 위해 사용된다.
<%= 자바 표현식 %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%! //선언부 (메서드 선언)
public int add(int num1, int num2) {
return num1 + num2;
}
%>
<!doctype html>
<head>
<meta charset="UTF-8">
<title>스크립트 요소</title>
</head>
<body>
<% //스클립틀릿 (자바 코드)
int result = add(10, 20);
%>
덧셈 결과 1: <%= result //표현식 (변수)%>
<br/>
덧셈 결과 2: <%= add(30, 40) //표현식 (메서드 호출)%>
</body>
</html>
스크립트 요소 활용
'🤓천재교육 풀스택 1기 노트' 카테고리의 다른 글
JSP 세션 (0) | 2023.08.02 |
---|---|
JSP 쿠키 (0) | 2023.08.01 |
JSP 기본 (0) | 2023.07.30 |
천재교육 풀스택1기 과정 JSP Section1. 서블릿, 자바 웹 기술의 새 지평을 열다. (3) | 2023.07.28 |
천재교육 풀스택과정 1기 DAY17 (0) | 2023.06.05 |