finerss's world!

컨테이너는 JSP 파일을 HttpJspPage 인터페이스를 구현한 서블릿 클래스로 변환하여 생성한다.
 
개발자로서 우리는 아래에 나와있는 서블릿 API만 이해하면된다.

 ▶jspInit()

init()메소드를 호출한다. 이 메소드는 재정의해도 무방하다.

▶jspDestroy()

서블릿의 destroy()메소드에서 호출한다. 이메소드또한 재정의해도 무방

▶_jspService()

서블릿의 service()메소드에서 호출한다. 즉 요청이 들어올떄마다 이 메소드는 새로운 스레드로 실행이 된다는 말이다
컨테이너가 알아서 Request 객체와 Response 객체를 매개변수로 넘겨준다
이 메소드는 재정의 하면 안됀다.(이메소드안에 들어갈 코드를 작성하는것 뺴고)


JSP 초기화 하기

JSP도 일반 서블릿과 마찬가지로 초기화 작업을 할 수 있다. 그러나 방식은 일반 서블릭과 조금 다른데

서블릿 초기화 파라미터 설정하기

일반 서블릿에서 서블릿 초기화 파라미터를 설정하는 방식과 유사하게 JSP 초기화 파라미터를 설정한다
차이점이라고는 <servlet-class> 태그가 아닌 <jsp-file> 태그를 사용한다는 것이다.
<web-app ...>
........
   <servlet>
            <servlet-name>MyTestInit</servlet-name>
            <jsp-file>/TestInit.jsp</jsp-file>
            <init-param>
            <param-name>Email</param-name>
            <param-value>abc@daum.com</param-value>
            </init-param>

   </servlet>
   <servlet-mapping>
//JSP에 대한 서블릿을 정의하려면, JSP 페이지에 대한 서블릿 매핑을 반드시 해야한다
            <servlet-name>MyTestInit</servlet-name>
            <url-pattern>/TestInif.jsp</url-pattern>
   </servlet-mapping>
</web-app>

jspInit() 재정의하기

방식은 아주 단순하다. jspInit() 메소드를 JSP 파일에 코딩해놓으면 컨테이너가 서블릿 인생이 시작하는
시점에 이 메소드를 호출한다. 물론 이메소드는 서블릿 init() 메소드에서 호출한다.
따라서 이 메소드가 실행되는 시점에서는 ServletConfig객체와 ServletContext 객체를 사용할수있다.

아래 예제는 jspInit()에서 DD에 설정되어 있는 서블릿 초기화 파라미터 값을 읽어오는 내용이다. 읽어온 값은
애플리케이션 범위에서 사용할 수 있도록 속성에 묶어둔다
<%! 
//jspInit()을 재정의하려면 <%! 선언문은 사용해야한다 <%를 쓰면 service()메소드 안으로 들어가버린다
     public void jspInit(){
             
            ServletConfig sConfig = getServletConfig()
            // 나중에 서블릿이 될 것이기 떄문에, 상속받은 getServletCOnfig() 메소드를 호출할수있다.

            String emailAddr = sConfig.getInitParameter("Email");

            ServletContext ctx = getServletContext();
         
            ctx.setAttribute("mail", emailAddr);
      }
%>




JSP 내에 있는 속성들

대부분의 경우 JSP에서 이용 가능한 4가지 생존범위 속성과 각각에 매치되는 내장 변수를 가지고 속성을 설정하고 읽고 한다.

표준 서블릿에 있는 request 범위, session 범위, application(context) 범위에 하나를 더추가해서

page 범위까지 총 4개이다. page 범위 속성은 pageContext 객체로 작업을한다.

  서블릿에서  JSP에서(내장 객체를 사용) 
 Application  getServletContext().setAttribute("foo",barObj);  application.setAttribute("foo",barObj);
 Request  request.setAttribute("foo",barObj);  request.setAttribute("foo",barObj);
 Session  request.getSession.setAttribute("foo",barObj);  session.setAttribute("foo",barObj);
 Page 제공하지않음   pageContext.setAttribute("foo",barObj);

pageContext로 속성 접근하기

pageContext는 자신에 설정되어 있는 page 범위 속성뿐만 아니라, 어떤 다른 생존범위 속성도 접근할 수 있을 정도로 매우 막강하다.

다른 생존범위 속성을 참조하려면, 메소드 매개변수로 범위를 나타내는 정수값을 넘겨야 한다. 사실 속성에 접근하는 메소드는

모두 JspContext로부터 상속받아 사용하지만, 속성을 나타내는 상수값은 PageContext에 정의되어 있다.





pageContext를 이용하여 속성을 읽고 설정하는 예제

page 생존범위의 속성 세팅하기
<% Float one = new Float(42.5); %>
<% pageContext.setAttribute("foo", one); %>


page 생존범위의 속성읽기
<%= pageContext.getAttribute("foo") %>


pageContext를 이용하여 session 생존범위 속성 세팅하기
<% Float two = new Float(23.5); %>
<%= pageContext.setAttribute("foo", two, PageContext.SESSION_SCOPE); %>


pageContext를 이용하여 session 생존범위 속성 읽기
<%= pageContext.getAttribute("foo", PageContext.SESSION_SCOPE) %>
(이것과 동일한 의미이다 <%= ssesion.getAttribute("foo")%> )


pageContext를 이용하여 application 생존범위 속성 읽기
<%= pageContext.getAttribute("mail", PageContext.APPLICATION_SCOPE) %>
(이것과 동일한 의미이다 <%= application.getAttribute("mail")%> )


pageContext를 이용하여 어떤 생존범위인지 모르는 속성찾기
<%= pageContext.findAttribute("foo") %>
//findAttribute() 메소드는 속성을 제일먼저 page 생존범위에서 찾는다. page생존범위 속성에 "foo"라는 이름을 가진놈이있으면
PageContext에서 getAttribute(String name)을 부르는 것과 똑같은 결과는 호출하는 것과 같다.
만약 "foo" 라는 이름이 page 생존범위에 없다면 가장작은 범위에서부터 시작해 가장 넓은 범위의 순으로 속성을 찾는다.
즉, request. session, application 속성범위 순으로 찾는다. 똑같은이름이 있더라도 가장 먼저찾은 놈이 넘어 간다.


3가지 지시자

1. page 지시자
<%@ page import="foo.*" session="false" %>
페이지 관련 환경(property)을 정의한다. 즉 문자 인코딩(character encoding), 응답페이지 컨텐츠 타입(content-type),
페이지가 내장 세션 객체를 가질 것인지 여부 등을 정의한다. page 지시자에는 서로다른 속성이 총13가지 존재

2. taglib 지시자
<%@ taglib tagdir="/WEB-INF/tags/cool" prefix="cool" %>
JSP에서 이용 가능한 태그 라이브러리를 정의한다. 뒤에서 자세히 설명

3. include 지시자

<%@ include file="wickedHeader.html" %>
변환시점에 현재 페이지에 포함할 코드나 문서를 정의한다. 여러 JSP페이지에 포함되어야 하는 코드가 있다면, 이를 따로 뽑아내어,
재사용 가능한 단위로 만들어 각각의 페이지에서 이를 포함하면 된다. 예를 들면 문서의 머리말이라든지 내비게이션 바 같은것등,,

'공부 > Sevlets&JSP' 카테고리의 다른 글

JSP 기초  (0) 2011.07.01
Session Listener(세션 리스너)  (0) 2011.06.30
세션(sisson) 관리  (0) 2011.06.29
RequestDispatcher  (0) 2011.06.29
동기화  (0) 2011.06.29