반응형
- 일반적인 HTML 파일에 몇 가지 요소가 추가된 형태. (JSP의 주된 목적이 웹 브라우저에 띄울 HTML 파일을 생성하는 것이므로)
*JDK, 톰캣, 이클립스의 버전
- JDK-11: JDK-17이 설치되어있어서, https://coding-house.tistory.com/122 보고 JDK-11로 낮춤(JDK-11 자체를 설치하는 건 불가)
- 톰캣 9: JSP와 서블릿을 실행하기 위한 웹 서버
- 이클립스 2020-12 (4.18): 전체 도구를 아우르는 통합 개발 환경(IDE)
1. 지시어 (=지시자, 디렉티브/Directive)
- JSP 페이지의 처리 방법을 JSP 엔진에 ‘지시’해주는 역할 → JSP 페이지를 자바(서블릿) 코드로 변환하는 데 필요한 정보를 JSP 엔진에 알려줌
- 주로 스크립트 언어나 인코딩 방식 등을 설정함
- 지시어 종류 뒤에 다수의 속성을 지정할 수 있는 구조.
//기본 구문
<%@ 지시어종류 속성1="값1" 속성2="값2" ... %>
1) page 지시어: JSP 페이지에 대한 정보 설정 (문서 타입, 에러 페이지, MIME 타입 등)
(1) 주요 속성
속성 | 내용 | 기본값 |
info | 페이지에 대한 설명을 입력 | 없음 |
language | 페이지에서 사용할 스크립팅 언어를 지정함 | java |
contentType | 페이지에서 생성할 MIME 타입 지정 | 없음 |
pageEncoding | charset과 같이 인코딩 지정 | ISO-8859-1 |
import | 페이지에서 사용할 자바 패키지와 클래스 지정 | 없음 |
session | 세션 사용 여부 지정 | true |
buffer | 출력 버퍼의 크기 지정 (*버퍼를 사용하지 않을 경우 “none”으로 지정) | 8KB |
autoFlush | 출력 버퍼가 모두 채워졌을 때 자동으로 비울 지를 결정(*buffer 속성이 none일때 false로 지정 시 에러 발생) | true |
trimDirective Whitespaces | 지시어 선언으로 인한 공백을 제거할지 여부를 지정 | false |
errorPage | 해당 페이지에서 에러 발생 시, 에러 발생 여부를 보여줄 페이지를 지정 | 없음 |
isErrorPage | 해당 페이지가 에러를 처리할지 여부를 지정 | false |
(2) 속성 사용 예시
1. language, contentType, pageEncoding 속성
//이클립스에서 JSP파일 생성 시, 다음 3가지 속성을 포함한 page 지시어가 기본적으로 삽입됨
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
- language: 스크립팅 언어 자바 사용
- contentType: 문서의 타입(=MIME 타입)은 text/html이고, 문자셋(=charset)은 UTF-8
- pageEncoding: 소스 코드의 인코딩 방식이 UTF-8
*charset이나 Encoding의 기본값은 ISO-8859-1인데, 영어와 서유럽어 문자만 포함하고 있어서 한글이 제대로 출력되지 않음. → 한글 표현을 위해서는 EUC-KR이나 UTF-8을 사용해야 함 (최근에는 다국어를 지원하는 UTF-8을 주로 사용)
2. import 속성
//import 속성으로 외부 클래스 불러오기(자바의 import와 동일한 역할)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.text.SimpleDateFormat"%> // 필요한 외부 클래스(SimpleDateFormat) 임포트
<%@ page import="java.util.Date"%> // 필요한 외부 클래스(Date) 임포트
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>page 지시어 - import 속성</title>
</head>
<body>
<%
Date today = new Date(); // 외부 클래스 생성(Date)
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); // 외부 클래스 생성(SimpleDateFormat)
String todayStr = dateFormat.format(today);
out.println("오늘 날짜 : " + todayStr); // 오늘 날짜를 웹 브라우저에 출력
%>
</body>
</html>
3. errorPage, isErrorPage 속성
//에러가 발생하는 jsp 파일
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>page 지시어 - errorPage, isErrorPage 속성</title>
</head>
<body>
<%
// 내장 객체인 request로부터 "age"라는 이름의 매개변수 값을 받아와 정수로 변환하는데,
// 최초 실행 시에는 매개변수가 없으므로 null 값이 전달되어 예외(에러) 발생
int myAge = Integer.parseInt(request.getParameter("age")) + 10; // 에러 발생
out.println("10년 후 당신의 나이는 " + myAge + "입니다."); // 실행되지 않음
%>
</body>
</html>
- try/catch 문으로 에러 직접 처리
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>page 지시어 - errorPage, isErrorPage 속성</title>
</head>
<body>
<%
try { // 예외 발생 부분을 try/catch 문으로 감쌉니다.
int myAge = Integer.parseInt(request.getParameter("age")) + 10;
out.println("10년 후 당신의 나이는 " + myAge + "입니다.");
}
catch (Exception e) {
out.println("예외 발생 : 매개변수 age가 null입니다.");
}
%>
</body>
</html>
- errorPage, isErrorPage 속성을 사용하여 디자인이 적용된 페이지로 대체함
//에러가 발생하는 jsp 파일(ErrorPage.jsp)에 코드 추가
//웹 브라우저에 출력할 이 파일의 페이지를 IsErrorPage.jsp 파일의 페이지로 출력
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
errorPage="IsErrorPage.jsp"%> <!--에러 페이지 지정--> //추가한 코드
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>page 지시어 - errorPage, isErrorPage 속성</title>
</head>
<body>
<%
// 내장 객체인 request로부터 "age"라는 이름의 매개변수 값을 받아와 정수로 변환하는데,
// 최초 실행 시에는 매개변수가 없으므로 null 값이 전달되어 예외(에러) 발생
int myAge = Integer.parseInt(request.getParameter("age")) + 10; // 에러 발생
out.println("10년 후 당신의 나이는 " + myAge + "입니다."); // 실행되지 않음
%>
</body>
</html>
//IsErrorPage.jsp
//에러가 발생하는 jsp 파일(ErrorPage.jsp)의 페이지에서 오류가 발생하면, 이 파일의 페이지가 출력됨
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
isErrorPage="true"%> <!--isErrorPage 속성에 true를 지정-->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>page 지시어 - errorPage/isErrorPage 속성</title>
</head>
<body>
<h2>서비스 중 일시적인 오류가 발생하였습니다.</h2>
<p>
오류명 : <%= exception.getClass().getName() %> <br />
오류 메시지 : <%= exception.getMessage() %>
</p>
</body>
</html>
*ErrorPage.jsp 파일 실행 시 출력되는 페이지: ‘)’ 표시한 부분이 IsErrorPage.jsp의 내용
4. trimDirectiveWhitespaces 속성
- page 지시어로 생긴 불필요한 공백 제거 - 마우스 우클릭 후 [페이지 소스 보기]를 클릭하면 나오는 ‘페이지 소스’ 코드에서의 공백을 없애줌
- 컴퓨터는 공백도 문자로 처리하므로, 안드로이드 등의 외부 기기와 연동 시 가끔 문제를 일으킬 수 있음
//TrimWhitespace.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
trimDirectiveWhitespaces="true" //이 줄 코드의 유무가 다른 결과를 나타냄
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>page 지시어 - trimDirectiveWhitespaces 속성</title>
</head>
<body>
<h2>page 지시어로 생긴 불필요한 공백 제거</h2>
</body>
</html>
- 공백 확인 방법
- 공백 없애기 전 -> 공백 없앤 후
5. buffer, autoFlush 속성
- buffer: JSP의 복잡한 실행 과정에서 응답 결과를 웹 브라우저로 즉시 전송하지 않고, 출력할 내용을 버퍼에 저장했다가 일정량이 되었을 때 전송함 → JSP가 생성한 결과는 일단 버퍼에 저장되는데, 실행 도중 에러 발생 시 버퍼에 저장된 내용을 삭제하고 에러 화면 표시함
//버퍼를 사용하지 않으면 포워드나 에러 페이지 기능 사용 불가 (버퍼 꼭 사용하기)
//buffer 속성으로 버퍼의 크기 설정 가능(기본값 8kb) -> 기본값에서 줄이면 JSP의 기능을 온전히 사용할 수 없게 됨
<%@ page buffer="12kb"%>
//버퍼를 사용하지 않을 때는 값을 none으로 지정
<%@ page buffer="none"%>
- autoFlush: 버퍼가 모두 채워졌을 때의 처리 방법을 정함 (값은 true, false 중 선택 가능)
- true(기본값): 버퍼가 채워지면 자동으로 Flush(플러시, 버퍼 안의 데이터를 목적지로 전송하고 버퍼를 비우는 작업)
- false: 버퍼가 채워지면 예외를 발생시킴
//AutoFlushTest.jsp
//페이지에 출력되는 내용이 butffer 속성으로 설정한 1kb를 초과하여 에러 발생
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" buffer="1kb" autoFlush="false"%> <!--버퍼 설정--> //버퍼 크기를 줄인 후, 버퍼가 가득 차면 에러가 나도록 설정함
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>page 지시어 - buffer, autoFlush 속성</title>
</head>
<body>
<%
for (int i = 1; i <= 100; i++) { //버퍼 채우기
out.println("abcde12345");
}
%>
</body>
</html>
2) include 지시어: 외부 파일(JSP나 HTML 페이지)을 현재 JSP 페이지에 포함시킴
- 상단 메뉴, 하단 정보 예시 - 링커리어
- 웹 사이트에서 반복되는 부분들(상단 메뉴, 하단 정보 등)을 별도의 파일에 작성해두고 필요한 페이지에서 include 지시어로 포함시킴
//include 지시어의 형식
<%@ include file="포함할 파일의 경로"%>
- 예제 - 오늘 날짜와 내일 날짜를 구하는 코드를 담고 있는 IncludeFile.jsp를 IncludeMain.jsp에 포함시키기
//IncludeFile.jsp
<%@ 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); // 내일 날짜
%>
//IncludeMain.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file = "IncludeFile.jsp" %> <!--다른 JSP 파일(IncludeFile.jsp) 포함-->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>include 지시어</title>
</head>
<body>
<%
out.println("오늘 날짜 : " + today);
out.println("<br/>");
out.println("내일 날짜 : " + tomorrow);
%>
</body>
</html>
3) taglib 지시어: 표현 언어(EL)에서 사용할 자바 클래스의 메소드를 호출하거나, JSTL(JSP 표준 태그 라이브러리) 사용을 위해 선언
2. 스크립트 요소(Script Elements)
- JSP 파일 중간 HTML 부분에 자바 코드를 삽입할 때 사용. 선언부/스크립틀릿/표현식으로 나뉨
- “JSP → 서블릿(자바 코드) → 클래스(.java 파일)” 변환 과정에서 _jspService() 메소드가 생성되는데, 변환된 코드의 위치는 스크립트 요소에 따라 _jspService() 메소드의 내부/외부에 놓일 수 있음
1) 선언부(Declaration)
- 스크립틀릿이나 표현식에서 사용할 멤버 변수나 메소드를 선언할 때 사용하는 영역
- 서블릿으로 변환 시 _jspService() 메소드 ‘외부’에 선언됨
//자바와 메소드 선언 방식이 동일함
<%! 메소드 선언 %>
2) 스크립틀릿(Scriptlet)
- JSP 페이지가 요청을 받을 때 실행돼야 할 자바 코드를 작성하는 영역
- 서블릿으로 변환 시 _jspService() 메소드 ‘내부’에 그대로 기술됨
- 변수 출력 시 out.print()를 사용해야 함
- 선언부에서 정의한 메소드 호출은 가능하나, 다른 메소드를 선언할 수는 없음
<% 자바 코드 %>
3) 표현식(Expression)
- 프로그래밍 언어의 표현식: 실행 결과로 하나의 값이 남는 문장(상수, 변수, 연산자를 사용한 (수)식, ‘반환값이 있는’ 메소드 호출 등) → JSP의 표현식: 주로 변수의 값을 웹 브라우저에 출력할 때 사용. 변수를 스크립틀릿보다 좀 더 단순한 방법으로 출력하기 위함
<%= 자바 표현식 %>
4) 스크립트 요소 활용 예제
// ScriptElements.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%! // 선언부(메소드 선언)
public int add(int num1 , int num2) {
return num1 + num2;
}
%>
<html>
<head><title>스크립트 요소</title></head>
<body>
<% // 스크립틀릿(자바 코드)
int result = add(10, 20);
%>
덧셈 결과 1 : <%= result %> <br /> //표현식(변수)
덧셈 결과 2 : <%= add(30, 40) %> //표현식(메소드 호출)-반환값이 있는 메소드라, 표현식에서 바로 호출하는 게 가능
</body>
</html>
5) 선언부/스크립틀릿 영역의 _jspService() 메소드 확인
- 이클립스에서 설정한 작업공간 폴더들 안에, 이클립스의 환경설정이나 추가로 설치된 프로그램들이 저장되는 .metadata라는 폴더가 생성됨
- 윈도우 탐색기에서 이동 - C:\[설정한 작업공간 경로 (필자는 JavaMiniProject)] \.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\MustHaveJSP_origin\org\apache\jsp\_01DirectiveScript
→ ScriptElements.jsp 파일이 서블릿으로 변환된 .java파일과, 그후 컴파일이 완료된 .class파일이 존재함 (총 2개)
: ScriptElements.jsp를 처음 실행 시, ScriptElements_jsp.java로 변환된 후 ScriptElements_jp.class로 컴파일됨
→ 그 중 .java 파일을 메모장으로 열어봄 (마우스 우클릭 → [연결 프로그램] → 메모장)
- 선언부에 정의한 add() 메소드가 _jspService 메소드 외부에 선언된 걸 볼 수 있음 (변수를 선언할 때도, 이 부분에 멤버 변수로 선언됨)
- 스크립틀릿에 작성한 코드는 _jspService() 메소드 내부에 기술되어 있음 → 스크립틀릿에서 메소드를 선언했을 때 에러가 발생하는 이유는, 자바에서는 메소드 안에 또 다른 메소드를 선언할 수 없기 때문
반응형
'자바(JAVA) > JSP 웹 프로그래밍 공부 (성낙현의 JSP 자바 웹 프로그래밍 참고)' 카테고리의 다른 글
JAVA/JSP 6. 내장 객체 - out 객체, application 객체, exception 객체 (0) | 2023.03.30 |
---|---|
JAVA/JSP 5. 내장 객체 - 내장 객체란? Request, Response 객체 (0) | 2023.03.23 |
JAVA/JSP 3. 동적 웹페이지로의 여정과 JSP (0) | 2023.02.28 |
JAVA/JSP 2. JSP를 공부하기 위한 선행 지식 (0) | 2023.02.07 |
JAVA/JSP 1. 개발 환경 구축 - 마지막 추가 설정 (0) | 2023.02.01 |