본문 바로가기
Java/JSP & Servlet

[JSP & Servlet] 3. JSP 기본 태그

by Rosmary 2022. 10. 22.
728x90
반응형

 

 

 

 

**  본 포스팅을 통해 JSP를 처음 접하시는 분들이라면 JAVA 프로그래밍의 기본 문법(최소로 객체와 클래스)에 대한 지식이 필요하다. HTML 역시 관련 지식이 있다면 좋지만, HTML은 JAVA와 달리 하루 이틀이면 충분하게 학습이 가능한 부분이라 본 포스팅을 이해함에 있어 크게 중요한 사항은 아니다. JAVA 관련 포스팅은 아래의 링크를 통해 확인하면 된다.

 

JAVA Basic 카테고리

 

 

서버 프로그래밍을 위한 환경 구성파일의 위치 확인 및 테스트가 완료되었으니, 본격적으로 프로그래밍의 기본 문법에 대해 알아보자. 이번 포스팅에서는 JSP의 기본 태그에 대해서 알아보려 한다. JSP 예시는 Windows의 Tomcat을 사용하려하니 참고바란다.

 

 

1. JSP 기본 태그

 

 

JSP는 html 문서를 기반으로 중간 중간 JAVA 코드를 삽입하는 문서다. Tomcat이 설치된 서버는 이 파일을 Servlet이라 불리는 Java 파일로 변환하고, 이를 컴파일한 결과를 웹 브라우저의 사용자에게 반환한다.  따라서 JSP 파일을 작성하기 위해 HTML 문서 작성 시 필요한 최소 포맷은 알고 있어야 한다. 

 

 

(1) HTML 작성 포맷

 

HTML은 매우 간단한 구조를 가지고 있다. 아래를 보자.

 

<!DOCTYPE html>    <!-- 이것은 주석 표시다. 좌측의 <!DOCTYPE html> 부분은 생략해도 무방하다.-->

<html>

    <head>

        <title>웹 페이지 제목 입력</title> <!--  브라우저 좌측 상단에 나타나는 웹 페이지 제목을 입력한다 -->

    </head>

    <body>

                   HTML 태그를 사용하여 화면에 출력할 내용을 입력한다.

    </body>

</html>

 

HTML은 <>로 구성된 tag라는 것으로 문서를 작성하는데 크게 세 부분으로 나뉜다. html 파일을 작성하기 위한 <html></html> 태그, html 파일의 정보를 표기하기 위한 <head></head> 태그, 그리고 웹 페이지의 본문이 작성되는 <body></body> 부분이다. 이 파일을 Tomcat 서버에 올려보자. 필자는 jsp라는 폴더를 webapp에 생성하고 위의 내용을index.html로 저장한 뒤 웹 브라우저로 호출해보려 한다(자세한 폴더 생성과 서버 구동 방법은 이전의 포스팅을 참고하자)

 

 

Body 부분에 HTML의 태그를 활용하면 표나 버튼 등을 추가하는 것도 가능하다(태그는 크게 어려운 내용이 없어 추후 필자가 별도의 포스팅 작성 후 링크를 걸어둘 예정이다). 그런데, HTML은 문서작성을 위한 마크업 언어지 프로그래밍 언어가 아니다. 그렇기 때문에 화면에 표시되는 내용은 절대 파일 내의 내용을 벗어나지 못한다. 가령 필자가 입력한 숫자에 1을 더한 값을 자동으로 화면에 출력하는 것이 HTML만으로는 불가능하다는 말이다. 

 

JSP는 Java의 코드를 HTML 내부에 삽입함으로써 파일 내에 저장된 글자 외의 내용도 표시하는 것이 가능해진다. 그럼, JSP 파일은 어떻게 Java 코드를 삽입할까?  

 

 

 

(2) JSP 파일 내 JAVA 코드 삽입 시 사용하는 태그 종류

 

HTML에서 Java 코드를 삽입하기 위해 사용하는 태그는 크게 4 가지로 분류한다. 

 

-   지시자(Directive)       :   HTML 파일 최상단에 작성하며, JSP 속성 설정 내용을 포함한다.

                                           <%@ ... %>  또는 <jsp;directive>...< /jsp:directive> :</jsp;directive>  태그 사용

-   선언자(Declaration)   :  JSP -> Servlet 변환 시 Servlet 클래스 내 멤버 변수, 매서드, 내부 클래스 등을 정의한다.

                                           <%! ...    !>  또는 <jsp:declaration>...</jsp:declaration>  태그 사용

-   스크립틀릿(Scriptlet) :  JSP -> Servlet 변환 시 service() 매서드에서 실행할 내용을 작성한다.

                                           <% ... %> 또는 <jsp:scriptlet>... </jsp:scriptlet> 태그 사용

-   표현자(Expression)   :   변수, 반환값이 존재하는 매서드의 결과를 출력할 때 사용한다.

                                           <%= ... %> 또는 <jsp:expression>...</jsp:expression 태그 사용

 

 

간략한 예시를 보자. 필자는 아래의 코드를 index.jsp 파일로 저장하고 jsp 웹앱 폴더를 만들어 해당 위치에 저장했다.

 

 

 

 

 

-  선언자(Declaration)

 

먼저 선언자부터 알아보자. 선언자는 JSP 파일이 Servlet으로 변환될 때, Servlet 파일의 주 클래스 멤버 변수, 매서드, 내부 클래스를 작성할 때 사용한다. 필자가 위에서 작성한 JSP 파일의 Servlet 변환 코드는 아래와 같은 형태를 띈다. 

 

 

 

선언자에 작성된 코드들은 Java 파일의 전체 부분에서 사용이 가능하다. 따라서 JSP 파일에서는 전역 변수와 동일한 효과를 나타낸다. Servlet 파일의 메인 클래스는 내부에 init(), destroy(), service() 등의 매서드를 가지는데, 어떠한 매서드에서도 선언자에 선작성된 변수와 매서드, 클래스를 호출하여 사용하는 것이 가능하다는 이야기다. 

 

선언자 태그는 <%! ... %> 또는 <jsp:declaration>...</jsp:declaration>을 사용한다. 후자의 경우 한 줄 이상 코드가 작성되는 경우 잘 동작하지 않는 문제가 있어서(필자가 잘못 사용하는 것일수도 있다), 필자는 전자의 태그를 많이 사용한다. 

 

 

 

-  스크립틀렛(Scriptlet)

 

JSP 파일이 Servlet 파일로 변환된 내용을 보면 주 클래스 하위에 init(), destroy(), service()라는 이름의 매서드가 존재한다(__jsp_init() 등으로 표시되기도 한다). 이 중 service() 매서드는 JSP 컨테이너는 service() 매서드 내부에 있는 내용을 화면으로 출력해 주는 역할을 한다. 즉, 선언자에 작성한 코드는 service() 매서드 외부에 작성되는 내용이기 때문에 웹 화면 출력과 직접적인 관련을 갖지 않게 되는 문제가 발생하는데, 이러한 이유로 service() 매서드 내에 코드를 삽입할 수 있는 scriptlet이 필요하게 된다. 코드를 보자. 

 

 

Scriptlet으로 작성된 코드는 service() 매서드 내에 위치함을 알 수 있다. 이 service() 매서드 코드를 조금 더 자세히 관찰해보면, 필자가 HTML 태그로 작성한 모든 내용이 service() 매서드 내에 동일하게 작성되어 있음을 알 수 있다. 

 

조금 더 관찰력이 있으신 분들이라면 위에서 작성한 JSP 내용의 일부를 Scriptlet 내부에 변환하여 작성할 수 있다는 것도 알아채실 수 있을 것이다.

 

 

 

Scriptlet 역시 변수, 매서드, 클래스 등을 정의하는 것이 가능하나, 여기서 정의한 변수, 매서드, 클래스는 단지 service() 매서드 내에서만 사용이 가능하다. 보통은 매서드 내부에서 변수를 제외한 매서드, 클래스를 선언하는 일이 잘 없기 때문에 특수한 상황이 아니라면 매서드와 클래스는 멤버변수와 동일하게 선언자(Declaration)에 작성한다.

 

Scriptlet 태그는 <% ... %> 또는 <jsp:scriptlet>...</jsp:scriptlet>을 사용한다. 선언자와 마찬가지의 이유로 필자는 전자의 태그를 주로 사용한다. 

 

 

-  표현자 (Expression)

 

표현자는 HTML 태그 내에서 Java 변수 또는 매서드의 반환값을 출력하기 위한 태그다. Scriptlet의 out.writer() 또는 out.println()과 동일한 기능을 한다. 따라서 선언자와 Scriptle에 작성되는 코드와 달리 문장의 마지막에 세미콜론을 사용하지 않는다. System.out.println("abcd";); 코드가 오류를 발생시킴을 생각해보자. 

 

표현자에 사용하는 태그는 <%= ... %>와 <jsp:expression>...</jsp:expression>이 있다. 

 

 

-  지시자(Directive)

 

다음으로 지시자(Directive) 태그를 알아보자. 지시자는  Tomcat을 통해 jsp 파일이 처리될 때, JSP 컨테이너가 필요로 하는 값을 전달하는 부분이라 보면 된다.

 

지시자 태그는 <%@ ... %> 또는 <jsp:directive>...</jsp:directive>를 사용한다. 지시자 내에 포함될 수 있는 속성들은 아래와 같다.

 

지시자는 다시 세 종류의 타입으로 나뉜다. 

 

page 지시자 :   <%@ page .... %>

include 지시자 :   <%@ include .... %>

taglib 지시자    :   <%@ taglib .... %>

 

JSP  기본 문법에서 많이 사용하는 지시자는 Page 지시자이기 때문에 이번 포스팅에서는 Page 지시자에 대해서만 기술하려한다. 

 

Page 지시자에서 설정하는 속성값은 아래와 같다.

 

속성 (Attribute) 설명 기본값
info 해당 페이지에 대한 설명 입력.  
language HTML 태그에 사용할 프로그래밍 언어 지정. 생략 시 기본값 사용. "java"
contentType 웹 브라우저에 표시할 응답 페이지의 MIME 타입과 인코딩 값을 설정. "text/html;charset=ISO-8859-1"
pageEncoding 구현할 JSP 페이지에서 사용하는 문자 인코딩 지정 contentType 설정 charset 값
errorPage 웹 페이지 호출 시 에러가 발생하면 연결할 페이지 지정  
isErrorPage 현재 JSP 파일이 에러 페이지로 동작하는지 여부를 Boolean으로 설정 "false"
buffer 웹 페이지 호출 시 출력 버퍼의 크기를 설정함. "8kb"
autoFlush 버퍼 설정 시, 버퍼가 가득차지 않은 채 출력이 종료되면 강제로 버퍼를 비워 브라우저에 출력할지 여부를 설정함 "true"
extends 현재 JSP 파일에서 다른 클래스를 상속받아야 하는 경우 사용함.  
import 현재 JSP 파일에서 Java 패키지 Import가 필요한 경우 사용함.  
trimDirectiveWhitespaces 웹 페이지 호출 후 "소스" 확인 시 지시자 부분의 공백을 제거할지 여부를 boolean으로 설정. "false"
session 현재의 JSP 파일에서 session 사용 여부를 설정 "true"
isThreadSafe 현재의 JSP 파일이 제공하는 페이지가 여러 브라우저의 요청을 처리할 수 있는지 여부를 설정 "true"

 

 

info의 경우 작성한 페이지에 대한 정보를 작성하는 부분이다. 이 부분은 변환되는 Servlet 파일 내 getServletInfo() 매서드에 의해 반환된다. 

 

 

 

contentType은 호출되는 페이지의 MIME과 언어 인코딩을 설정하는 부분이다. 예를 들어 필자가 만든 페이지는 단순한 html 텍스트이기 때문에 contentType을 text/html로 지정했고, 한글이 포함되어 있어 인코딩값도 기본값이 아닌 UTF-8을 지정해주었다. 

 

 

 

당분간 MIME 값은 text/html을 고정으로 사용할 것이며 인코딩 값은 한글 출력을 위해 UTF-8과 EUC-KR 중 하나를 사용할 것이다. 

 

errorPage, isErrorPage는 에러 페이지 설정과 관련있는 속성이다. isErrorPage는 현재 JSP 파일을 에러 페이지로 지정할 것인지를 설정하는 부분이며, errorPage는 현재의 JSP 파일이 실행 중 에러가 발생하면 대신 표시할 에러 페이지 JSP 파일을 지정해주는 부분이라 보면 된다. 예시는 아래와 같다.

 

 

 

buffer는 웹 서버의 작업 결과를 브라우저에 출력하기 전, 출력 내용을 저장하는 버퍼의 크기를 지정할 때 사용하는 속성이다. 기본값은 8kb로 설정되어 있다. 버퍼의 크기가 너무 작으면 화면 출력은 빠르게 진행되지만 전환이 빈번하기 때문에 효율성이 떨어지게되며, 반대로 버퍼의 크기가 너무 크면 전환 횟수는 줄어들지만 화면 출력이 느리게 진행된다. 아직까지는 버퍼에 무리가 갈 정도의 파일을 만들지는 않기 때문에 이러한 속성이 있다고만 알고 있으면 된다. 사용 예시는 아래의 스크린샷을 참고하자.

 

 

 

extends와 import는 Java의 extends와 import 키워드와 동일한 기능을 하는 속성이다. 가령 필자가 JSP 파일에서 특정 클래스를 상속받아 코드를 작성하고자 한다면 extends = "상속클래스명"을 입력하면 된다. 그럼 Servlet 파일의 매인 클래스가 속성으로 지정된 클래스를 상속받게 된다. 

 

import는 특정 패키지를 사용하고자 할 때 사용하는 속성이다. 위의 스크린샷에서도 예시로 나타낸 것처럼 Java 패키지를 값으로 작성해주면 되고, 둘 이상의 패키지는 콤마(,)로 구분하여 값을 작성하면 된다.

 


 

설명하지 않은 내용도 조금 있긴 한데, JSP의 기본 문법 작성은 이 정도의 내용만 알고 있어도 크게 문제되지 않는다. 이제 JSP 파일을 두 개 생성하여 구구단을 출력하는 페이지를 서버에 올려보려 한다. 

 

 

 

2. JSP 작성 예시

 

필자는 index 페이지에서 출력하고자 하는 단을 숫자로 입력하면, 입력한 숫자의 구구단을 반환해주도록 만들려한다. 이를 위해 사용자가 단(숫자)을 입력할 수 있는 index.jsp 페이지와 그 결과를 반환할 페이지(result.jsp)도 만들어주어야 한다. 그리고 만들어진 두 JSP 파일은 별도의 HTML 태그로 연결해주어야 한다. 

 

먼저 index.jsp 파일부터 작성해보자. 

 

내용은 단순하다. 단을 입력받을 입력창과 제출 버튼을 input 태그로 만들고, 제출을 클릭하면 result.jsp를 실행하도록 만든 것이 전부다. 이 JSP 페이지의 화면은 다음과 같이 나타난다.

 

 

 

다음으로 result.jsp 페이지를 작성해보자. result.jsp는 사용자가 입력창에 입력한 숫자를 들고와서 연산을 진행해야 한다. 다음 포스팅에서 언급하겠지만, 연결된 포스팅으로부터 인자값을 가져오는 것은 request.getParamater() 매서드를 사용한다. 입력창 이름이 "dan"으로 설정되어 있기 때문에 getParameter 인자는 "dan"을 지정해주면 된다. 이렇게 받아들여온 값은 문자열 형태이므로 Integer.valueOf() 매서드로 정수형 자료로 변환한다.

 

 

만약 입력값이 2~9 를 벗어나는 경우, 별도의 경고가 화면에 나타나도록 if-else 조건문으로 분기를 진행했다. 만약 범위 내의 값이 입력되면 For 문으로 웹 브라우저에 출력할 내용을 작성하면 된다. 추가로 이전 페이지로 돌아가는 form 태그를 input type="submit"과 함께 작성했다. 

 

 

 

결과는 아래와 같이 나타난다. 

 

 

 

변수 출력을 표현자나 엑션 태그(태그 내에 jsp가 포함된 태그를 액션 태그라 한다. 다음 포스팅에서 알아볼 예정) <jsp:expression></jsp:expression>을 사용해도 되나, 코드 작성이 까다롭고 가독성이 떨어진다. 이러한 이유로 필자는 Scriptlet 내부에 html 태그를 작성하는 것을 선호한다.

 

 

 

 


 

 

다음 포스팅에서는 JSP 액션 태그와, 액션 태그를 사용한 JSP 파일의 Include, forwarding에 대해 알아보려 한다.

 

 

Fin.

반응형

댓글