스크립트 요소는 JSP에서 Java 코드를 직접 작성할 수 있게 해줍니다. 스크립트 요소는 용도에 따라
선언부 <%! %>
,스크립틀릿 <% %>
,표현식 <%= %>
으로 나뉩니다.
JSP는 클라이언트의 요청(Request)을 받아 실행될 때 java 코드로 변환되고, 클래스로 컴파일(서블릿) 된 후 응답(Response)(서블릿을 실행)하게 됩니다.
이러한 변환 과정에서 _jspService()
메서드가 생성되게 되는데, 변환된 jsp 코드의 위치는 스크립트 요소에 따라 _jspService() 메서드 내부 또는 외부에 놓이게 됩니다.
<%! 메서드 선언 %>
스크립틀릿이나 표현식에서 사용할 멤버변수나 메서드를 선언 합니다.
서블릿으로 변환 시, _jspService()
메서드 외부에 선언됩니다.
_jspService()
메서드 외부에 선언되는 이유_jspService()
메서드 내부에 선언이되면 이는 메서드 안에 메서드를 선언하는 꼴이 됩니다. (에러가 발생하게 됨)_jspService()
메서드 외부에 선언됩니다.<% 자바 코드 %>
JSP 페이지가 요청 받을 때 실행되어야 할 java 코드를 작성하는 영역입니다.
서블릿으로 변환 시, _jspService()
메서드 내부에 선언됩니다.
_jspService()
메서드 내부에 선언되는 이유_jspService()
메서드 내부에 선언되는 이유는 다음 조건이 존재하기 때문입니다.스크립틀릿 내부에는 선언부에서 선언된 메서드 호출만 가능하다. 다른 메서드 선언은 불가하다.
_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을 전달하고 리턴된 결과값을 웹 브라우저 화면에 출력하였다.
즉 '반환값이 있는' 메서드를 표현식에서 호출하였다.
이처럼 반환값이 있는 메서드는 표현식에서 바로 호출이 가능하다 !
윈도우 탐색기에서 다음 경로로 이동해봅시다. (내 컴퓨터의 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() 메서드 내부에 기술되어 있는 것을 확인해 볼 수 있습니다.
... 코드 생략 ...