JSP/기초 JSP

JSP(Java Server Page) 이해하기

호두빵 2021. 6. 14. 19:36

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
%>

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