Web언어/JSP

[JSP] JSP의 역할

IT록흐 2022. 1. 30. 09:29
반응형

 

HTML 문서를 Dynamic하게 

만드는 언어 중 하나가 JSP이다.

 

이번 포스팅에서는

 HTML 문서를 Dynamic하게 만드는 과정에서

JSP의 역할을 알아보겠다.

 

 

HTML 문서를 서블릿(Servlet)으로 만들기

 

 

HTML문서는 태그로만 이루어져서

정적(Static)이다.

 

변수나 메소드를 갖지 못하고

연산도 하지 못한다.

 

 

 

 

 

그래서 

클라이언트가 경로를 통해

HTML 문서에 접근하면

 

웹서버는 HTML 문서를

웹브라우저에게 보내고

 

웹브라우저는 HTML 코드를 파싱하여

브라우저에 표현한다.

 

이 과정에서 

Dynamic한 요소란 없다.

 

 

그럼 JSP를 보자.

 

 

 

 

클라이언트가 JSP 문서에 접근하면

WAS는 jasper라는 프로그램을 돌려

JSP문서를 서블릿 파일로 변환한다.

 

서블릿이란

JAVA언어로 작성된 클래스 파일로

Dynamic한 성질을 불어넣는다.

 

정리하면,

 

JSP문서는 HTML 문서에서

Dynamic해야 할 부분을 표시한다.

 

클라이언트가 접근하면

jasper는 표시된 부분을 고려하여

서블릿으로 만들고

 

서블릿을 실행하여 Dynamic한 부분이 처리 된

HTML 코드를 웹브라우저에게 반환한다.

 

 

실습

 

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
	<%= 3+4 %> <!-- Dynamic한 부분 -->
</body>
</html>

 

 

JSP문서이다.

 

JSP문서는 HTML 문서와 달리,

3+4 가 연산되어 출력된다.

 

 

 

 

 

JSP문서는 Jasper 프로그램에 의해

서블릿 클래스 파일로 변환된다. 

 

 

 

 

이와 같이

JSP 파일은 JAVA 언어로 작성된

서블릿 파일로 변환된다. 

 

이를 자세히 살펴보자.

 

 

package org.apache.jsp;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;

public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent,
                 org.apache.jasper.runtime.JspSourceImports {

  private static final javax.servlet.jsp.JspFactory _jspxFactory =
          javax.servlet.jsp.JspFactory.getDefaultFactory();

  private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;

  private static final java.util.Set<java.lang.String> _jspx_imports_packages;

  private static final java.util.Set<java.lang.String> _jspx_imports_classes;

  static {
    _jspx_imports_packages = new java.util.HashSet<>();
    _jspx_imports_packages.add("javax.servlet");
    _jspx_imports_packages.add("javax.servlet.http");
    _jspx_imports_packages.add("javax.servlet.jsp");
    _jspx_imports_classes = null;
  }

  private volatile javax.el.ExpressionFactory _el_expressionfactory;
  private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager;

  public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
    return _jspx_dependants;
  }

  public java.util.Set<java.lang.String> getPackageImports() {
    return _jspx_imports_packages;
  }

  public java.util.Set<java.lang.String> getClassImports() {
    return _jspx_imports_classes;
  }

  public javax.el.ExpressionFactory _jsp_getExpressionFactory() {
    if (_el_expressionfactory == null) {
      synchronized (this) {
        if (_el_expressionfactory == null) {
          _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
        }
      }
    }
    return _el_expressionfactory;
  }

  public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {
    if (_jsp_instancemanager == null) {
      synchronized (this) {
        if (_jsp_instancemanager == null) {
          _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
        }
      }
    }
    return _jsp_instancemanager;
  }

  public void _jspInit() {
  }

  public void _jspDestroy() {
  }

  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
      throws java.io.IOException, javax.servlet.ServletException {

    if (!javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
      final java.lang.String _jspx_method = request.getMethod();
      if ("OPTIONS".equals(_jspx_method)) {
        response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
        return;
      }
      if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method)) {
        response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
        response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSP�뱾�� �삤吏� GET, POST �삉�뒗 HEAD 硫붿냼�뱶留뚯쓣 �뿀�슜�빀�땲�떎. Jasper�뒗 OPTIONS 硫붿냼�뱶 �삉�븳 �뿀�슜�빀�땲�떎.");
        return;
      }
    }

    final javax.servlet.jsp.PageContext pageContext;
    javax.servlet.http.HttpSession session = null;
    final javax.servlet.ServletContext application;
    final javax.servlet.ServletConfig config;
    javax.servlet.jsp.JspWriter out = null;
    final java.lang.Object page = this;
    javax.servlet.jsp.JspWriter _jspx_out = null;
    javax.servlet.jsp.PageContext _jspx_page_context = null;


    try {
      response.setContentType("text/html; charset=EUC-KR");
      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;

      out.write("\r\n");
      out.write("<!DOCTYPE html>\r\n");
      out.write("<html>\r\n");
      out.write("<head>\r\n");
      out.write("<meta charset=\"EUC-KR\">\r\n");
      out.write("<title>Insert title here</title>\r\n");
      out.write("</head>\r\n");
      out.write("<body>\r\n");
      out.write("	<h1> ");
      out.print( 3+4 );
      out.write("</h1>\r\n");
      out.write("</body>\r\n");
      out.write("</html>");
    } catch (java.lang.Throwable t) {
      if (!(t instanceof javax.servlet.jsp.SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try {
            if (response.isCommitted()) {
              out.flush();
            } else {
              out.clearBuffer();
            }
          } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
        else throw new ServletException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}

 

 

이와 같이,

JSP 문서파일은 JAVA 언어로 작성된 파일로 변환된다.

HTML로 출력되는 부분을 자세히 살펴보자.

 

 

 public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
      throws java.io.IOException, javax.servlet.ServletException {

    //... 중략 ....

      out.write("\r\n");
      out.write("<!DOCTYPE html>\r\n");
      out.write("<html>\r\n");
      out.write("<head>\r\n");
      out.write("<meta charset=\"EUC-KR\">\r\n");
      out.write("<title>Insert title here</title>\r\n");
      out.write("</head>\r\n");
      out.write("<body>\r\n");
      out.write("	<h1> ");
      out.print( 3+4 );     // 3+4 연산
      out.write("</h1>\r\n");
      out.write("</body>\r\n");
      out.write("</html>");
    
    //  .. 중략 ...
  }

 

 

 

_jspService 메소드는 HTTP request 객체를 와 HTTP response 객체를 제어한다. HTML 코드를 웹브라우저로 출력하는 객체 out은 HTML 코드는 write 함수로 문자열 출력하고 3+4는 print 함수 연산한 뒤 출력한다.

 

 

 

3+4가 연산되어 7이 출력된 모습이다.

 

 

 

 

정리하면,

Web Application Server는 JSP 문서를 서블릿으로 변환한 후, Dynamic한 요소를 처리하고 HTML 코드 출력하여 웹브라우저에게 반환한다.

 

고로, JSP 문서란 jasper가 처리할 Dynamic한 부분을 개발자가 표시한 문서이다. 다음 포스팅에서는 JSP문서 작성 방법을 구체적으로 다루어보겠다.

 

 


 

참고자료

 

 

반응형

'Web언어 > JSP' 카테고리의 다른 글

[JSP] JSP 코드블록  (0) 2022.01.31
[JSP] 동적(Dynamic) 페이지란?  (0) 2022.01.29
[ JSP ] 상태 유지 ( Session, Cookie )  (0) 2022.01.25
[ JSP ] 인코딩(Encoding) 설정  (0) 2021.06.21
[ JSP ] 인코딩(Encoding)을 하는 이유  (3) 2021.06.21