템플릿 데이터 | 클라이언트로 출력되는 콘텐츠 HTML, JS, 스타일 시트, JSON, XML, 일반 텍스트 등 |
JSP 전용 태그 | 서블릿 생성 시 특정 자바 코드로 바뀌는 태그 |
JSP 내장 객체 | JSP에서 별도 선언 없이 사용 가능한 필수적 객체 9개 |
템플릿 데이터
- 클라이언트로 출력되는 콘텐츠
- 서블릿 코드를 생성할 때 출력문으로 바뀜
- JSP로부터 생성된 자바 서블릿 파일의 소스를 열어보면 템플릿 데이터가 자바 출력문으로 변환된 것을 확인할 수 있음
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Welcome</title>
</head>
<body>
<h1>Welcome, <%= name %>!</h1>
<p>Today is <%= new java.util.Date() %>.</p>
</body>
</html>
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE html>");
out.println("<html lang=\"en\">");
out.println("<head>");
out.println(" <meta charset=\"UTF-8\">");
out.println(" <title>Welcome</title>");
out.println("</head>");
out.println("<body>");
out.println(" <h1>Welcome, " + name + "!</h1>");
out.println(" <p>Today is " + new Date() + ".</p>");
out.println("</body>");
out.println("</html>");
out.close();
- 서블릿 파일에서 템플릿 데이터가 자바 출력문으로 변환됨
JSP 전용 태그
Directives(지시자)
- <%@ 지시자 속성="값" 속성="값" ...%>
- 지시자, 속성에 따라 자바 코드를 생성함
- JSP 지시자에는 page, taglib, include가 있음
- page 지시자 : JSP 페이지와 관련된 속성을 정의할 때 사용하는 태그
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
서블릿 파일에서는 아래와 같은 코드로 변환됨
response.setContextType("text/html;charset=UTF-8"); - taglib 지시자 : 태그 라이브러리를 선언할 때 사용되는 태그
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
- uri : 사용할 태그 라이브러리 네임스페이스 식별자 (URI)
- prefix : 태그 접두사
- page 지시자 : JSP 페이지와 관련된 속성을 정의할 때 사용하는 태그
Scriptlet Elements(스크립트릿)
- <% 자바 코드 %>
- JSP에 자바 코드를 작성할 때 스크립트릿 태그 <% %> 안에 작성
- 스크립트릿 태그 안에 작성한 코드는 서블릿 파일을 만들 때 그대로 복사됨
<%@ page contentType="text/html; charset=UTF-8" %>
<%
String name = request.getParameter("name");
if (name == null || name.isEmpty()) {
name = "Guest";
}
%>
String name = request.getParameter("name");
if (name == null || name.isEmpty()) {
name = "Guest";
}
- JSP에서 생성된 자바 서블릿 소스에 그대로 복사됨
Declarations(선언문)
- <%! %>
- 서블릿 클래스의 멤버(변수, 메소드)를 선언할 때 사용
<%@ page contentType="text/html; charset=UTF-8" %>
<%!
// 선언문: 메서드와 변수 정의
private int calculateSum(int a, int b) {
return a + b;
}
private String greeting = "Hello, JSP Declaration!";
%>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JSP Declaration Example</title>
</head>
<body>
<h1><%= greeting %></h1>
<p>The sum of 5 and 10 is: <%= calculateSum(5, 10) %></p>
</body>
</html>
- JSP에서의 작성 위치는 상관 X
- 선언문의 코드는 클래스 레벨에 선언되기 때문 → 멤버 변수 및 메서드로 변환됨
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/example")
public class ExampleServlet extends HttpServlet {
// 선언문에서 정의된 변수와 메서드
private String greeting = "Hello, JSP Declaration!";
private int calculateSum(int a, int b) {
return a + b;
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
// HTML 생성
out.println("<!DOCTYPE html>");
out.println("<html lang=\"en\">");
out.println("<head>");
out.println(" <meta charset=\"UTF-8\">");
out.println(" <title>JSP Declaration Example</title>");
out.println("</head>");
out.println("<body>");
out.println(" <h1>" + greeting + "</h1>");
out.println(" <p>The sum of 5 and 10 is: " + calculateSum(5, 10) + "</p>");
out.println("</body>");
out.println("</html>");
out.close();
}
}
Expressions(표현식)
- <%= %>
- 문자열을 출력할 때 사용됨
- 표현식 <%= %> 안에는 결과를 반환하는 자바 코드가 와야 함
- 표현식은 출력문으로 만들어짐 → 순서대로 복사되므로 순서 중요
<%@ page contentType="text/html; charset=UTF-8" %>
<%
// 변수 선언
String name = "JSP User";
int number1 = 10;
int number2 = 20;
int sum = number1 + number2;
%>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JSP Expression Example</title>
</head>
<body>
<!-- 표현식으로 값 출력 -->
<h1>Welcome, <%= name %>!</h1>
<p>The sum of <%= number1 %> and <%= number2 %> is: <%= sum %>.</p>
<p>Current time is: <%= new java.util.Date() %>.</p>
</body>
</html>
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/expressionExample")
public class ExpressionExampleServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Set response content type
response.setContentType("text/html; charset=UTF-8");
// Backend logic
String name = "JSP User";
int number1 = 10;
int number2 = 20;
int sum = number1 + number2;
Date currentDate = new Date();
// Output HTML content
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE html>");
out.println("<html lang=\"en\">");
out.println("<head>");
out.println(" <meta charset=\"UTF-8\">");
out.println(" <title>JSP Expression Example</title>");
out.println("</head>");
out.println("<body>");
out.println(" <h1>Welcome, " + name + "!</h1>");
out.println(" <p>The sum of " + number1 + " and " + number2 + " is: " + sum + ".</p>");
out.println(" <p>Current time is: " + currentDate + ".</p>");
out.println("</body>");
out.println("</html>");
out.close();
}
}
- JSP 표현식 안의 자바 코드가 프린트 출력문의 인자값으로 복사됨
- 따라서 표현식 안에는 out.println()의 인자값으로 가능한 자바 코드가 와야 함
JSP Action
- JSP에서 기본으로 제공하는 태그들의 집합
- JSP 2.2에서 제공하는 Standard Action 목록
액션 | 설명 |
<jsp:useBean> | 자바 인스턴스(Java Bean)를 준비함 보관소에서 자바 인스턴스를 꺼내거나 새로 만들어 보관소에 저장하는 코드 생성 |
<jsp:setProperty> | 자바 빈의 프로퍼티 값 설정 자바 객체의 settet()를 호출하는 코드 생성 |
<jsp:getProperty> | 자바 빈의 프로퍼티 값을 꺼냄 자바 객체의 getter()를 호출하는 코드 생성 |
<jsp:include> | 정적(HTML, 텍스트 파일 등) 또는 동적(서블릿/jsp) 자원을 including하는 자바 코드 생성 |
<jsp:forward> | 현재 페이지의 실행을 멈추고 다른 정적, 동적 자원으로 forwarding하는 자바 코드 생성 |
<jsp:param> | jsp:include, jsp:forward, jsp:params의 자식 태그로 사용됨 ServletRequest 객체에 매개변수를 추가하는 코드 생성 |
<jsp:plugin> | OBJECT 또는 EMBED HTML 태그 생성 |
<jsp:element> | 임의의 XML 태그나 HTML 태그 생성 |
JSP Implicit Objects (내장 객체)
- request, response, pageContext, session, application, config, out, page, exception
- exception은 JSP가 예외 처리 페이지로 선언된 경우에만 존재
- JSP에서 자바 코드를 작성할 때 별도의 선언 없이 사용할 수 있는 자바 객체
<%@ page contentType="text/html; charset=UTF-8" %>
<%
// request 객체에서 파라미터 가져오기
String name = request.getParameter("name");
if (name == null || name.isEmpty()) {
name = "Guest";
}
// session 객체에 데이터 저장
session.setAttribute("userName", name);
// application 객체에서 방문자 수 증가
Integer visitorCount = (Integer) application.getAttribute("visitorCount");
if (visitorCount == null) {
visitorCount = 0;
}
visitorCount++;
application.setAttribute("visitorCount", visitorCount);
%>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JSP Built-in Objects</title>
</head>
<body>
<h1>Welcome, <%= name %>!</h1>
<p>You are visitor number: <%= visitorCount %>.</p>
</body>
</html>
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.ServletContext;
@WebServlet("/builtInObjects")
public class BuiltInObjectsServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Set response content type
response.setContentType("text/html; charset=UTF-8");
// request 객체에서 파라미터 가져오기
String name = request.getParameter("name");
if (name == null || name.isEmpty()) {
name = "Guest";
}
// session 객체에 데이터 저장
HttpSession session = request.getSession();
session.setAttribute("userName", name);
// application 객체에서 방문자 수 증가
ServletContext application = getServletContext();
Integer visitorCount = (Integer) application.getAttribute("visitorCount");
if (visitorCount == null) {
visitorCount = 0;
}
visitorCount++;
application.setAttribute("visitorCount", visitorCount);
// HTML 출력
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE html>");
out.println("<html lang=\"en\">");
out.println("<head>");
out.println(" <meta charset=\"UTF-8\">");
out.println(" <title>JSP Built-in Objects</title>");
out.println("</head>");
out.println("<body>");
out.println(" <h1>Welcome, " + name + "!</h1>");
out.println(" <p>You are visitor number: " + visitorCount + ".</p>");
out.println("</body>");
out.println("</html>");
out.close();
}
}
- request 객체
- JSP : request.getParameter("name");
- Servlet : 동일한 방식으로 HttpServletRequest 객체를 통해 처리
- session 객체
- JSP : session.setAttribute("userName", name);
- Servlet : HttpSession session = request.getSession();을 호출하여 세션을 가져옴
- application 객체
- JSP : application.getAttribute("visitorCount");
- Servlet : ServletContext application = getServletContext();으로 컨텍스트 객체를 가져옴
- response 객체
- JSP : 내장 객체 암묵적으로 사용
- Servlet : HttpServletResponse 객체를 직접 이용해 response.setContextType() 등을 설정
- HTML 템플릿
- JSP : 내장 객체와 템플릿을 자연스럽게 결합
- Servlet : PrintWriter로 모든 HTML 코드를 출력해야 하므로 가독성이 떨어짐
JSP 내장 객체와 Servlet 대응표
JSP 내장 객체 | Servlet 대응 객체 |
request | HttpServletRequest |
response | HttpServletResponse |
session | HttpSession |
application | ServletContext |
out | PrintWriter (response.getWriter()) |
config | ServletConfig (getServletConfig()) |
page | this (현재 Servlet 인스턴스) |
pageContext | N/A (JSP 전용 객체) |
- request 객체
- HTTP 요청 정보를 관리
- 클라이언트에서 서버로 전송한 요청 데이터를 다룸
- 주요 역할 :
- 요청 매개변수 읽기
- 헤더 정보 읽기
- 클라이언트 정보(ip 주소, 브라우저 정보 등) 읽기
- 예)
String name = request.getParameter("name");
: 요청 쿼리 파라미터 name의 값을 반환
- response 객체
- HTTP 응답 정보를 관리
- 서버에서 클라이언트로 데이터를 전송하는 데 사용됨
- 주요 역할 :
- 응답 콘텐츠 유형(Content-Type) 설정
- HTTP 상태 코드 설정
- 출력 스트림을 통해 데이터 전송
- 예)
JSP - 암묵적으로 사용됨, 페이지 출력 내용이 response 객체를 통해 전송됨
Servlet - response.setContextType("text/html; charset=UTF-8");
: 응답 콘텐츠를 HTML로 설정하고 UTF-8 인코딩을 사용함
- session 객체
- 사용자 세션 관리를 담당
- 세션은 클라이언트와 서버 간 상태를 유지하기 위해 사용됨
- 주요 역할 :
- 사용자의 상태 정보를 저장하고 공유 (로그인 정보 등)
- 브라우저를 닫거나 세션이 만료되기 전까지 데이터 유지
- 예)
JSP - session.setAttribute("userName", name);
: userName이라는 키로 사용자 이름 데이터를 세션에 저장
Servlet -
HttpSession session = request.getSession();
session.setAttribute("userName", name);
: 세션 객체를 가져와 데이터 저장
- application 객체
- 서버 애플리케이션 범위의 데이터 관리를 담당
- 서버 내 모든 사용자와 모든 요청에서 공유되는 데이터를 저장
- 주요 역할 :
- 전역 상태 정보 관리 (방문자 수 등)
- 모든 서블릿과 JSP 페이지에서 공유 가능
- 예)
JSP - Integer visitorCount = (Integer) application.getAttribute("visitorCount");
: visitorCount는 애플리케이션 전역에서 공유되며 모든 클라이언트가 접근할 수 있음
Servlet -
ServletContext application = getServletContext();
Integer visitorCount = (Integer) application.getAttribute("visitorCount");
: ServletContext 객체를 통해 전역 데이터 관리
- out 객체
- HTML 콘텐츠 출력을 담당
- JSP에서 작성된 HTML, 텍스트, 표현식 등의 출력을 관리
- response.getWriter()로 생성된 출력 스트림을 간편하게 사용
- 예)
JSP - <h1>Welcome, <%= name %>!</h1>
: 내부적으로 out.println("Welcome, "+name+"!");로 변환
Servlet -
PrintWriter out = response.getWriter();
out.println("<h1>Welcome, "+name+"!</h1>");
- page 객체
- 현재 JSP 페이지의 인스턴스를 나타냄
- JSP 페이지가 Servlet으로 변환되었을 때, this 키워드에 해당
- 주로 디버깅 목적으로 사용
- 예)
JSP - page는 암묵적으로 제공
Servlet - this로 대체됨
- pageContext 객체
- JSP의 다양한 내장 객체를 관리하는 도우미 역할
- 현재 페이지의 컨텍스트 정보 제공
- 주요 역할 :
- 내장 객체 관리 (request, response, session, application 등)
- 페이지 범위 변수 설정 및 조회
- 예)
JSP - 암묵적으로 제공, pageContext로 데이터 관리 가능
Servlet - 별도로 존재하지 않음
JSP와 Servlet 차이점
내장 객체 | JSP 사용 | Servlet 사용 |
request | 직접 사용 | HttpServletRequest에서 가져옴 |
response | 직접 사용 | HttpServletResponse에서 가져옴 |
session | 직접 사용 | request.getSession()에서 가져옴 |
application | 직접 사용 | getServletContext()에서 가져옴 |
out | 자동 관리 | response.getWriter()로 생성 |
'JSP' 카테고리의 다른 글
jQuery를 이용한 AJAX (0) | 2024.12.02 |
---|---|
JSP(JavaServer Pages)란? (0) | 2024.12.01 |