jb.log

..loading

Jsp -> Servlet 변환

September 27, 2019

웹 어플리케이션에 배포된 jsp 페이지는 최초 클라이언트 요청이 들어올 때 servlet으로 변환된다.

변환되는 내용은 다음과 같다.

  • Scriptlet <% %> 에 작성된 소스는 변환된 Servlet의 service() 메서드 안에 들어간다.
  • 표현식은 변환된 servlet의 service() 메서드 안에서 out.print() 으로 변환된다.
  • 선언문에 작성된 소스는 변환된 servlet의 맴버 영역에 생성 (변수 선언시 맴버변수, 메서드 선언시 맴버매서드)
  • 일반 HTML 태그들은 변환된 servlet의 service() 메서드 안에 out.write() 메서드로 변환된다.
  • page 디렉티브의 속성값들은 servlet으로 변환시 참고할 정보로 활용된다.

위의 문장으로는 이해하기 힘들 수도 있다. 다음 예제를 보자.

jsp -> servlet 변환 예제

<!-- index.jsp -->
<!-- 일반 html 코드 : out.write() 내부에 작성  -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<%! //선언문 : class 전역에 생성
  String name = "gojaebeom";
  int age = 26;
%>
<html>
  <head>
    <meta charset="UTF-8">
    <title>example page</title>
  </head>
  <body>
    <!-- 표현식: out.println() 내부에서 사용 -->
    <p>제 이름은 <%= name %> 이고 나이는 <%= age  %> 입니다.
  </body>
</html>

위와 같은 jsp 파일을 만들었다고 가정하면 index.jsp 파일은 jsp 컨테이너에 의해 index_jsp.java 파일로 변환된다. 변환되는 부분이 많아 중간 중간 생략하여 보이겠다.

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

  //선언문의 내용은 class의 전역에서 사용
  String name = "gojaebeom";
  int age = 26;

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

    //jsp의 내장 객체들
    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;

    //page 디렉티브의 속성값
    response.setContentType("text/html; charset=UTF-8");

    //html 태그들은 out.write로 사용
    out.write("\r\n");
    out.write("<!DOCTYPE html>\r\n");
    out.write("\r\n");
    out.write("<html>\r\n");
    out.write("<head>\r\n");
    out.write("<meta charset=\"UTF-8\">\r\n");
    out.write("<title>example page</title>\r\n");
    out.write("</head>\r\n");
    out.write("<body>\r\n");
    out.write("\t<p>제 이름은 ");

    //표현식은 out.print로 사용
    out.print( name );
    out.write(" 이고 나이는 ");

    //표현식은 out.print로 사용
    out.print( age  );
    out.write(" 입니다.\r\n");
    out.write("</body>\r\n");
    out.write("</html>");
  }
}

원래 더 많은 소스코드들이 포함되어 있지만 설명을 위해 부분부분 제거하였다. 위 index_jsp.java 예제를 보면 index_jsp 클래스가 org.apache.jasper.runtime.HttpJspBase 를 상속하고 있는데 HttpJspBaseHttpServlet을 상속하고 있는 클래스이므로 서블릿이라고 할 수 있다.

Tip 이클립스 기준으로 jsp 파일을 만들면 사용되는 것은 개발 프로젝트 폴더 내부의 jsp 파일이 아니다. 이클립스 내부의 톰캣은 톰캣의 사본을 만들어 프로젝트들을 관리하게 되는데, 기본 작업폴더에 metadata\.plugins\org.eclipse.wst.server.core 폴더에 tmp0 또는 tmp1~ 의 폴더 내부의 work 폴더가 있다. work가 바로 servlet 파일로 변환된 jsp 들을 관리 하는 폴더이다. 우리가 개발을 하며 봐온 jsp 파일은 바로 work 하위 디렉토리에 있는 servlet 파일이다.

servlet 변환 과정

image

# 해당 글은 개인적인 공부 내용을 정리하는 것을 목적으로 하고있습니다.# 설명이 다소 부족하거나 중간 내용이 생략될 수 있습니다.

Other Posts

October 1, 2019
jsp 프로젝트 만들기 - mvc1, mvc2
이전에 만든 `board-detail.jsp`은 DB와 잘 연결되어 화면에 데이터를 잘 출력하는 것을 볼 수 있다. 하지만 jsp 파일 내의 코드를 보면 자바코드와 html코드가 뒤엉켜 있는 것을 볼 수 있다. 이것을 스파게티 코드라 한다.
September 29, 2019
jsp 프로젝트 만들기 - 시작
본격적으로 jsp를 이용한 servlet 프로젝트를 만들어보겠다. jsp와 servlet의 활용 목적이 주된 내용이기 html/css 는 가급적 손대지 않고 비즈니스 로직에 집중하도록 하겠다.
September 25, 2019
jsp 프로그래밍
jsp란 `Java Server Pages` 의 약자이며 HTML 코드에 JAVA 코드를 넣어 동적웹페이지를 생성하는 웹어플리케이션 도구이다.
September 24, 2019
Servlet 상태관리
서블릿은 요청이 오면 응답을 주고 메모리에서 사라지기 때문에 서블릿들 간의 연결이 불가능하다. 만약 기존의 데이터를 저장할 일이 생겼다고 하면 서블릿 스스로 저장할 수 있는 것은 아니다. 이것은 ServletContext로 해결할 수 있다.
September 22, 2019
한글 인코딩
servlet 클래스에서 한글을 출력하면 한글이 깨지는 것을 볼 수 있다. 해당 문제점은 다음과 같이 해결할 수 있다.
September 20, 2019
Servlet 다루기
기존의 html 문서만으로는 동적인 내용을 전달할 수 없다. 때문에 WAS(web application server) 에서 동작하는 프로그래밍 언어를 사용하면 가능하다.