JSP는 어떻게 작동할까?

2025. 3. 8. 21:13·개발/JSP

JSP(JavaServer Pages)는 HTML, XML 등의 마크업 언어 내에 Java 코드를 삽입하여 동적인 웹 페이지를 생성하는 서버 사이드 스크립트 기술이다.

1. JSP의 동작 원리:

  1. 클라이언트 요청: 웹 브라우저(클라이언트)가 .jsp 페이지를 요청.
  2. JSP 컨테이너 처리: WAS(Web Application Server) 내의 JSP 컨테이너가 요청을 받음.
  3. 서블릿 변환: JSP 컨테이너는 JSP 파일을 Servlet 코드로 변환(컴파일).
    • JSP 파일의 HTML 부분은 그대로 출력 스트림에 쓰여짐.
    • JSP 스크립트 요소(스크립틀릿, 표현식, 선언문)는 Java 코드로 변환되어 _jspService() 메서드 내에 배치됨.
    • JSP 지시어(directive)는 JSP 컨테이너가 서블릿을 생성하는 방식에 영향을 줌.
  4. 서블릿 컴파일: 변환된 Java Servlet 코드는 .class 파일(바이트 코드)로 컴파일됨.
  5. 서블릿 실행: 컴파일된 서블릿이 실행되어 동적인 콘텐츠를 생성.
  6. 응답: 생성된 HTML, XML 등의 결과가 웹 브라우저에 응답으로 전송됨.
  7. JSP 페이지가 처음 요청될 때만 3,4번 과정(변환 및 컴파일)을 수행합니다. 이후 동일한 페이지에 대한 요청은 이미 컴파일된 서블릿을 재사용하므로 더 빠르게 처리됨. JSP 파일이 변경되면 다시 변환 및 컴파일 과정을 거친다.

 

2. 코드 예시

JSP 파일

Java
 
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP Template Engine Example</title>
</head>
<body>
  <h1>JSP 템플릿 엔진 예제</h1>

  <%-- 정적인 HTML 부분 --%>
  <p>이 부분은 정적인 HTML입니다.</p>

  <%-- 동적인 부분 (JSP 스크립트 요소) --%>
  <%
    // 스크립틀릿: Java 코드
    String username = request.getParameter("name");
    if (username == null) {
      username = "Guest";
    }

    int hour = java.util.Calendar.getInstance().get(java.util.Calendar.HOUR_OF_DAY);
    String greeting;
    if (hour < 12) {
      greeting = "Good morning";
    } else if (hour < 18) {
      greeting = "Good afternoon";
    } else {
      greeting = "Good evening";
    }
  %>

  <%-- 표현식: Java 코드의 결과를 출력 --%>
  <p><%= greeting %>, <%= username %>!</p>

  <%-- 정적인 HTML 부분 --%>
  <p>이 부분도 정적인 HTML입니다.</p>
</body>
</html>

 

Servlet 변환 예시

Java
 
// example_jsp.java (JSP 컨테이너가 생성하는 서블릿 코드 - 개념적인 예시)

package org.apache.jsp; // 실제 패키지명은 다를 수 있음

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

public final class example_jsp extends org.apache.jasper.runtime.HttpJspBase {

  // 선언문 (<%! ... %>)에 정의된 내용은 여기에 멤버 변수/메서드로 들어감

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

    response.setContentType("text/html; charset=UTF-8");
    PrintWriter out = response.getWriter();

    // 정적인 HTML 부분은 out.write()로 출력
    out.write("<!DOCTYPE html>\n");
    out.write("<html>\n");
    out.write("<head>\n");
    out.write("<meta charset=\"UTF-8\">\n");
    out.write("<title>JSP Template Engine Example</title>\n");
    out.write("</head>\n");
    out.write("<body>\n");
    out.write("  <h1>JSP 템플릿 엔진 예제</h1>\n");
    out.write("  <p>이 부분은 정적인 HTML입니다.</p>\n");

    // 스크립틀릿 (<% ... %>) 안의 Java 코드는 그대로 삽입
    String username = request.getParameter("name");
    if (username == null) {
      username = "Guest";
    }

    int hour = java.util.Calendar.getInstance().get(java.util.Calendar.HOUR_OF_DAY);
    String greeting;
    if (hour < 12) {
      greeting = "Good morning";
    } else if (hour < 18) {
      greeting = "Good afternoon";
    } else {
      greeting = "Good evening";
    }

    // 표현식 (<%= ... %>)은 out.print()로 출력
    out.write("  <p>");
    out.print( greeting );
    out.write(", ");
    out.print( username );
    out.write("!</p>\n");

      // 정적인 HTML 부분은 out.write()로 출력
    out.write("  <p>이 부분도 정적인 HTML입니다.</p>\n");
    out.write("</body>\n");
    out.write("</html>\n");
  }
}

 

 

저작자표시 비영리 변경금지 (새창열림)

'개발 > JSP' 카테고리의 다른 글

JSP 내장객체와 주요 매서드  (0) 2025.03.08
<%@ include %> vs <jsp:include >  (0) 2025.03.08
JSP 액션태그  (0) 2025.03.08
JSP 지시어와 스크립트 요소  (0) 2025.03.08
JSP - EL(Expression Language)  (0) 2025.03.05
'개발/JSP' 카테고리의 다른 글
  • <%@ include %> vs <jsp:include >
  • JSP 액션태그
  • JSP 지시어와 스크립트 요소
  • JSP - EL(Expression Language)
함수형 인간
함수형 인간
잘 까먹는 개발자의 두뇌 확장 장치
  • 함수형 인간
    개발 기록 노트
    함수형 인간
  • 글쓰기 관리
  • 전체
    오늘
    어제
    • 글 목록 (84)
      • 기타 (1)
      • 개발 (82)
        • Java (6)
        • Javascript (1)
        • Spring (20)
        • jQuery (0)
        • Git (0)
        • servlet (11)
        • JSP (6)
        • HTML (0)
        • CSS (10)
        • SQL (9)
        • JSTL (3)
        • Mybatis (4)
        • Design Patterns (0)
        • HTTP (2)
        • Devtools (0)
        • IntelliJ (5)
        • JDBC (1)
        • Lombok (3)
        • Logging (1)
      • 책 리뷰 (0)
  • hELLO· Designed By정상우.v4.10.3
함수형 인간
JSP는 어떻게 작동할까?
상단으로

티스토리툴바