상세 컨텐츠

본문 제목

[두번째] JSP 란 ?

Java/JSP

by 탑~! 2012. 5. 17. 11:31

본문

jsp가 실행되면 .java 와 .class로 변환되어 그에 따라 페이지를 동적으로 생성한다. 

미리 준비한 문서가 아닌 새로운 문서를 만들어서 보여준다는 것.

 

 hello.jsp

 <html><head><title>Hello JSP</title></head><body>

<h1> Hello JSP Test</h1>

<%

out.println("<font color=blue>Hello World! JSP</font>");

%>

</body></html>

 hello$jsp.java

 

package org.apache.jsp;  
import javax.servlet.*;  
import javax.servlet.http.*;  
import javax.servlet.jsp.*;  
import org.apache.jasper.runtime.*;  
public class hello$jsp extends HttpJspBase {  
    
static {}  
    
public hello$jsp( ) {}  
    
private static boolean _jspx_inited = false 
    
public final void _jspx_init() throws org.apache.jasper.runtime.JspException {}  
    
public void _jspService(HttpServletRequest request, HttpServletResponse  response)  
        
throws java.io.IOException, ServletException {  
        JspFactory _jspxFactory = null 

        PageContext pageContext = 
null 
        HttpSession session = 
null 
        ServletContext application = 
null 
        ServletConfig config = 
null 
        JspWriter out = 
null 
        Object page = 
this 
        String  _value = 
null 
        
try  
            
if (_jspx_inited == false) {  
                
synchronized (this) {  
                    
if (_jspx_inited == false) {  
                        _jspx_init();  
                        _jspx_inited = 
true 
                    }  
                }  
            }  
            _jspxFactory = JspFactory.getDefaultFactory();  
            response.setContentType(
"text/html;charset=ISO-8859-1");  
          pageContext = _jspxFactory.getPageContext(this, request, response, 
"", true, 8192true);  
            application = pageContext.getServletContext();  
            config = pageContext.getServletConfig();  
            session = pageContext.getSession();  
            out = pageContext.getOut();  
            
// HTML // begin [file="/hello.jsp";from=(0,0);to=(2,0)]  
                
out.write("<html><head><title>Hello JSP</title></head><body>\r\n 
<h1> Hello JSP Test</h1>\r\n"
);  
            
// end  
            // begin [file="/hello.jsp";from=(2,2);to=(4,0)]  
                  
out.println("<font color=blue>Hello World! JSP</font>");  
            
// end  
            // HTML // begin [file="/hello.jsp";from=(4,2);to=(8,0)]  
                
out.write("\r\n</body></html>\r\n\r\n\r\n");  
            
// end  
        
catch (Throwable t) {  
            
if (out != null && out.getBufferSize() != 0 
                out.clearBuffer();  
            
if (pageContext != null) pageContext.handlePageException(t);  
        } 
finally  
            
if (_jspxFactory != null) _jspxFactory.releasePageContext(pageContext);  
        }  
    }  
}

 

jsp가 .java로 변환되고 .class파일로 컴파일 되어 디렉토리 안에 들어있다.

 

필요한 클래스가 있는 몇 가지 패키지를 import하고 있다.

 import javax.servlet.*;

 import javax.servlet.http.*;

 import javax.servlet.jsp.*;

 import org.apache.jasper.runtime.*;

 

그리고 hello$jsp클래스는 HttpJspBase를 상속하고 있다.

  public class hello$jsp extends HttpJspBase

 

hello$jsp클래스의 생성자 부분, _jspx_init메서드가  비어 있다.

 public hello$jsp( ) {}

 public final void _jspx_init() throws org.apache.jasper.runtime.JspException {}

 

그리고 가장 많은 부분을 차지하는 _jspService메서드.

    public void _jspService(HttpServletRequest request, HttpServletResponse  response)      

 throws java.io.IOException, ServletException {

 

 _jspService메서드는 HttpServletRequest와 HttpServletResponse형의 매개 변수를 가지고 있다.

그리고 jsp파일 내에 직접 코딩한 내용이 아래와 같이 변환되어 있다.

 

 _jspService메서드의 일부분

 // HTML // begin [file="/hello.jsp";from=(0,0);to=(2,0)] 
out.write("<html><head><title>Hello JSP</title></head><body>\r\n<h1> Hello JSP Test</h1>\r\n"); 
// end 
// begin [file="/hello.jsp";from=(2,2);to=(4,0)] 
out.println("<font color=blue>Hello World! JSP</font>"); 
// end 
// HTML // begin [file="/hello.jsp";from=(4,2);to=(8,0)] 
out.write("\r\n</body></html>\r\n\r\n\r\n"); 
// end

 

일반적인 html태그들과 <% %>태그 내에 있던 모든 요소들이 out객체에 의해서 기록되고 있는 부분.

물론, out은 _jspService내의 지역 변수.

* html태그들과 <% %>태그 내에 있던 모든 요소들이 _jspService내에 삽입된다.

 

 _jspService메서드구조

_jspService()메서드는 매개변수로 request와 response를 갖는다.

request는 HttpServletRequest형, response는 HttpServletResponse형.

 

 _jspService메서드 부분

 public void _jspService(HttpServletRequest request, HttpServletResponse  response) 
        
throws java.io.IOException, ServletException { 
        JspFactory _jspxFactory = 
null; 
        PageContext pageContext = 
null; 
        HttpSession session = 
null; 
        ServletContext application = 
null; 
        ServletConfig config = 
null; 
        JspWriter out = 
null; 
        Object page = 
this; 
        String  _value = 
null; 
        
try { 
            
if (_jspx_inited == false) { 
                
synchronized (this) { 
                    
if (_jspx_inited == false) { 
                        _jspx_init(); 
                        _jspx_inited = 
true; 
                    } 
                } 
            } 
            _jspxFactory = JspFactory.getDefaultFactory(); 
            response.setContentType(
"text/html;charset=ISO-8859-1"); 
            pageContext = _jspxFactory.getPageContext(this, request, response, 
"",true, 8192true); 
            application = pageContext.getServletContext(); 
            config = pageContext.getServletConfig(); 
            session = pageContext.getSession(); 
            out = pageContext.getOut(); 
            
// HTML // begin [file="/hello.jsp";from=(0,0);to=(2,0)] 
            
out.write("<html><head><title>Hello JSP</title></head><body>\r\n<h1> Hello JSP Test</h1>\r\n"); 
            
// end 
            // begin [file="/hello.jsp";from=(2,2);to=(4,0)] 
                  
out.println("<font color=blue>Hello World! JSP</font>"); 
            
// end 
            // HTML // begin [file="/hello.jsp";from=(4,2);to=(8,0)] 
                
out.write("\r\n</body></html>\r\n\r\n\r\n"); 
            
// end 
        
catch (Throwable t) { 
            
if (out != null && out.getBufferSize() != 0) 
                out.clearBuffer(); 
            
if (pageContext != null) pageContext.handlePageException(t); 
        } 
finally { 
            
if (_jspxFactory != null) _jspxFactory.releasePageContext(pageContext); 
        } 
   }

 

메서드를 보면 IOException, ServletException이 선언되어 있다.

* <% %>태그와 _jspService의 지역변수

    jsp문서의 <%  %>태그 안에 들어 있는 부분은 _jspService메서드안에 삽입된다.

   <%  %> 내에서 _jspService메서드 내의 지역변수를 모두 사용할 수 있다.

 

여기에 선언된 pageContext, session, application, config, out, page와 매개변수 request, response를 내장객체라 부른다.                             

<% %>태그 내에서는 _jspService에 존재하는 out객체를 이용하여 클라이언트로 println을 하고 있다.

이것은 <% %>태그 내의 모든 내용이 _jspService내의 지역변수 아래 쪽에 위치하기 때문에 가능한 일.

 

 JSP내장객체

 ServletRequest request (HttpServletRequest request) : 클라이언트의 http요청을 담고 있는 객체

 ServletResponse response (HttpServletResponse response) : 클라이언트로 응답을 전송할 객체

 PageContext pageContext : 다른 내장객체를 얻거나, 요청을 처리할 제어권을 다른 페이지로 위임하는 객체

 HttpSession session : 클라이언트와 서버와의 세션데이터를 가지고 있는 객체

 ServletContext application : Web application이 실행되는 실행 환경에 대한 정보를 담고 있는 객체

 JspWriter out : Servlet이 요청을 처리하여 응답을 전송할 때 전송할 응답에 대한 출력 스트림 객체

 ServletConfig config : Servlet 객체가 참조하게 될 초기 설정 데이터에 대한 정보를 담고 있는 객체

 Object page (HttpJspPage) : Servlet 객체를 참조하는 레퍼런스

 Throwable exception : 예외가 발생할 경우 에러 페이지에 전달되는 객체

 

 

 

jsp파일에 코딩한 부분 모두가 _jspService메서드 안으로 들어가진 않는다.

jsp가 실행될때 하나의 클래스로 이루어진다. 그 구조는 jspinit, _jspService, jspDestroy의 3개의 메서드.

그리고 <% %>내의 모든 구문과 html코드들은 전부 _jspService로 들어가지만

클래스의 멤버메서드와 멤버변수차원에서 클래스내에 삽입할 수 있다. >> <%! %>태그. 선언문이라고 부른다.

 

* jsp에서 클래스의 멤버변수와 멤버메서드를 삽입할 때 사용하는 구문

 <%! %> 선언문, 멤버변수, 멤버메서드를 삽입할때 사용

 

 

일반적으로 클라이언트가 요청할 때 _jspService 만 호출되지만 클래스에 메서드를 삽입하여 처리할 수도 있다.

jsp는 하나의 객체를 공유하면서 _jspService만을 호출하기 때문에

<%! %>선언문 태그를 이용하여 멤버변수를 삽입하면 전역변수 역할을 하게 된다.

 

*JSP에서 라이브러리 import

패키지를 import하려면 <%@ %>지시문이라는 태그를 사용한다.

<%@ page import="java.util.*"%>  로 작성하면  import java.util.*; 와 같은 구문이 삽입되어진다.

 

<%@ %>는 클라이언트로 전송되는 응답에 직접적인 영향을 미치기 보다는 JSP컨테이너에 페이지 정보를 전달하는데 사용된다.

그중 많이 사용되는 것이 <%@ page %>, jsp페이지의 속성을 지정하는 역할.

 

 <%@ page  %> 속성

 language : jsp파일에서 사용할 스크립트 언어를 지정하는 속성

 extends : jsp파일에서 Servlet으로 변환 시 상속할 클래스를 지정하는 속성

 import : jsp파일에서 Servlet으로 변환 시 import 할 패키지를 지정하는 속성

 session : session을 유지 할 것인지 아닌지를 결정하는 속성

 buffer : out 객체를 사용 할 때 buffer를 얼마의 크기로 사용 할 것인지 아닌지의 속성

 autoFlush : buffer가 다 채워졌을 경우의 속성

 isThreadSafe : 다중 클라이언트 요청을 처리하는 속성

 info : 해당 페이지의 기능과 특징에 대한 설명을 지정하는 속성

 errorPage : 에러 발생시 에러 페이지를 알려주는 속성

 isErrorPage : 해당 페이지가 다른 페이지에서 발생한 예외를 처리할 페이지임을 알려주는 속성

 contentType : 해당 jsp파일이 클라이언트로 전송할 응답의 MINE형식을 지정하는 속성

 pageEncoding : jsp에서 Encoding시 사용할 character encoding 방식을 지정하는 속성


 

[출처] JSP(2)|작성자 kkan

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

용어정의  (0) 2012.05.17
JSP 표현언어  (0) 2012.05.17
[네번째] JSP 란?  (0) 2012.05.17
[세번째] JSP 란?  (0) 2012.05.17
JSP 란?  (0) 2012.05.17

관련글 더보기