JSP(JavaServer Pages)는 HTML, XML 등의 마크업 언어 내에 Java 코드를 삽입하여 동적인 웹 페이지를 생성하는 서버 사이드 스크립트 기술이다.
1. JSP의 동작 원리:
- 클라이언트 요청: 웹 브라우저(클라이언트)가 .jsp 페이지를 요청.
- JSP 컨테이너 처리: WAS(Web Application Server) 내의 JSP 컨테이너가 요청을 받음.
- 서블릿 변환: JSP 컨테이너는 JSP 파일을 Servlet 코드로 변환(컴파일).
- JSP 파일의 HTML 부분은 그대로 출력 스트림에 쓰여짐.
- JSP 스크립트 요소(스크립틀릿, 표현식, 선언문)는 Java 코드로 변환되어 _jspService() 메서드 내에 배치됨.
- JSP 지시어(directive)는 JSP 컨테이너가 서블릿을 생성하는 방식에 영향을 줌.
- 서블릿 컴파일: 변환된 Java Servlet 코드는 .class 파일(바이트 코드)로 컴파일됨.
- 서블릿 실행: 컴파일된 서블릿이 실행되어 동적인 콘텐츠를 생성.
- 응답: 생성된 HTML, XML 등의 결과가 웹 브라우저에 응답으로 전송됨.
- 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 |