본문 바로가기

IT/JSP

[JSP] JSP 기초


JSP는 결국 웹 애플리케이션에서 돌아가는 서블릿으로 거듭나게된다.

컨테이너가 서블릿을 작성하는 과정은 JSP파일을 서블릿 소스코드(.java)파일로 바꾼ㄷ 뒤, 서블릿 클래스로 컴파일한다.

돌아왔는 바로왔든, 결국은 서블릿이된다. 컨테이너가 서블릿 클래스를 로딩하여 인스턴스화한 다음, 초기화 루틴을 호출하고,

요청이 들어올 때마다 스레드를 만들어, service() 메소드를 호출하는 과정이 정확히 일치한다.

JSP 안에서 자바코드는 <%...%> 태그안에 스크립틀릿(scriptlet)으로 작성한다.

JSP에서도 import문을 쓸수있는데 이걸 쓰려면 지시자를 알아야한다

패키지를 import하기 위해서는 page 지시자를 사용한다.

지시자(directive)는 컨테이너가 페이지를 자바 코드로 변환할 때 특별한 지시를 내릴 수 있도록 고안된 것이다.

지시자에는 3가지가 있는데 page, include, taglib이 그것이다.

일단 page 지시자만 알아보면 page지시자가 import를 가능하게 하는 녀석이다.

<%@ page import="foo.*" %>
//패키지를 여러개 import할경우 <%@ page import="foo.*",java.util.*" %>
//지시자 끝에는 세미콜론이 없다.

<html>
<body>
the page count is:
<%
out.println(Counter.getCount());
//스크립틀릿에는 일반자바소스코드를 그대로 코딩하기떄문에 끝에 반드시 세미콜론이 있어야한다.
%>
</body>
</html>
자바코드는 퍼센트(%) 기호로 묶여있지만 지시자는 시작 부분에 다른문자가 포함되어있다.
JSP코드를보다가 <%@ 로 시작하는 구문을보면 지시자라는 것을 알아 차려야한다.

표현식

-스크립틀릿 코드-
<%@ page import="foo.*" %>
<html>
<body>
the page count is:
<% out.println(Counter.getCount()); %>
</body>
</html>

-표현식코드-
<%@ page import="foo.*" %>
<html>
<body>
the page count is:
<%= Counter.getCount() %>
</body>
</html>
//표현식은 훨씬 간결하다. 여기서는 더이상 출력에 관련된 코딩을 할 필요가 없다.

<%= Counter.getCount() %> 에서 세미콜론이 빠진것이 이상하지않은가?

그이유는 표현식의 내용은 out.println()의 매개변수가 되기 떄문이다. 다시말하면 <%= 와 %> 사이에 입력한 내용을

내부 Response객체의 PrintWriter 객체인 out으로 출력하기 위한 매개변수로 넘긴다는 말이다.

컨테이너가 이런코드를 만나면

<%= Counter.getCount() %>

아래와같이 변환한다

out.print(Counter.getCount());

그러므로 표현식에 세미콜론을 입력했다면

<%= Counter.getCount(); %>

다음 같이 된다

out.print( Counter.getCount(); );

절대 표현식 끝에 세미콜론을 넣지 말자!



선언문

모든 스크립틀릿 코드와 표현식 코드는 service()메소드 안으로 들어간다

이는 스크립틀릿 안에 선언된 모든 변수는 모두 지역변수를 의미하는데,

선언문을사용해 인스턴스변수로 만들수도있다.

<%! int count =0; %>
//퍼센트 뒤에 ! 를 붙이면된다
//표현식이아니므로 세미콜론을 붙인다.

<%! 와 %> 안에 들어가는 문장은 서비스 메소드 바깥으로 빠진다. 따라서 정적인 변수나 메소드 또는 인스턴스 변수나 메소드들
모두 여기에 코딩할수 있다.

JSP선언문을 기술하면 클래스 내부에, 서비스 메소드나 여타 메소드의 바깥 쪽에 위치하게 된다. 여기에 간단한 정적인 변수나 메소드
아니면 인스턴스 변수나 메소드를 만들수있다.

컨테이너가 JSP를 어떻게 바꾸는가...

JSP 컨테이너가 결국 서블릿으로 변환시킨다 이때 각각이 서블릿 코드로 어떻게 매핑되는지 알면 JSP 구조를 이해하는 데 도움이된다.

▶ 먼저 지시자(directives)가 있는지 보고선, 변환 작업할때 필요한 정보를 읽는다.

▶HttpServlet의 하위 클래스를 생성

▶import 속성을 가진 page 지시자가 있으면, 클래스 파일의 정의 위에, 패키지 선언 아래에 import문을 넣는다

▶선언문이 있으면, 클래스 파일안에, 서비스 메소드위에, 서블릿 선언 아래에 코딩한다.

▶service()메소드를 만든다. 서비스 메소드의 실제 이름은 _jspService()이다.
이메소드는 서블릿의 부모 클래스에 정의된 service() 메소드를 이녀석이 호출한다.
물론 매개변수 HttpServletRequest와 HttpServletResponse를 받는다. 서비스 메소드 처리를 위임받았다고 생각하면된다
바로밑에 모든 내장객체를 선언하고, 초기화 하는 문장이나온다(밑에 내장객체설명)

▶템플릿 텍스트라고 불리는 HTML과, 스크립틀릿, 표현식을 서비스 메소드 안에 차례대로 Response객체의 출력 스트림인
PrintWriter의 출력 형식에 맞게 코딩한다.


내장객체


컨테이너가 JSP를 서블릿으로 변환하는 과정 중, 서비스 메소드 선언 다음에 한 묶음의 내장 객체를 선언하고 값을 할당하는 부분이 있다.

JSP를 작성하면서 JSP가 서블릿이 된다는 것을 알기 떄문에, 내장객체를 사용할수있는것이다. 개발자가 서블릿 객체를 직접 코딩하진 않지만,

서블릿이 가지고 있는 특징, 즉 서블릿적인 것(Servletness)을 사용 할수 있다는 말이다.

모든 내장 객체들은 서블릿/JSP API에 일대일로 매핑된다.

예를들면 내장 객체인 request는 컨테이너가 서비스 메소드 매개변수로 넘겨준 HttpServletRequest 객체에 매핑된다.

API 내장객체

JspWriter ----------------- out
HttpServletRequest --------------- request
HttpServletResponse -------------- response
HttpSession --------------- session
ServletContext ---------------- application
JspException ---------------- exception //이 내장객체는 "오류 페이지"에 쓸 요량으로만든것이다 (나중설명)
PageContext ---------------- pageContext
//PageContext는 다른 내장 객체들을 포함(은닉)하고 있기떄문에 도우미 클래스로 PageContext만 넘겨도
필요한 다른 내장 객체 및 모든 생존범위 속성을 사용할수 있다.

Object ---------------- page

출처 : http://finerss.tistory.com

'IT > JSP' 카테고리의 다른 글

[JSP] 개발 환경 구축  (0) 2011.11.21
[JSP] 개발환경 구축  (0) 2011.10.14
[JSP] 이론  (0) 2011.10.14