JSP(Java Server Page) 이해하기
Server를 활용하여 우리가 원하는 화면을 바로 만들어낼 수 있다면 얼마나 좋을까요? JSP을 활용하면 가능하게 됩니다. 클라이언트 폼을 만들어낼 수 있기 때문입니다. 쉽게 말해서 Servlet이 java 안의 html이라면 JSP는 html 안의 java라고 볼 수 있겠습니다. 이는 마치 찐빵의 앙금이 java이고 겉 빵은 html이라고 볼 수 있는 것이죠.
자바의 영역을 잡을 때에는 <% %>이 태그를 사용합니다. 이 부분을 script와 applet을 합쳐서 scriptlet이라고 부릅니다. jsp페이지에서 자바 코드를 실행할 때 이 블럭의 코드를 사용하게 됩니다.
<%
System.out.println("얘는 console창에 출력됩니다");
out.println("이건 화면에 바로 띄워져요");
%>
이런식으로 <%와 %> 사이에 넣어주면 되는데, 두 개의 차이점은 첫 번째는 system상에 올리는 것으로 콘솔창에 출력되지만 두 번째는 화면으로 바로 직행한다는 점입니다. <% %>이 안에 들어가 있어야 java의 코드가 되기 때문에 다음과 같이 짬뽕해서 쓰게 됩니다.
<%
String str = "hello jsp";
<p>str : <%=str%></p>
<h3>str : <%=str%></h3>
<input type = "text" size = "20" value = "<%=str %>"><br/>
%>
이런식으로 str을 <%= %>안에 넣어주지 않으면 코드를 불러오지 않기 때문에 ! 꼭 감싸줘야 합니다. <%= %>은 출력부로서 세미콜론(;)을 붙이지 않는 특성이 있고, 계산식이나 함수호출을 사용할 때 씁니다.
<%
for(int i = 0; i<5; i++){
%>
<p>hello p tag<%=i%>번째</p>
<%
}
%>
for문을 쓰려고 할 때에도 역시나 자바 코드 부분은 <%와 %>으로 감싸줘야 합니다. 마지막 for문을 실행해보면 다음과 같은 결과가 나타납니다.

위의 부분에서 n번째의 n 부분이 for문이 돌아가면서 입력되게 되는 것이죠. i가 0부터 시작하기 때문에 0,1,2,3,4 총 5번을 돌고 나서 종료하게 되는 것입니다. 단순하게 <% %>만 있는 것이 아니라 전역변수, class, function을 선언해줄 수 있는 선언부가 또 따로 있는데 이는 !를 추가해서 <%! %>이런 식으로 사용합니다.
<%!
//선언부(전역변수, class, function)
int Num = 0;
%>
느낌표는 끝에는 쓰지 않고 처음에만 붙여줍니다. 이렇게 int형 Num을 선언하고 초기화까지 마쳤습니다. 그렇다면 코드부에서 이것을 한 번 1씩 증가시켜보겠습니다.
<%
//코드부(부호가 아무것도 없음)
Num++;
out.println("<h3>코드부"+ Num + "</h3>");
int number = 0;
number++;
out.println("<p>코드부" + number + "</p>");
%>
Num++;이 실행되기 때문에 Num은 0에서 1씩 증가할 것입니다. 아래 out.println을 통해서 확인할 수 있습니다. 반면에 아래 지역변수처럼 선언되어버린 int number의 경우에는 number++;가 실행이 될까요? 새로고침을 계속 눌러보면 Num은 1씩 증가하는데 number는 그대로 0에 멈춰 있는 것을 볼 수 있습니다.



선언부의 Num은 탭을 닫았다가 다시 켜도 1이 더 증가된 상태로 우리를 맞이합니다. 다시 맨 처음으로 1으로 돌려놓고 싶은데 맘처럼 쉽게 되지 않는 것이죠. 그러려면 서버를 종료했다가 다시 켜야합니다. 이는 왜냐하면 전역변수값을 담고 있는 <%! %>가 jspService라는 호출함수 전에 선언되었기 때문입니다. jspService는 우리가 호출을 할 때마다, 즉 브라우저에 의해서 페이지가 호출되는 모든 경우에 계속 초기화가 됩니다. 1에서 2가 되고 싶어도 초기화가 되어버리기 때문에 넘어가지를 못하는 것입니다. 반면에 전역변수는 이미 jspService라는 함수 전에 선언이 되어버렸기 때문에 Number++;가 아무 문제 없이 작동되는것입니다. 단순이 변수뿐만 아니라 class도 선언할 수 있습니다.
<%!
class MyClass{
private int number;
public MyClass(int number){
this.number = number;
}
public String toString(){
return this.number + "";
}
}
public String func(){
return "func 함수 호출";
}
%>
먼저 MyClass라는 이름의 클래스와, String 자료형으로 return값을 갖는 func()함수를 넣어줬습니다.
<%
MyClass cls = new MyClass(12345);
System.out.println(cls.toString());//console
System.out.println(func());//console
%>

결과는 위와 같이 콘솔창에 출력되게 됩니다.