티스토리 뷰
1) JSP 기초
- MS에서 만든 ASP의 대항마로 1999년에 썬에서 발표
- WebContent 폴더 안에 넣으면 됨
- 기본적으로 HTML 안에 <% %> (스크립트릿) 라는 영역으로 JSP 코드임을 표시함
> <%@ page ~ ... (지시자) : JSP 파일 시작하는 부분에 인코딩 등 메타데이터를 넣어주는 부분
> <%= ... (표현식) : 응답결과를
- JSP는 서블릿으로 변환되어 실행된다. 위의 각 표현법에 따라 서블릿으로 변환하는 방법이 다름.
2) JSP Lifecycle
- JSP는 서블릿으로 변환된다고 했음. 이클립스 워크스페이스의 .metadata에서 어찌어찌 들어가면 변환된 .java 서블릿 파일을 볼 수가 있는데...
> _jspService() 라는 메서드 안에 JSP 파일의 내용이 자바 코드로 변환되어 들어가있는걸 볼 수 있음
> HTML 코드는 out.write, 표현식은 out.print, 스크립트릿 영역은 그냥 들어가있음
- JSP 실행순서
(1) 브라우저가 웹서버에 JSP에 대한 요청 정보를 전달
(2) 브라우저가 요청한 JSP가 최초로 요청되었을 경우,
> 서블릿으로 코드가 변환됨 (.java 파일 생성)
> 서블릿 코드를 컴파일해서 실행가능한 바이트코드로 변환함 (.class 파일 생성)
> 서블릿 클래스를 로딩하고 인스턴스 생성
(3) 서블릿이 실행되어 요청을 처리하고 응답 정보 생성
- 선언식
<%! ... %>: 이 안에 메서드 등을 선언할 수 있음.
이걸 쓰면 _jspService() 안이 아니라 밖에 (클래스 바디에) 메서드가 선언된다 (변환된 서블릿 파일에서).
<%
System.out.println("_jspService()");
%>
<%!
public void jspInit() { System.out.println("jspInit()!"); }
public void jspDestroy() { System.out.println("jspDestroy()"); }
%>
서블릿과 똑같이 Init, Service, Destroy라는 라이프사이클을 갖는 것을 확인할 수 있다.
3) JSP 문법
- 선언문 (Declaration): <%! %>
전역변수, 메서드 선언에 사용. 서블릿으로 변환될 때 _jspService() 안이 아니라 상위 레벨인 클래스 안에 들어간다.
- 스크립트릿 (Scriptlet): <% %>
프로그래밍 로직 기술에 사용. 스크립트릿에서 선언된 변수는 지역변수다.
<%
for(int i = 1; i <= 5; i++){
%>
<H<%=i %>> 점점 작아지는 글씨 </H<%=i %>> // 중간에 HTML이 껴들어갔음
<% // 이런 식으로 스크립트릿은 분리해서 쓸 수도 있다
}
%>
- 표현식 (Expression): <%= %>
응답 결과를 넣어주기 위한 부분. 웹 브라우저, 즉 화면에 출력할 것들을 넣어준다.
그냥 변수 하나 간단하게 쓰는 문법이라고 알고 있었는데 그게 아님.
- 주석 (Comment): JSP는 HTML, Java, JSP 문법이 섞인 혼종이기 때문에 3가지의 주석이 존재함
> HTML 주석: <!-- -->. 주석이니 화면에는 내용이 뜨지 않지만 '페이지 소스보기' 를 하면 볼 수 있다.
> 자바 주석: //, /* */. <% %> 안의 자바 영역에서 쓸 수 있음. 서블릿으로 변환된 .java파일에서 볼 수 있다.
> JSP 주석: <%-- --%>. '페이지 소스보기' 를 해도 안 나오고 .java 파일에도 안 나옴. jsp 파일에서만 역할을 한다.

4) JSP 내장 객체
- 내장 객체 (implicit objects)
서블릿 소스의 _jspService() 를 보면 우리가 스크립트릿에 넣어준 내용 외에도 위에 알아서 생성되는 코드들이 있다. 여길 보면 기본적으로 선언되어있는 객체들이 있는데, 이를 내장 객체라고 함. JSP 파일에서 갖다쓸 수 있다.
> request, response, session, out, config, page... 등이 존재
> _jspService() 안에 지역변수로 선언되어 있는 것들이기 때문에 선언문 (<%! ... %>) 에서는 쓸 수 없음
<%
StringBuffer url = request.getRequestURL(); // request를 선언하지 않았지만 사실 이미 존재함
out.println("url : " + url.toString());
out.println("<br>");
%>