# jsptest001.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<!-- 디렉티브 영역 -->
<%
//Scriptlet(스크립트릿) 영역
String name = "둘리";
name += "는 고길동이 아니다.";
int result;
result = 10 + 20;
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>jsptest001.jsp</title>
</head>
<body>
<div>
<h1>JSP 관찰하기</h1>
<hr>
</div>
<div>
<h2><%=name %></h2>
<h2><%=result %></h2>
</div>
</body>
</html>
- 스크립트 릿 영역에서 변수 선언만 한다고 하여 HTML 창에 보이는 것이 아니다.
- 표현식(<%= >)에 변수를 넣어줘야 HTML 문서에서 확인이 가능하다!
( 자바로 생각해보자면, 변수 선언, 값 할당만 하고 System.out.print를 하지 않으면 출력 값으로 확인 할 수 없음)
# jsptest002.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<%
// 스크립 릿 영역 → JSP 에서 JAVA 코드를 기술하는(사용하는) 영역
int a = 10, b = 5, c;
c = a + b;
// 스크립 릿 영역에서 수행된 자바 코드의 실행 결과는
// 표현식에 의해 HTML 브라우저 영역에 출력된다.
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div>
<h1>JSP 관찰하기</h1>
<hr>
</div>
<div>
<!-- 표현식 -->
<h2>합 : <%=a %> + <%=b %> = <%=c %></h2>
</div>
<%
// 스크립 릿 영역
// ※ 『out』은 내장 객체로서 출력 스트림이다.
out.print("합 : " + a + " + " + b + " = " + c);
out.println("합 : " + a + " + " + b + " = " + c);
out.println("합 : " + a + " + " + b + " = " + c);
out.println("<br><br>");
out.println("합 : " + a + " + " + b + " = " + c + "<br>");
out.println("합 : " + a + " + " + b + " = " + c);
out.println("<br><br>");
String str = String.format("합 : %d + %d = %d", a, b, c);
out.print(str);
out.print(str);
out.println("<br><br>");
str = String.format("합 : %d + %d = %d\n", a, b, c);
out.print(str);
out.print(str);
out.println("<br><br>");
str = String.format("합 : %d + %d = %d<br>", a, b, c);
out.print(str);
out.print(str);
%>
</body>
</html>
- 스크립트 릿 영역은 여러개 사용할 수 있다.
- 스크립트 릿 영역에서 println을 사용한다고 개행이 되는 것이 아니다. <br>를 사용하여 개행한다.
out.print("합 : " + a + " + " + b + " = " + c);
out.println("합 : " + a + " + " + b + " = " + c);
out.println("합 : " + a + " + " + b + " = " + c);
↓
- println을 사용하면 개행이 아닌 공백 생성
out.println("합 : " + a + " + " + b + " = " + c + "<br>");
out.println("합 : " + a + " + " + b + " = " + c);
↓
String str = String.format("합 : %d + %d = %d", a, b, c);
out.print(str);
out.print(str);
↓
str = String.format("합 : %d + %d = %d\n", a, b, c);
out.print(str);
out.print(str);
↓
- "\n"도 개행이 아닌 공백 생성
str = String.format("합 : %d + %d = %d", a, b, c);
out.print(str);
out.print(str);
↓
- String.format 에서도 "<br>"로 개행을 할 수 있다.
# jsptest003.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<%!
// ○ 선언부 영역 → 함수 정의가 가능한 영역
// 선언부에서 선언한 변수 a
int a = 10;
// 선언부에서 정의한 함수 sum()
int sum(int x)
{
int s = 0;
for (int i=1; i<=x; i++)
s += i;
return s;
}
%>
<%
// ○ 스크립 릿 영역
// 스크립릿 영역에서 선언한 변수 b
int b = 0;
a++;
b++;
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>jsptest003.jsp</title>
</head>
<body>
<div>
<h1>JSP 관찰하기</h1>
<hr>
</div>
<div>
<h2>변수의 값 확인</h2>
<h3>a : <%=a %></h3>
<h3>b : <%=b %></h3>
</div>
</body>
</html>
변수 a는 새로 고침을 할 때 마다, 1씩 증가한다.
그 이유를 확인하기 위해서는 서블릿 코드 즉, jsptest003.jsp의 코드를 분석해야 한다.
C:\WebStudy\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\WebApp04\org\apache\jsp
위 경로에 있는 jsptest003._jsp.java 파일을 열어서 확인해보면
전역변수 로 선언된 것을 확인할 수 있다.
이는 객체가 소멸되기 전까지는 계속 값이 유지된다는 것을 의미한다.
변수 b는 지역변수로 선언된 것을 확인할 수 있다.
『_jspInit()』 메소드와 『_jspDestory()』 메소드는 서비스가 시작될 때와 끝날 때 한 번씩만 실행되는 메소드인 반면,
『_jspService()』 메소드는 브라우저에 의해 페이지가 요청될 때 마다 매번 실행되는 메소드이다.
이로 인해 변수 b는 페이지에 대한 요청이 발생할 때 마다 새롭게 초기화되는 과정을 거치게 되는 것이다.
JSP 페이지의 스크립릿 영역에서 선언된 모든 변수는 이 『_jspService()』 메소드의 지역변수가 된다.
또한, JSP 페이지의 선언부 영역에서 선언된 모든 변수는 클래스의 전역변수(인스턴스 변수)가 된다.
JSP 페이지에서 메소드 정의 시, 스크립릿 영역 내부에서는 정의할 수 없다.
서블릿으로 변환되는 과정에서 메소드 내부에 또 다른 메소드가 다시 정의되는 상황이 되어버리기 때문에 문법적으로 잘못된 표현이 되는 것이다.
선언부는 비록 사용 빈도가 낮지만, 메소드는 선언부 내부에서만 정의할 수 있는 것이다.