자바(JAVA)/JSP 웹 프로그래밍 공부 (성낙현의 JSP 자바 웹 프로그래밍 참고)

JAVA/JSP 4. JSP 파일 기본 구조

개발학생 2023. 3. 8. 19:36
반응형
  • 일반적인 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() 메소드 내부에 기술되어 있음 → 스크립틀릿에서 메소드를 선언했을 때 에러가 발생하는 이유는, 자바에서는 메소드 안에 또 다른 메소드를 선언할 수 없기 때문

반응형