본문 바로가기

Programming/JAVA/JSP

[jsp] 내장 객체 설명


jsp 내장객체

 
JSP 구성요소 정리가 좀 오래 걸렸다.
어느 JSP 책을 보든지 참 쉬어보이면서도 어려운 session 인 것 같다.
제가 보기에는 JSP 구성과 원리만 알아도 JSP 공부에 30% 이상은 한 것으로 보아도 무리가 아닐 듯 싶다.

- JSP는 정적인 웹 페이지와는 달리 다양한 클라이언트의 요청에 근거한 동적인 웹 문서를 생성해낼 수 있다는 데 의미가 있다.
- JSP 구성 요소에서 공부를 했던 것이 바로 JSP를 어떤 식으로 표현하고 어떤 처리를 할 것인지 컨테이너에게 알려주는 것을 배웠
   다.
- JSP 페이지 서블릿의 유기적인 관계를 정의하고 서블릿 인스턴스가 실행되는 런타임 환경의 정보를 얻거나 기타 자바의
   서블릿/JSP API가 제공하는 기능들을 내장객체를 통해 할 수 있다.
- JSP 컨테이너가 내부적으로 페이지 서블릿을 구현하는데 공통적으로 요구되는 javax.servlet 패키지 아래 8가지 객체가 있고
   java.lang 패키지 아래 1개의 객체에 각각 정해진 변수명을 사용
- 스크립트요소(선언자, 스크립틀릿, 표현식)를 통해 해당 페이지 서블릿에서 정의하게 될 내장 객체를 페이지 작성시에 묵시적
   (따로 선언하지 않고) 접근
- 결국은 내장객체를 사용하여 좀 더 동적인 웹 문서를 처리를 하는데 목적이 있다.

▶ 내장객체
     - 페이지 작성자가 선언한 변수가 아니라 JSP 컨테이너가  JSP 파일에 대한 서블릿 생성시에 정의하는 객체들이다.
     - JSP 스펙에서 규정하고 있는 변수명으로 선언되도록 되어 있다. (컨테이너가 알아서 한다.)
     - 페이지 작성자는 세션관리, 요청 및 응답 제어, 예외 처리 등 동적인 웹 어플리케이션을 위해 필요한 객체를 묵시적으로
       페이지 내의 스크립트를 통해 접근할 수 있다.
    
    ① request 객체
         ㈀ 브라우저는 클라이언트 요청과 관련된 데이터 HTTP 메세지 (HTTP 헤더 + HTTP 본문) 준비 한다.
       ㈁ 브라우저는 이미 준비한 HTTP 메세지를 가지고 서버에게 자원을 요구한다.
       ㈂ 웹서버는 클라이언트 요청(HTTP 메세지)를 확인한다.
       ㈃ JSP/서블릿 컨테이너가 처리하도록 정의된 경우(요청에 사용된 URI에 근거 JSP/서블릿 컨테이너는 요청된
          HTTP

              메세지를 통해 HttpServletRequest 객체를 생성하고 이를 서블릿에게 넘겨준다.

                말이 너무 어렵다.  그림과 함께 간단하게 정리 하여 보면 다음과 같다.

                  

                ⓐ jsp 페이지 요청
                ⓑ jsp 파일은 jsp/서블릿 컨테이너가 처리 함
                ⓒ HttpServletRequest 객체를  생성

                          [서블릿 파일]
                          "public void _jspService(HttpServletRequest request, HttpServletResponse response)
                          throws java.io.IOException, ServletException {
                                - 내용 생략 -
                          }"

                 ⓓ  jsp내에서 request라는 이름으로 객체를 사용할  수 있다.

         ㈄ request 객체를 통해서 클라이언트 정보를 얻어 내기 위해서 사용되는 메소드
                
                 ⓐ 요청 파라미터
                     - public String getParameter(String name)
                       요청 파라미터(name)에 할당된 값을 리턴한다. 지정된 이름의 파라미터가 존재하지 않는 경우 null을 리턴한다.

                        
                  
                     - public Enumeration getParameterNames()
                        요청에 사용된 모든 파라미터 이름을 java.util.Enumeration으로 리턴한다.

                        ※ Enumeration 은 컬렉션(자료구조)이 가지는 요소들에게 순차적으로 접근하여 처리하는 데 사용되는 객체
                            즉, 순서를 가지고 있는 배열 정도로 알고 있으면 된다.  Enumeration의 중요한 개념은 바로 커서(cursor)
                            다.  커서는 현재 위치를 가리키고 있는 것인데 최초 0부터
시작한다. hasMoreElement()는 커서 바로 앞에
                            데이터가 들어 있는지를 체크하는 것이다. 
만일 현재 커서가 0이라면  첫번째칸을 가리키기 때문에 데이터
                            가 하나라도 들어있다면 true를 리턴해 준다.
nextElement()는 현재 커서가 가리키고 있는 데이터 객체
                            (object)를 리턴해주고 커서의 위치를 다음 칸으로
옮겨 준다. 맨처음 nextElement() 메소드가 실행한 후
                            hasNextElement()의 값은 두번째 데이터가 있는지
없는지 판단한다. 이러한 과정을 반복하여
                            hasMoreElement() 메소드에 반환되는 값이 false일 때까지 반복

                                                                    
                       
                     
                    - public String[] getParameterValues(String name)
                     지정된 단일 요청 파라미터 이름을 대한 모든 값을 String 배열로 리턴한다.(단일 파라미터 이름에 대해서는
                     하나의 값을 갖는 경우라면 getParameter(String name)을 사용하는 것이 코드의 가독성(readability)을 높인다.
                     
                     
                  
                     -  public Map getParameterMap()          
                      request에 담긴 parameter만 빼내서 Map으로 저장해주는 메소드다.
                     
                        

                 ⓑ  HTTP 헤더
                      - public String getHeader(String headerName)
                         HTTP 요청 헤더에 지정된 headerName의 값을 문자열로 리턴한다. HTTP 요청 레더에 headerName 헤더가
                         존재하지 않는 경우 null을 리턴한다.

                         (예) headerName 몇가지만 실행시켜 보면 다음과 같다.
                           request.getHeader("user-agent"); ← 요청 HTTP 헤더는 클라이언트 기본정보가 들어가 있다.
                           [출력]
                           Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322)
                          
                           request.getHeader("referer");  ← 이전 URL를 얻을 수 있다.
                           [출력]
                           http://www.tonkjsp.com/jsp/implicit_obj/requestTest.html
                          
                           request.getHeader("host");  ← Host 네임을 가져 온다.  
                           [출력]
                           www.tonkjsp.com

                           request.getHeader("cookie");  ← 쿠키 값을 가져 온다.
                           [출력]
                           JSESSIONID=2AF61AD955FB488B690A6B0DA6FCBF61
                          
                           request.getHeader("connection"); ← 클라이언트와 서버의 연결 상태에 관한 정보 .
                           [출력]
                           Keep-Alive (유지하고 있으며 살아 있다는 의미 겠네요)

                           request.getHeader("accept-language"); ← 클라이언트에서 지금 사용하고 있는 언어
                           [출력]
                           KO (Korean , KO 한글이라는 의미 입니다.)

                           request.getHeader("accept-encoding"); ← 클라이언트의 인코딩에 관련된 정보
                           [출력]
                           gzip, deflate
                           
                           request.getHeader("accept"); ← 클라이언트가 받아 들일 수 있는 MIME 형식에 관련된 정보
                           [출력]
                            image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel,        
                            application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*

                      -  public Enumeration getHeaderNames()
                         HTTP 요청 헤더에 포함된 모든 헤더의 이름을 java.uti.Enumeration으로 리턴한다.
                         HTTP  헤더를 통해 클라이언트 정보를 담고 있는 헤더의 이름
                           accept
                           referer
                           Accept-Language
                           content-type
                           UA-CPU
                           Accept-Encoding
                           user-agent
                           host
                           content-length
                           connection
                           Cache-Control
                           cookie

                     -  public Enumeration getHeaders(String headerName)
                         HTTP 요청 헤더에 포함된  headerName 헤더의  모든 값을 java.util.Enumeration으로 리턴한다.
                     
                     -  public int getIntHeader(String headerName)
                         HTTP 요청 헤더에 포함된 headerName 헤더의 값을 int로 리턴한다. 지정된 headerName 헤더의 값을
                         int 변환할 수 없는 경우 NumberFormatException이 발생하고 ,  headerName 헤더가 HTTP 요청 헤더
                         에 존재하지 않을 경우 -1로 리턴한다.     
                     
                     -  public long getDateHeader(String headerName)
                        HTTP 요청 헤더에 포함된  headerName 헤더 값을 2008년 12월 1일 00시 00분으로 기준으로 한 현재까지
                        의 밀리초(epoch 라고 한다)를 long 형으로 리턴한다.  headerName 헤더가 존재하지 않은 경우 -1을 리턴
                        한다. headerName 헤더를 long형 숫자로 변환하지 못할 경우 IllegalArgumentException이 발생한다.         
                
                 ⓒ  세션 데이터  (아래 "예" 에서의 세션 값은 다 틀립니다.  아래하고 비슷하고 나오면 됩니다.)
                     - public  HttpSession getSession()
             요청을 시도한 클라이언트에 지정된 HttpSession 객체를 얻는다. 이전에 생성된 HttpSession 객체가 없었다면
             새로운 세션 객체를 생성한다.
              (예)
             org.apache.catalina.session.StandardSessionFacade@2f8116
            
            - public HttpSession getSession(boolean create)
              요청을 시도한 클라이언트에 지정된 HttpSession 객체를 얻는다. create가 false로 지정된 경우 해당 클라이언
              트에 대해 HttpSession 객체가 없는 경우 null을 리턴한다. create가 true로 지정된 경우 이미 존재하는 경우
              생성된 HttpSession 객체를 리턴하고  해당 클라이언트에 생성된 HttpSession 객체가 없으면 새로운
              HttpSession 객체를 생성하여 리턴한다.
              (예)
               request.getSession(false)
               HttpSession 객체가 없는 경우  → null           
               HttpSession 객체가 있는 경우  → org.apache.catalina.session.StandardSessionFacade@2f8116
               request.getSession(true)      
               HttpSession 객체가 없는 경우  → 새로운 객체를 생성한다.
               HttpSession 객체가 있는 경우  → org.apache.catalina.session.StandardSessionFacade@2f8116

            - public String getRequestedSessionId()
               요청을 시도한 클라이언트의 세션id를 문자열로 리턴한다.

               (예) getSession() 결과가 아래와 같이 문자열로 변경된다.
               F6579807550BF8CF18C873CFC6E11830

            - public boolean isRequestedSessionIdValid()
               요청에 시도한 클라이언트의 세션 id가 유효하면 true, 아니면 false를 리턴한다.

            - isRequestedSessionIdFromCookie()
               요청에 포함된 클라이언트의 세션 id가 쿠키로 전달된 경우 true, 아니면 false를 리턴한다.
       
            -  isRequestedSessionIdFrom
                요청에 포함된 클라이언트의 세션 id가 URL에 포함된 경우 true, 아니면  false를 리턴한다.

                 ⓓ  쿠키
                       - public Cookie[] getCookies()
                          클라이언트의 요청에 포함된 (HTTP 요청 헤더) 쿠키를 javax.servlet.http.Cookie 배열로 리턴한다.
                          (여러 개의 쿠키를 클라이언트가 가질 수 있기 때문이다.)
                          (예)

                          Cookie [] cookies = request.getCookies();

                              if(cookies != null || cookies.length > 0

                               for(int i=0; i<cookies.length; i++){<?xml:namespace prefix = o />

                                     cookies[i].getName();  // 쿠키 이름 반환

                                     cookies[i].getValue();  // 쿠키 값 반환

                              }

                          }


                 ⓔ  요청에 사용된 URL/URI    
                     -  public String getRequestURI()
                        요청에 사용될 URL에서 URI 부분을 문자열로 리턴한다.
                   
                     -  public  String getQueryString()
                        요청에 사용된 쿼리 문자열을 문자열로 리턴한다.

                     -  public String getMethod()
                         요청에 사용된 요청 방식(get, post, head...)을 문자열로 리턴한다.

                    

          ㈅  http://cafe.naver.com/tonkjsp/24 ← jsp 자료실에서 소스는 들어 있습니다.
               - 소스에 대한 설명 1
                  책 초판이 2003년도에 되어서 그런지 지금 실정(환경)하고는 맞이 않는 부분이 많습니다.
                  책을 기준으로 request.jsp 13 번째 라인에 Enumeration enum = request.getPrameterNames(); 그대로 사용하면
                  아래와 같은 에러를 접하게 될 것이다.

                  [에러 메세지]
                  Enumeration cannot be resolved      

                  enum은 java5에서 새롭게 등장한 열거형 상수 type이다. 즉, 예약어라는 의미다. 자바에서 객체 생성시 꼭 지켜야
                  부분 중 예약어는 사용할 수 없다고 하였습니다. 위에 같은 에러가 나오는 것입니다. (에러 내용이 별로 친절하지는
                  않습니다. 예약어 위반이란 식으로 에러가 나오면 좀 찾기가 쉬울텐데..)
                 
                  enum DAYS {MON, TUE, WEN, THU, FRI, SAT, SUN}  ← enum은 이런식으로 사용합니다.
             
              - 소스에 대한 설명 2 (한글 인코딩 문제)
                                 
              
          
              -  post 방식의 실행결과와 get방식 실행결과 소스 비교

                 ㉠  파라미터 정보 - post 방식
                
                 ㉠  파라미터 정보 - get 방식
                
                
                 ※  get방식인 경우
                  /tomcat 설치폴더/ conf/server.xml에 URIEncoding="euc-kr" 혹은 URIEncoding="ksc5601" 이런
                 방식으로 이미 인코딩을 한 분은 한글이 깨질 수 있습니다.
                 ㉠ page 지시자
                  <%@ page contentType="text/html;charset=euc-kr" import="java.util.*" %> 이런식으로 되어 있으면
                  URIEncoding를 하고 charset=euc-kr로 또 인코딩를 하여 결과가 됩니다. 한글이 깨질 수 밖에 없습니다.
                  <%@ page contentType="text/html" import="java.util.*" %> 이런식으로 바꿉니다.
                 ㉡ page 지시자 사용 할 경우는
                   server.xml에서 URIEncoding="euc-kr" 혹은 URIEncoding="ksc5601"를 지워주세요

                 ㉡ 헤더정보
                 
                 ㉢ 세션데이터
                   
                  ㉣ 쿠키 정보
                 

              -  HttpUtils.getRequestURL(request) 이 아닌 방식으로  JSP에서 URL를 얻는 방법

                  (실무에서 가끔 사용, 그냥 알아둠)
                  ※ 빈즈에서 URL 구하기는 다음에 빈즈 정리할 때 가치 하겠습니다.
                
                
              -  한글인코딩 구체적인 원리 (WebServer : Apache  WebServer,  JSP  컨테이너는 tomcat)

                 ㉠  JSP 한글 인코딩 기본적인 방식
                  

                

                       

                 ㉡ JSP 한글 URL 인코딩 - post 방식

               

                


                  ㉢ JSP 한글 URL 인코딩 - get 방식
                               

                


                 ㉣ 실무에서 tomcat 를 가지고 웹서버와 컨테이너 같이 하는 사용하는 경우 위에서 같이 매번 설정을 생각할 필요

                     는 없다. (실무에서 매번 ㉠~㉢  처럼 한글 인코딩에 신경쓰다가는 개발은 하지도 못하고 욕만 들어 먹습니다.)

                     tomcat은 웹서버의 역할을 좀 합니다. 그러기에 개발할 경우에는 웹서버를 신경쓰지 않고 개발을 합니다.


                


                ㉤  파라미터로 넘어온 값을 직접 인코딩도 가능하다.(실무에서 종종 사용되는 방식이다.꼭 알아두기 바람,

                     util 클래스를 하나 만들어 jsp에서 클래스 선언하여 가져다 씁니다.)


                     String name = request.getParameter("name");   ← 파라미터 값을 넘겨 받는다. (한글이든 무엇이든 상관 없음)

                     if(name !=null) {

     name=new String(name.getBytes("8859_1"),"euc-kr");

 }

                   name.getBytes("8859_1");  //name의 인코딩타입을 8859_1 타입으로 변환 하고 바이트 단위로 쪼개서

                   배열에 저장

                   배열에 저장된 것들을 euc-kr로 변환하여 다시 문자열 변수인 name에 저장한다는 의미 입니다.

                   name은 한글이라는 의미 입니다.

                

                   ※ euc-kr과 ksc5601 차이

                       초창기 자바에서는 표준 한글 인코딩빙식을 처리 할때 KSC5601 이라는 인코딩 방식을 사용했습니다. 그러나

                       자바 언어를 사용하여 프로그램을 개발하는 나라가 많아 짐과 동시에 SUN에서는 각 나라의 언어에 대한

                       좀더 구체적인 표준 코드를 만들기 시작하였습니다. 결국은 JAVA 1, 2에 들어서자 ksc5601를 버리고 euc-kr를

                       만들어 사용하게 되었습니다. KSC5601과 euc-kr는 하는 역할은 같다고 보시면 됩니다.


                ㉥ URL 자체를 인코딩하고 디코딩 하는 경우

                    윈도우 환경에서는 자주쓰이는 방식은 아니지만 가끔 유닉스(리눅스)환경에서 자주 나온다.

                    (예) 파라미터 값이 uri 혹은 url 형식을 띄 경우 (/jsp/test/..., www.tonkjsp.com/jsp/test/ , ...)

                     이런식으로 되어 있는 경우 윈도우 환경에서는 정상적으로 파라미터가 전송되지만 유닉스 환경에서는  전송이

                     되지 않는 경우가 있다. 웹서버에서 부터 차단되는 현상이 나타난다.


                     http://cafe.naver.com/tonkjsp/25 ← jsp 자료실에서 소스


                     ㉠ HTML → JSP

                     [자바스크립트(encodeURIComponent("해당필드").value) java.net.URLDecoder.decode("디코딩 대상")]



                    


                    JSP → JSP

                     [java.net.URLEncoder.encode("인코딩 대상") java.net.URLDecoder.decode("디코딩 대상")]

                                                                          

    ② response 객체
        ㈀ 요청을 시도한 클라이언트로 전송할 응답(HTTP Response)을 나타내는 객체이다.
        ㈁ HTTP 요청을 처리하는 JSP 컨테이너는 Response 객체로 javax.servlet.http.HttpServletResponse 객체이다.
            (서블릿 파일을 열어 _jspService() 메소드를 확인하여 보면 알수 있다.)
        ㈂ 클라이언트  전송될 응답 헤더(HTTP Response Header)를 설정하고 응답을 위한 출력 스트림(out 객체)을
            얻거(서블릿 -jspService() 메소드 확인)나 세션관리를 위한 추가 정보(URL Rewriting) 등을 설정할 수 있다.
        ㈃ javax.servlet.http.HttpServletResponse 인터페이스에 정의된 주요  메소드
            (여기서 빠진 부분은 "Servlet API Javadocs"에서 확인 할 수 있습니다.)

            ㉠ public void addCookie(javax.servlet.http.Cookie cookie)
                - 파라미터에 지정된 쿠키를 응답 헤더에 추가한다.
                - 클라이언트가 지정된 쿠키를 저장하도록 HTTP 응답헤더에 Set-Cookie 헤더를 추가한다.  

 

               

       

            ㉡ public boolean containsHeader(String headerName)
               - 응답으로 전송될 헤더에 지정된 headerName이 포함된 경우 true를 리턴하고, 그렇지 않은 경우에는 false를
                  리턴 한다.
                  http://cafe.naver.com/tonkjsp/26 ← jsp 자료실에서 소스
               
            ㉢ public sendRedirect(String location) throws IOException
                - 지정된 location으로 요청을 재전송한다.
                - 파라미터로 지정된 location은 절대 URL 혹은  URL 혹은 상대적 URL로 지정한다.
                - 서버의 특정 자원(웹 문서 등)이 임시로 다른 URL로 옮겨진 경우에 사용할 수 있는 메소드
                   즉, 이 메소드를 만다는 순간 파라미터로 지정한 location으로 페이지가 이동된다.
                   response.sendRedirect("http://www.tonkjsp.com/index.html"); ← location으로 URL를 사용한 예
                   response.sendRedirect("/jsp/sample.jsp"); ← location으로 상대경로를 사용한 예
                  
                  ※  웹에서 url 이동하는 방법은 크게 4가지로 구분한다. (차이점을 정확히 알고 넘어 가도록 합니다.)

                   ㈀ JavaScript 이용하는 경우
                       a. window.open("location")
                         - 새 창을 로딩하고 지정된 location 으로 이동한다. (주로 팝업 창에 자주 사용)
                       b. location.href = "location"
                         - 현재 로딩된 창을 이용한다.
                         - 인터넷 임시 파일 사용한다.(history-client)
                            C:\Documents and Settings\Administrator\Local Settings\Temporary Internet Files\
                         -
아래 그림은 window.open에 대해서 간략한 그림이다.
 

                            


                       c. location.replace("location")
                          - 현재 로딩된 창을 이용한다.
                          - 인터넷 임시 파일 사용하지 않는다.(history 사용하지 않음)
                          - [새로고침]를 하면 서버에서 해당 페이지를 가져와 보여 준다. 

                        
                          

                             


                      d. http://cafe.naver.com/tonkjsp/27 ← jsp 자료실에서 다운받아 실행하여 결과를 확인하여 본다.
                    
                   ㈁ response.sendRedirect(String location) 이용하는 경우
                      a. HTTP 헤더정보를 변경하여 redirect시키기 때문에 브라우저 주소는 "location" 로 변경된다.
                      b. sendRedirect가 실행되기전에 jspWriter 클래스의  객체인 out 에 대해서 out.write() 혹은 out.print 실행되지
                          않는다.
                      c. 페이지의 Header정보의 HTTP 상태코드(Status code)를 301로 바꾸어서 보냄(헤더의 상태정보 코드만 변경)
                          ※ 상태코드(W3C의 HTTP/1.1 Status)                        
                         200 OK - 정상코드로 브라우저가 서버측에 페이지를 요청에서 받은 정보의 헤더정보의 상태정보가 정상
                         301 Moved Permanently -  브라우저는 상태코드가 301이 오면 같이 받은 URL로 다시 요청을 보냄
                         403 Forbidden
                         404 Non Found
                         500 Internal Sever Error
                         403, 404, 500코드는 대표적인 에러코드다.

                      d. 아래 그림은 response.sendRedirect("location")를 간소한 한 그림이다.                      
                     

                     


                      e. http://cafe.naver.com/tonkjsp/28 ← jsp 자료실에 파일을 다운받아 실행하여 본다.

                   ㈂ forward() 액션 태그를 이용하는 경우 (서블릿 파일로 설명하는 것이 가장 좋다고 봅니다.)
                      a. 브라우저에는 최초 요청한 url이 그대로 남아있으며 location으로 바뀌지 않는다.
                      b. <jsp:forward page="location" />
                      c. forward 액션 태그 처리 과정을 간략히 그림으로 표현하면 다음과 같습니다.

                                                          

                                                                                                                                                                                                        
                   d. response.sendRedirect() 같이 out.write 이하는 클라이언트로 전송되지 않는다. 
                   e. http://cafe.naver.com/tonkjsp/29 ← jsp 자료실에 파일 다운로드하여 확인하여 봅니다.

                   ㈃ meta 태그를 이용하는 경우
                    <META http-equiv=refresh content="0;url=location">

            ㉣ public String encodeURL(String url)
                - 현재 요청을 시도한 클라이언트 브라우저가 쿠키를 지원하는지가를 먼저 보고 쿠키가 사용가능하게 설정된
                   브라우저의 경우에는 파라미터로 넘겨받은 URL을 그대로 문자열로 리턴
                - 브라우저가 쿠키를 사용할 수 없도록 설정된 경우(혹은 쿠키를 지원하지 못하는 브라우저)에는 자동으로 하이퍼
                   링크에 사용된 URL에 세션 아이디를 쿼리 문자열로 리턴한다. (url에 세션 아이디를 붙여서 전송한다는 의미)

                   ㈀ 클라이언트와 서버간의 세션이 유지, 서블릿 코드 내에서 클라이언트 브라우저가 쿠키를 지원하지 않을 경우
                    - 생략 -
                    out.println("<a href=\" + response.encodeURL("SessionServlet")+ "\"+ 돌아가기 + </a>")
                    - 생략 -
                   
                   ㈁ encodeURL() 메소드는 쿼리 문자열에 사용자의 세션ID를 추가한 문자열을 리턴한다.
                    out.println("<a href=\" + "SessionServlet?session=세션ID 값(문자열)" + "\"> 돌아가기 </a>");
                     
                   ㈂ 세션이 유지되는 서블릿에서 하이퍼링크로 세션 아이를 전송하려는 경우(URL Rewriting 기법)
                   계속적으로 세션을 유지하는데 사용하는 메소드

                - 쿠키를 사용하지 않고 URL를 인코딩 하지 않고 전송하였을 때 세션유지 상태와 URL 인코딩하여 전송하였을 때
                   세션유지 상태를 예제 소스를  실행시켜 확인 하기 바랍니다.
                   (단, 쿠키는 아에 사용하지 않는 것으로 설정해 놓고 시작하여야 합니다. - 그래야 차이점을 정확히 알 수 있음")

                    ㈀ windows xp 인 경우

                                           

                    ㈁ 2003 서버 인 경우    

                  

                 
                   ㈂ http://cafe.naver.com/tonkjsp/30  jsp 자료실에서 파일 다운 받아 실행결과를 확인하여 보세요.

            ㉤ public String encodeRedirectURL(String url)
                - 클라이언트와 서버의 세션이 유지되는 상태에서 브라우저가 쿠키를 지원하지 않는 경우 , sendRedirect) 메소드에
                   서 사용할 수 있도록 URL에 자동으로 세션 ID가 쿼리 문자열로 추가된 URL을 리턴한다.

                - 다음은 response.encodeURL(String url)와 response.RedirectUrl(String url) 차이점 비교한 표            
               

                

                 

            ㉥ public void setStatus(int status_code)
                - 응답으로 전송될 HTTP 응답 상태 코드를 설정하는 메소드다.
                   (클라이언트로 전송될 응답 헤더 중에 서버측 서버측 에러 상황이 아닌 상태코드를 설정하는데 사용)
                - 기본적으로 요청에 대한 응답을 성공적으로 한 경우 웹 서버는 응답 헤더에 '200 OK'를 브라우저에게 전송
                -  표현은
                    response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); //301 상태코드
                    response.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);  //302 상태코드

                    ※ 기타 상태 코드에 대해서 servletapi 를 참조하기 바랍니다.
                    http://tomcat.apache.org/tomcat-5.5-doc/servletapi/index.html
       
            ㉦ public sendError(int status_code) throws IOException
                - 기능상 setStatus() 메소드와 거의 동일하나 , 서버측 에러 상황을 클라이언트로 통보하기 위해 응답 헤더에
                   상태코드를 설정하는 메소드
                - 동일한 상태코드로 에러상황을 응답으로 전송하더라도 브라우저에 따라 서로 다른 메시지 출력
                - 입출력상의 문제 발생시 IOException이 발생하고, 이미 응답이 전송된 이후에(출력 buffer가 다 채워져 flush된
                    경우) sendError를 통하여 상태코드를 설정하려고 하면 IllegalStateException이 발생한다.
                - 표현은
                   response.sendError(HttpSErvletResponse.SC_FORBIDDEN);  

            ㉨ public void sendError(int status_code, String message) throws IOException
                - sendError와 같이 서버측 에러를 나타내는 상태코드를 설정하는 데 사용하나 해당 에러 상황을 설명하는 메시지를
                  같이 설정해줄 수 있는 메소드
                - 표현은
                   response.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE,"메세지로 출력할 내용 적음");
                
            ㉩ public void setHeader(String headerName, String value)
                - 응답에 포함될 헤더를 설정한다. 이전에 동일한 헤더가 설정된 경우는 나중에 설정한 헤더가 적용
                - containsHeader() 메소드를 통해, 설정된 헤더가 HTTP 응답 헤더에 포함 여부 확인 가능
                - addCookie()메소드를 사용하지 않더라도 setHeader()를 통해 쿠키를 설정할 수 있음
                - 표현은
                   response.setHeader("set-cookie","customer_id=tonkjsp");
 
            ㉪ public void setDateHeader(String headerName, long dateInMil)
                - 2008년 12시 30분 20초를 기준으로 dateInMil초 경과된 날짜를 headerName 헤더 값으로 지정하여 응답 헤더에
                   포함
                - 표현은
                  response.setDateHeader("myDate", 12345);

            ㉫ public void setIntHeader(String headerName, int intValue)
                - 지정된 intValue를 값으로 하는 headerName 헤더를 응답헤더에 포함
                - 지정된 헤더값을 정수로 지정한다는 것을 제외하고는 setHeader()와 동일하다.

            ㉬ ㉩ ~ ㉫ 이것에 대한 예제는 http://cafe.naver.com/tonkjsp/31 jsp 자료실에 다운 받아 실행하여 봅니다.

            ※ pragma와 Cache-Control 사용하는 이유
                브라우저나 프록시 서버로 하여금 요청시에 캐시된 문서를 사용하지 말고 매번 서버로 부터 새로운 문서를 다시
                전송받아 사용하도록 알리는 헤더 (HTTP 1.0 → pragma 헤더, HTTP 1.1 → Cache Control)             
               
    ③ pageContext 객체
         ㈀ jsp페이지와 관련된 프로그램 코드에서 다른 내장 객체를 얻는데 사용
             (JSP 페이지 대한 정보를 저장하고 있는 객체)
         ㈁ 하나의 페이지에서 다른 페이지로 요청 처리 제어권을 임시, 혹은 영구적으로 넘겨주는 역할
         ㈂ request, session,application과 같은 내장 객체의 속성을 관리하는 기능을  가지고 있다. 즉,
             이들 내장객체(request, session,application....)는 각각의 영역과 관련된 자신의 속성을 가질 수가 있고 이를 통해
             각각의 영역 내에서 지정된 속성들을 서로 다른 페이지라 할지라도 동일한 애플리케이션 내에서 공유가 가능하다.                          

           


         ㈃ pageContext는 javax.servlet.jspPageContext 추상클래스를 상속한 클래스 객체로 JSP 컨테이너가 구현
         ㈄ pageContext 주요메소드
             ⑴ 내장객체를 얻기 위한 메소드
                 ㉠ public abstgract Exception getException()
 - 페이지 실행 도중 예외 발생시 이를 처리하도록 지정된(page 지시어의 errorPage 속성에 지정된) 에러
    페이지(page 지시어의 isErrorPage 속성을 "true" 로 설정한 페이지)에 전달된 예외 객체를 리턴
    즉, 내장객체 exceptioin을 리턴한다.
 -  표현은
     pageContext.getException() ← 예외가 발생하지 않았다면 null 리턴한다.

                 ㉡ public abstract JspWriter getOut()
                     - 요청에 대한 응답 출력 스트림을 리턴한다. 즉, 내장 객체 out을 리턴한다.
                     - 표현은
                       pageContext.getOut().print("- 출력 - "); ← 결국은 JspWriter out = pageContext.getOut(); 이렇게 된다면
                      out.print("www.tonkjsp.com.<br>") =pageContext.getout().print("www.tonkjsp.com.<br>") 이런식도 성립
                       한다. "후자보다는 전자를 더 권장한다."

                 ㉢ public abstract Object getPage()
                     - 해당 JSP 페이지에 대한 서블릿 인스턴스 객체를 리턴한다. 즉, 내장 객체 page를 리턴한다.
                        (말이 너무 어렵습니다. 아래 그림을 보고 참조 하세요.)
                     - 표현은
                        pageContext.getPage();

                     - 간단하게 예를  들자면                    
                    

                     

                     
                 ㉣ public absract ServletRequest getRequest()
                    - 해당 페이지에 대한 클라이언트 요청 정보를 담고 있는 객체를 ㄱ리턴한다. 즉, 내장 객체를 리턴한다.
                    - 표현은
                       pageContext.getRequest()

                    - 간단한 예를 들자면
                       <% page contentType="text/html;charset=euc-kr" %>
                       요청 :  <%=pageContext.getRequest() %>
                       ==================================================
                       요청: org.apache.catalina.connector.RequestFacade@1000bcf
                       // 결과는 제 로컬을 기준으로 한 것입니다. 만일 각자 확인 할 경우 결과는 틀려 집니다.
                   
                 ㉤ public abstract ServletResponse getResponse()
                    - 요청에 대한 응답 객체를 리턴한다. 즉, 내장 객체 response를 리턴한다.
                    - 표현은
                       pageContext.getResponse()

                    - 간단한 예를 들자면
                      <% page contentType="text/html;charset=euc-kr" %>
                       응답 : <%=pageContext.getResponse() %>
                       ===================================================
                       응답 :  org.apache.catalina.connector.ResponseFacade@1ff2e1b
                       // 결과는 제 로컬을 기준으로 한 것입니다. 만일 각자 확인 할 경우 결과는 틀려 집니다.

                 ㉥ public abstract ServletConfig getServletConfig()
                     - 해당 페이지 대한  서블릿 초기 설정 정보를 담고 있는 객체를 리턴한다. 즉, 내장 객체 config를 리턴한다.
                     - 표현은
                       pageContext.getServletConfig()

                     - 간단한 예를 들자면
                        <% page contentType="text/html;charset=euc-kr"%>
                         서블릿 초기 설정 정보 : <%=pageContext.getServletConfig()%>
                         =================================================
                         서블릿 초기 설정 정보 : org.apache.catalina.core.StandardWrapperFacade@1758cd1
                         // 결과는 제 로컬을 기준으로 한 것입니다. 만일 각자 확인 할 경우 결과는 틀려 집니다.

                 ㉦ public abstract ServletContext getServletContext()
                     - 해당 페이지에 대한 서블릿이 실행되는 환경 정보를 담고 있는 객체를 리턴한다. 즉, 내장객체 application을
                        리턴 한다.
                     - 표현은
    pageContext.getServletContext()
  
 - 간단한 예를 들자면

                       <% page contentType="text/html;charset=euc-kr"%>
                        서블릿 환경 정보 : <%=pageContext.getServletContext() %>
                        =======================================================
                        서블릿 환경 정보 : org.apache.catalina.core.ApplicationContextFacade@869113
                        // 결과는 제 로컬을 기준으로 한 것입니다. 만일 각자 확인 할 경우 결과는 틀려 집니다.

                 ㉧ public abstract HttpSession getSession()
                     - 해당 페이지 요청한 클라이언트의 세션 정보를 담고 있는 객체를 리턴한다. 즉 내장 객체 session을 리턴한다.
                     - 표현은
                        pageContext.getSession()
                    
                     - 간단한 예를 들자면
                        <% page contentType="text/html;charset=euc-kr" %>
                         세션 : <%=pageContext.getSession() %>
                         ========================================================
                         세션 : org.apache.catalina.session.StandardSessionFacade@754fc
                         // 결과는 제 로컬을 기준으로 한 것입니다. 만일 각자 확인 할 경우 결과는 틀려 집니다.

                   ㉨  ㉠~㉧ 의 메소드들은 거의 사용할 일은 극히 드물다. 그렇지만 원리 차원에 알고 넘어가야 할 것 같다.
                       "객체를 리턴" 하게 되면 어떤 값이 존재한다. 분명히 jsp 페이지 내에서 선언한 적도 없고 설정한 일도 없는데
                       말이다. 그유는 내장객체 이기 때문이다.  즉, 묵시적으로 jsp 페이지 내에서 자유롭게 사용할 수 있다는 것이다

             ⑵ 요청을 처리할 제어권을 임시 혹은 영구적으로 다른 페이지로 위임하고자 할 때 사용되는 메소드
                 ㉠ public abstract void forward(String urlPath) throws ServletException, IOException
                    - 현재 페이지의 요청과 응답 제어권을 로컬의 urlPath로 넘겨준다.
                    - 제어권은 영구적으로 넘어간다.
                    - forward를 호출한 원래 페이지의 이전, 이후의 출력 내용은 무시 됨 .
                    - request와 response가 그대로 forward된 페이지로 넘겨지고 요청을 처리하는 모든 권한 역시 forward가 가진다
                       (당연한 얘기지만 forward된 페이지가 요청을 처리하면 응답은 종료된다. 그 이유는 앞에서 얘기 하였듯이
                        forward된 페이지에 모든 권한이 넘어 왔기 때문이다. )
                    -  표현은
                        pageContext.forward("sample.jsp");
                        pageContext.forward("/jsp/sample.jsp);

                 ㉡ public abstract void include(String urlPath) throws ServletException, IOException
                     - 현재 페이지의 요청과 응답 제어권을 로컬의 urlPath에 넘긴다.
                     - 제어권은 임시로 지정된 urlPath에 넘긴다.
                     - include를 호출하기 이전까지 응답 출력 스트림은 자동으로 flush(클라이언트 전송) include된 urlPath의 페이

                        지
                      가 요청을 처리하고 끝나면 제어권을 다시 원래 페이지로 반환 (말이 좀 그렇다.)                                                                  

                    

                     
                     - include를 사용하면 현재의 페이지에 urlPath에 지정한 페이지를 끼워넣는 효과를 줄 수 있음
                     - 표현은
                        pageContext.include("/sample.jsp");
                        pagecontext.include("/jsp/sample.jsp");

    ④ session 객체
        ㈀ 웹서버와 클라이언트간의 세션(Virtual connection) 데이터를 저장하고 있는 객체
        ㈁ 세션관리 기법이 등장하게된 배경
            HTTP 프로토콜은 요청(request)/응답(response)의 매커니즘으로 구성되어 클라이언트 요청에 대한 응답을 전송
            하고 나면 연결이 끊기게 되어 각각의 클라이언트들을 구분하여 처리할 수 없게 되었다. 이러한 문제점을 보완하기
            위해 등장한 것이 세션관리 기법이다.

         ㈂  세션의 주요 메소드

             ㉠ public String getId()
                - 해당 세션의 세션 ID를 문자열로 리턴한다.
                - 세션 ID 값은 session 객체 생성JSP 컨테이너에 의해 고유한 값으로 할당된다.
                  (각각의 클라이언트를 구별할 수 있는 것이 바로 여기에 있다. "고유한 값" ← 중복되지 않았다는 의미다.)
               
             ㉡ public long getCreateTime()
                - 2008년 12월 06일 00시 00분 00초(epoch)를 기준으로 해당 session이 생성된 시간을 밀리초 계산하여
                  long 형 정수로 리턴한다.

             ㉢ public long getLastAccessedTime()
                - 클라이언트 요청이 마지막으로 시도된 시간을 epoch를 기준으로 경과된 밀리초로 리턴한다.

             ㉣ public int getMaxInactiveInterval()
                 - setMaxInactiveInterval()로 지정된 값을 정수로 리턴한다. 즉, 클라이언트 요구가 없을시 서버가 해당 세션을 유지
                    하도록 지정된 시간을 정수로 리턴한다. 기본값은 30분으로 지정한다.
                    (클라이언트가 로컬에서 아무런 반응을 보이지 않으면 서버에서 그 클라이언트에 대해 세션을 끊는다.
                      "아무런 반응" → 시간으로 계산하여 둔 것
                     )
               
             ㉤ public void invalidate()
                - 해당 세션을 종료시킨다. 즉, 속성값으로 저장된 모든 객체를 반납한다.
                 (강제적으로 세션을 종료 시키는 것과 같다.)

             ㉥ public boolean isNew()
                -  서버측에서 새로운  session 객체를 생성하고 아직 클라이언트에게 세션을 ID를 할당하지 않은 경우 true를
                    리턴하고 기존의 세션이 유지되고 있는 상태로 false

             ㉦ public void setMaxInactiveInterval(int seconds)
                - 클라이언트 요청이 없더라도 세션을 유지할 시간을 초단위로 설정한다. 만약 second 값이 6*60(360)이라면
                   마지막으로 클라이언트가 요청을 시도한 시점부터 6분 동안 해당 클라이언트에서 새로운 요청이 없으면 해당
                   세션을 무효화(invalidate)한다. seconds 값이 음수이면 해당 세션은 무효화되지 않는다.

             ㉧ ㉠ ~ ㉦ 예제를 실행시켜 확인 하여 본다.
                 (http://cafe.naver.com/tonkjsp/32  ← jsp 자료실에서 파일 다운로드 하여 결과 확인하기 바랍니다.)

    ⑤ application 객체
        ㈀ 특정 웹 어플리케이션이 실행되는 환경에 대한 정보를 담고 있는 객체
            (웹 어플리케이션 context의 정보를 저장하고 있는 객체)
        ㈁ application 객체는 javax.servlet.ServletContext 타입으로 제공
        ㈂ 해당 어플리케이션이 실행되는 서버의 정보와 서버측 자원에 대한 정보를 얻을 때 사용
        ㈃ 어플리케이션이 실행하고 있는 동안에 발생할 수 있는 이벤트 로고와 관련된 기능을 제공

        ㈄ application 주요 메소드
           ⑴ 어플리케이션 실행 환경을 제공하는 서버의 정보 관련 메소드
               ㉠ public int getMajorVersion()
                   - Servlet API 스펙의 Major 버전을 int로 리턴한다.   예) Servlet API 2.3 인 경우라면 2를 리턴한다.
               ㉡ public int getMinorVersion()
                   - Servlet   API 스펙의 Minor 버전을 int로 리턴한다. 예)  Servlet API 2.3  인 경우라면 3를 리턴한다.
               ㉢ public String getServerInfo()
                   -  서블릿/JSP 컨테이너의 버전을 문자열로 리턴한다. 예) 서버이름/서버버전(description) 과 같은 형식의
                       문자열을 리턴한다.

           ⑵ 서버측 자원에 대한 정보를 얻는 메소드
               ㉠ public String getMimeType(String filename)
         - filename 파라미터가 서버측에 존재하는 경우 해당 파일의 MIME 형식을 문자열로 리턴한다.
           예) text/html 이런식으로 출력이 됩니다.

               ㉡ public java.net.URL getResource(String path)
                   - path로 지정된 자원을 URL 객체로 리턴한다.
                   - 서버측 자원을 URL 객체로 접근하고자 하는 경우 사용
                   - 파라미터로 지정된 자원이 존재하지 않는 경우 null을 리턴한다.

               ㉢ public InputStream getResourceAsStream(String path)
                   - path에 지정된 자원을 java.io.InputStream 객체로 리턴한다. 파라미터로 지정된 자원이 존재하지 않는
                      경우 null 리턴한다.
               ㉣ public String getRealPath(String path)
                   - path로 지정된 자원의 실제 파일시스템 경로를 문자열로 리턴한다.

           ⑶ 어플리케이션 이벤트 로그와 관련된 메소드
               ㉠ public void log(String msg)
                  - 파라미터로 지정된 문자열 msg를 서블릿/jsp 컨테이너에 지정된 서블릿 로그 파일에 해당 어플리케이션 실행
                     도중 발생한 이벤트 로그를 기록한다.
                  - /CATALINA HOME (톰캣 설치 폴더)/logs 폴더 밑에 로그 파일에 log가 등록된 것을 확인 할 수 있음

               ㉡ public void log(String msg, java.lang.Throwable exception)
                   - 파라미터로 지정된 문자열 msg를 서블릿/jsp 컨테이너에 지정도니 서블릿 로그 파일에 해당 어플리케이션 실
                     행 도중 발생한 이벤트 로그를 기록하고 예외 객체 exception을 함께 넘겨줌
                   - 기본적으로 두번째 파라미터의 예외 스택 트레이스 정보를 로그 파일에 함께 기록해줌

    ⑥ out 객체
         ㈀ JSP 파일에 대한 서블릿이 요청을 처리하여 응답을 전송할 때 전송할 응답에 대한 출력 스트림 객체
         ㈁ out 객체는 java.io.Writer를 상속한 javax.servlet.jsp.JspWriter라는 추상(absract) 클래스 타입 객체로
             실제로는 JSP 컨테이너 제공자가 자신의 JSP 컨테이너에 맞게 최적화된 클래스 객체로 제공
         ㈂ JspWriter 클래스는 java.io.printWriter 메소드가 정의하고 있는  print() 메소드나 println() 메소드 계열의 메소드를
             구현하고 있음.
         ㈃ 간단한 소스 보면..
            

           

           
             ※ 스클립틀릿에 대해서는 "JSP 구조" 정리 했을 때 한번 언급하였지만 스클립틀릿은 표현식에는 ";" 세미콜론을
                 붙이지 않는다. 그 이유에 대해서는 스클립틀릿이 서블릿 파일로 생성될때 out 객체에 바로 들어가기 때문이다.
                 위에 전자 예를 들자면
                 - 전자에 대한 서블릿 파일을 확인하면  out.print( sum );  이런식으로 들어가 있다. 만일 세미콜론을 사용하면
                    out.print(sum;); 이런식으로 되어 자바 문법에 맞이 않아 에러가 납니다.
                 - 후자에 대한 서블릿 파일을 확인하면  out.print(sum + "<br>"); 이런식으로 들어가 있을 것입니다.
                 - 전자보다는 후자가 더 좋은 장점을 가지고 있다. 전자는 프리젠테이션 로직(UI 로직)과
                    비즈니스 로직(어플리케이션)이 잘 구별되지 않은 예라 할 수 있으며 후자는 그렇지 않다는 의미

         ㈄ out 객체에서 사용할 수 있는 javax.servlet.jsp.JspWriter 클래스의 주요 메소드
             ㉠ public abstract void clear() throws IOException
                 - 출력 버퍼에 저장된 내용을 비워준다. 만약 버퍼가 flush되어 이미 클라이언트로 전송된 경우 IOException을 발생
                    즉 clear()를 호출하였을 때 IOException이 발생하였다면 이는 이미 이전의 출력 버퍼 내용이 flush되어 클라이언
                    트로 전송되었기 때문에 정상적으로 출력 버퍼를 비우지 못했다는 의미
                 -  표현은
                     out.clear();
                 -  실개발시에는 사용할 일이 거의 없지만 원리를 알아두는 차원에서 접근하길 바랍니다.
                     out.clear() 가장 많이 일어나는 곳은  pageContext.forward(String path) 경우에 가장 많이 일어난다.
                    
             ㉡ public boolean isAutoFlush()
                 - 출력 버퍼가 다 채워진 경우 자동으로 버퍼 내용을 flush하여 클라이언트로 전송하도록 지정된 경우 true
                    그렇지 않고 출력 버퍼가 다 채워진 경우 IOException을 발생하는 경우라면 false를 리턴한다.
                 - authFlush 속성에 지정된 값을 리턴
                 - 표현은
                    out.isAutoFlush() → 결과값은 true, false
          
             ㉢ public int getBufferSize()
                  - 바이트 단위로 지정된 버퍼의 크기를 int로 리턴한다. 버퍼를 사용하지 않는 경우 0을 리턴
                    (page 지시어의 buffer 속성을 'none'으로 지정한 경우)
                  - 보통은 8kb(8192) 가 출력됩니다.(기본값),
                     pageContext = _jspxFactory.getPageContext(this, request, response,  null, true, 8192, true); ← buffer size
                  - 표현은 
                     out.getBufferSize()

             ㉣ public abstract int getRemaining()
                  - 바이트 단위로 버퍼의 남은 양을 int로 리턴한다.
                  - 표현은
                    out.getRemaining()
                 
             ㉤ public abstract void clearBuffer() throws IOExceptioin
                 - 현재 출력 버퍼에 저장된 내용을 버리겠다는 의미 clear() 메소드와는 달리 이전에 flush되었다 하더라도
                   IOException을 발생하지 않는다. 단순히 현재 저장된 버퍼의 내용을 취소하겠다는 의미이지만 입출력시
                   문제가 발생하면 IOException이 발생
                 - 표현은
                    out.clearBuffer()
                 - 서블릿파일에 _jspSerivce() 메소드에서 clearBuffer() 메소드를 확인할 수 있다.

                    try {
                       response.setContentType("text/html");
                       pageContext = _jspxFactory.getPageContext(this, request, response,null, true, 8192, true);
                       _jspx_page_context = pageContext;
                      application = pageContext.getServletContext();
                      config = pageContext.getServletConfig();
                      session = pageContext.getSession();
                      out = pageContext.getOut();
                      _jspx_out = out;
                       
                      - 생략 -
   
                      } catch (Throwable t) {
                          if (!(t instanceof SkipPageException)){
                             out = _jspx_out;
                             if (out != null && out.getBufferSize() != 0)
                                try { out.clearBuffer(); } catch (java.io.IOException e) {}
                                if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
                             }
                     } finally {
                          _jspxFactory.releasePageContext(_jspx_page_context);
                     }

             ㉥ public abstract void flush() throws IOException
                 - 현재까지 출력 버퍼에 내용을 flush하여 클라이언트로 전송한다. 해당 출력 스트림 클라이언트 응답으로 직접
                    전달되지 않고 다른 출력 스트림으로 전달되는 경우 해당 출력스트림도 같이 flush 된다.
                 - 하나의 출력 스트림에 대해 여러 개의 다른 출력 스트림이 연결(chaining)된 경우 전체가 다 flush되도록 한다.
                 - 표현은
                    out.flush()
             ㉦ public abstract void close() throws IOException
                 - 출력 버퍼의 내용을  flush하고 스트림을 닫는다.
                 - 표현은
                   out.close()
   
    ⑦ config 객체
       ㈀ jsp 페이지에 대한 서블릿 인스턴스가 참조하게 될 초기 데이터에 대한 정보를 담고 있는 객체
            (JSP 페이지 대한 설정정보를 저장하고 있는 객체)
       ㈁ 사실 jsp의 경우 미리 컴파일된 서블릿으로 사용되지 않고 일반적으로 요청시 jsp 컨테이너가 관리하는 페이지
           컴파일 서블릿에 의해 동적으로 서블릿 코드가 생성되기 때문에 거의 사용할 일은 없다.
       ㈂ jsp 파일에 대한 컴파일된 서블릿미리 생성하여 jsp 컨테이너가 실행될 때 같이 메모리에 로드되게 할 수도 있으며
           이 경우 JSP 컨테이너 설정 파일에 ini 파라미터로 지정된 초기 설정 데이터를 얻는데 사용하기도 한다.
       ㈃ config는 javax.servlet.SERvletConfig 인터페이스 쿨래스의 객체
       ㈄ config 주요 메소드

          ㉠ public String getInitParameter(String init_paramName)
              - 서블릿/jsp 컨테이너 설정 파일에 지정된 ini_paramName 초기 파라미터의 값을 문자열로 리턴
              - init_paramName의 이름으로 지정된 초기 파라미터가 없는 경우 null을 리턴
                
          ㉡ public Enumeration getInitParameterNames()
              - 서블릿/jsp 컨테이너 설정 파일에 지정된 초기 파라미터 이름은 Enumeration으로 리턴
              - 지정된 초기 파라미터가 없는 경우 element가 없는 빈 Enumeration을 리턴

          ㉢ ㉠~㉡ 예 예제 소스를 보고 확인한다. (http://cafe.naver.com/tonkjsp/35 ← 파일 다운로드 하여 실행)
         

            

 

           

                    

    ⑧ page 객체
        ㈀ JSP 페이지에 생성되는 서블릿 인스턴스 객체를 참조하는 레퍼런스
            (JSP 페이지를 구현한 자바 클래스 객체)
        ㈁ HttpJspPage 인터페이스 _jspService() 메소드를 정의하고 있으며 실제로 _jspService() 메소드가 클라이언트 요청
            처리하는 메소드
        ㈂ page는 바로 _jspService() 메소드 내에서 다음과 같이 할당되어 내장 객체로 제공
            public void _jspService (HttpServletRequest req, HttpServlet Response res){
                 -- 생략 --
                Object page = this
                --  생략 --
           }
        ㈃ 해당 페이지 서블릿 인스턴스 자체를 나태내는 객체이다. JSP 파일의 스크립트 언어가 java인 경우 해당 페이지
            서블릿 메소드 내에서 사용되는 'this' 동일하다.

        ㈄ 해당 스크립트 코드에서 내장 객체를 page를 사용하여 페이지 서블릿 인스턴스의 객체를 접근, 다른
            스크립트 언어를 통해서 최소한 javax.servlet.jsp.JspPage 인터페이스의 메소드를 사용가능하게 됨

        ㈅ 예제 소스를 보고 확인하길 바랍니다. (http://cafe.naver.com/tonkjsp/36  다운 받아서 결과 확인)
           
    ⑨ exception 객체
        ㈀  JSP 페이지 작성자가 페이지에서 발생한 예외를 처리할 페이지를 지정한 경우 지정된 에러 페이지에 전달되는 예외
             객체
        ㈁ page 지시어의 isErrorPage 속성이 true로 지정된 JSP 페이지에서만 묵시적으로 사용가능한 내장 객체
        ㈂ 기본값은 false이기 때문에 isErrorPage 속성을 지정하지 않은 페이지에서는 사용불가
        ㈃ 내장객체 exception은 java.lang.Throwable(java.lang.Exception과 java.lang.Error의 수퍼클래스)로 정의됨
        ㈄ exception 객체의 주요 메소드
           ㉠ public String getMessage()
               - 에러 메시지를 문자열로 리턴한다.
           ㉡ public void printStackTrace()
               - 에러 출력 스트림(System.err)으로 스택 트레이스 정보를 출력한다.
           ㉢ public void printStackTrace(java.io.PrintWriter out)
               - 스택 트레이스 정보를 파라미터로 지정된 PriintWriter 객체 out으로 출력한다.
           ㉣ public void printStackTrace(java.io.PrintStream out)
               - 스택 트레이스 정보를 파라미터로 지정된 PrintStream 객체 out으로 출력한다.

         ㈅ 예제 소스를 보고 확인하길 바랍니다. (http://cafe.naver.com/tonkjsp/37   다운 받아서 결과 확인)