본문 바로가기

JSP

JSP 기본 문법

템플릿 데이터 클라이언트로 출력되는 콘텐츠
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 : 태그 접두사

 

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 전용 객체)

 

  1. request 객체
    1. HTTP 요청 정보를 관리
    2. 클라이언트에서 서버로 전송한 요청 데이터를 다룸
    3. 주요 역할 :
      1. 요청 매개변수 읽기
      2. 헤더 정보 읽기
      3. 클라이언트 정보(ip 주소, 브라우저 정보 등) 읽기
    4. 예)
      String name = request.getParameter("name");
      : 요청 쿼리 파라미터 name의 값을 반환

  2. response 객체
    1. HTTP 응답 정보를 관리
    2. 서버에서 클라이언트로 데이터를 전송하는 데 사용됨
    3. 주요 역할 :
      1. 응답 콘텐츠 유형(Content-Type) 설정
      2. HTTP 상태 코드 설정
      3. 출력 스트림을 통해 데이터 전송
    4. 예)
      JSP - 암묵적으로 사용됨, 페이지 출력 내용이 response 객체를 통해 전송됨
      Servlet - response.setContextType("text/html; charset=UTF-8");
      : 응답 콘텐츠를 HTML로 설정하고 UTF-8 인코딩을 사용함
  3. session 객체
    1. 사용자 세션 관리를 담당
    2. 세션은 클라이언트와 서버 간 상태를 유지하기 위해 사용됨
    3. 주요 역할 :
      1. 사용자의 상태 정보를 저장하고 공유 (로그인 정보 등)
      2. 브라우저를 닫거나 세션이 만료되기 전까지 데이터 유지
    4. 예)
      JSP - session.setAttribute("userName", name);
      : userName이라는 키로 사용자 이름 데이터를 세션에 저장
      Servlet -
      HttpSession session = request.getSession();
      session.setAttribute("userName", name);
      : 세션 객체를 가져와 데이터 저장
  4. application 객체
    1. 서버 애플리케이션 범위의 데이터 관리를 담당
    2. 서버 내 모든 사용자와 모든 요청에서 공유되는 데이터를 저장
    3. 주요 역할 :
      1. 전역 상태 정보 관리 (방문자 수 등)
      2. 모든 서블릿과 JSP 페이지에서 공유 가능
    4. 예)
      JSP - Integer visitorCount = (Integer) application.getAttribute("visitorCount");
      : visitorCount는 애플리케이션 전역에서 공유되며 모든 클라이언트가 접근할 수 있음
      Servlet - 
      ServletContext application = getServletContext();
      Integer visitorCount = (Integer) application.getAttribute("visitorCount");
      : ServletContext 객체를 통해 전역 데이터 관리
  5. out 객체
    1. HTML 콘텐츠 출력을 담당
    2. JSP에서 작성된 HTML, 텍스트, 표현식 등의 출력을 관리
    3. response.getWriter()로 생성된 출력 스트림을 간편하게 사용
    4. 예)
      JSP - <h1>Welcome, <%= name %>!</h1>
      : 내부적으로 out.println("Welcome, "+name+"!");로 변환
      Servlet -
      PrintWriter out = response.getWriter();
      out.println("<h1>Welcome, "+name+"!</h1>");
  6. page 객체
    1. 현재 JSP 페이지의 인스턴스를 나타냄
    2. JSP 페이지가 Servlet으로 변환되었을 때, this 키워드에 해당
    3. 주로 디버깅 목적으로 사용
    4. 예)
      JSP - page는 암묵적으로 제공
      Servlet - this로 대체됨
  7. pageContext 객체
    1. JSP의 다양한 내장 객체를 관리하는 도우미 역할
    2. 현재 페이지의 컨텍스트 정보 제공
    3. 주요 역할 :
      1. 내장 객체 관리 (request, response, session, application 등)
      2. 페이지 범위 변수 설정 및 조회
    4. 예)
      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