TIL 42 | [JSP] 스크립트 요소

Yoonsik·2022년 9월 23일
1

JSP

목록 보기
3/12

⛓ 스크립트 요소

스크립트 요소는 JSP에서 Java 코드를 직접 작성할 수 있게 해줍니다. 스크립트 요소는 용도에 따라
선언부 <%! %>, 스크립틀릿 <% %>, 표현식 <%= %> 으로 나뉩니다.

JSP는 클라이언트의 요청(Request)을 받아 실행될 때 java 코드로 변환되고, 클래스로 컴파일(서블릿) 된 후 응답(Response)(서블릿을 실행)하게 됩니다.

이러한 변환 과정에서 _jspService() 메서드가 생성되게 되는데, 변환된 jsp 코드의 위치는 스크립트 요소에 따라 _jspService() 메서드 내부 또는 외부에 놓이게 됩니다.

🔗 선언부 - <%! 메서드 선언 %>

스크립틀릿이나 표현식에서 사용할 멤버변수나 메서드를 선언 합니다.
서블릿으로 변환 시, _jspService() 메서드 외부에 선언됩니다.

  • 선언부 영역 코드가 서블릿 변환시, _jspService() 메서드 외부에 선언되는 이유

    서블릿은 기본적으로 Java 코드로 이루어져 있으며, 정확히는 Java 파일을 컴파일한 클래스 파일(.class)형태 입니다. 따라서 Java 문법을 따르게 됩니다.

    Java 문법 상에서는 메서드내부에서 또 다른 메서드 선언이 불가한데, 메서드를 선언하는 역할을 하는 선언부가 서블릿으로 변환되어 _jspService() 메서드 내부에 선언이되면 이는 메서드 안에 메서드를 선언하는 꼴이 됩니다. (에러가 발생하게 됨)

    이러한 이유로 인해 선언부는 서블릿으로 변환 시 _jspService() 메서드 외부에 선언됩니다.

🔗 스크립틀릿 - <% 자바 코드 %>

JSP 페이지가 요청 받을 때 실행되어야 할 java 코드를 작성하는 영역입니다.
서블릿으로 변환 시, _jspService() 메서드 내부에 선언됩니다.

  • 스크립 틀릿 영역 코드가 서블릿 변환시, _jspService() 메서드 내부에 선언되는 이유

    스크립틀릿 영역의 코드가 서블릿으로 변환될 때, _jspService() 메서드 내부에 선언되는 이유는 다음 조건이 존재하기 때문입니다.

    스크립틀릿 내부에는 선언부에서 선언된 메서드 호출만 가능하다. 다른 메서드 선언은 불가하다.

    이 조건도 이전 선언부에서 설명한 메서드내부에서 또 다른 메서드 선언이 불가한 Java의 문법에 의한 조건입니다.
    선언부에서 선언된 메서드를 스크립틀릿 영역에서 호출하는 방법이 아닌, 스크립틀릿에서 직접 다른 메서드를 선언하게 되면, 해당 jsp 파일을 서블릿으로 변환 시, _jspService() 메서드 내에 또 다른 메서드를 선언한 꼴이 되어 오류가 발생하게 됩니다. (스크립틀릿 영역은 서블릿으로 변환 시 _jspService() 메서드 내부에 선언되기 때문)

🔗 표현식 - <%= 자바 표현식 %>

'표현식'은 프로그램 언어 상에서 실행결과로 하나의 값이 나오는 문장을 뜻합니다.
예를 들면 상수, 변수, 연산자를 이용한 수식이나 반환값이 있는 메서드 등이 있습니다.

Ex_1

int int1 = 2;
int int2 = 3;

System.out.println(int1 + int2);
Ex_2

public voio getSum(int1, int2) {
	return int1 + int2;
}

JSP 에서의 표현식도 마찬가지로 주로 변수의 값을 웹 브라우저 화면에 출력할때 사용합니다.


💻 스크립트 요소를 이용하여 작성한 페이지

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%!
public int add(int int1, int int2) {
	return int1 + int2;
}
%>    

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>스크립트 요소 실습 페이지</title>
</head>
<body>
<h3>스크립트 요소 - 선언부, 스크립틀릿, 표현식을 이용하여 작성한 페이지 입니다.</h3>

<%
int result = add(17, 27);
%>

덧셈 결과1 : <%= result %> <%-- 표현식(변수) --%>  <br><br>
덧셈 결과2 : <%= add(27, 37) %> <%-- 표현식(메서드 호출) --%>
</body>
</html>

📃 코드 리뷰

✔ 선언부

<%!
public int add(int int1, int int2) {
	return int1 + int2;
}
%>    

선언부를 이용하여 해당 페이지(스크립틀릿, 표현식)에서 사용할 메서드 add()를 선언하였다.

✔ 스크립틀릿

<%
int result = add(17, 27);
%>

선언문에서 선언된 add() 메서드를 호출하여 인자로 17과 27을 전달하였때 리턴받은 결과값을 result 변수에 저장하였다.

✔ 표현식

<%= result %> <%-- 표현식(변수) --%>  <br><br>

표현식을 이용하여 스트립트릿에 선언된 result 변수의 값을 웹 브라우저 화면에 출력하였다.

<%= add(27, 37) %> <%-- 표현식(메서드 호출) --%>

표현식을 이용하여 선언부에 선언된 add() 메서드를 호출하여 인자로 27과 37을 전달하고 리턴된 결과값을 웹 브라우저 화면에 출력하였다.
즉 '반환값이 있는' 메서드를 표현식에서 호출하였다.
이처럼 반환값이 있는 메서드는 표현식에서 바로 호출이 가능하다 !


jsp 가 변환된 서블릿(.java파일)에서 _jspService() 메서드 확인하기

윈도우 탐색기에서 다음 경로로 이동해봅시다. (내 컴퓨터의 WorkSpace : C:\Dev\JSP_Practice)

C:\Dev\JSP_Practice\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\Project_01\org\apache\jsp\Chapter_005f01

작업공간 안에 .metdata 폴더를 확인할 수 있는데, 이 폴더는 이클립스의 환경설정이나 추가로 설치된 여러 프로그램이 저장됩니다.

아무튼 위 경로를 따라 이동해보면, 해당 작업공간에서 실행한 jsp파일들이 서블릿(.java파일)로 변환된 후 .class 파일로 컴파일까지 완료되어 생성된 2개의 파일이 보입니다.

이것들은 해당 jsp 파일 이 처음 실행되었을 때 .java 파일로 변환된 후 .class 파일로 컴파일 된 것 입니다.

이 중 이 전에 생성한 ScriptElements_jsp의 Java원본파일(확장자가 .java인 파일)을 열어보면,

선언부에서 정의한 add() 메서드가 _jspService() 외부에 선언되어 있는 것을 확인할 수 있습니다.
만약 변수를 선언부에서 선언하였다면 마찬가지로 이 부분에 멤버변수로 선언되어 있을 것입니다.

한편, 스크립틀릿과 표현식에 작성한 코드의 위치를 확인해 보면, _jspService() 메서드 내부에 기술되어 있는 것을 확인해 볼 수 있습니다.

... 코드 생략 ...


profile
꾸준함의 힘

0개의 댓글