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, 8192 , true );
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, 8192 , true );
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 방식을 지정하는 속성
|