서블릿은 단독으로 사용하는 것보다 HTML이나 JSP 페이지와 서블릿 사이에서 데이터를 주고 받는데 사용하는 것이 일반적이다. 이들 사이에서의 데이터 교환 및 공유에 필요한 기능으로서 "리퀘스트, 세션, 어플리케이션의 값 저장"과 "포워드/리디렉션"라는 기능에 대해 설명하겠다.

HTML에서 서블릿에 폼 전송

페이지 간의 데이터 교환의 기본이라고 하면 역시 "폼(form)"이다. HTML과 JSP 페이지에 폼을 준비하고, 거기에서 서블릿으로 보내는 것과 같은 방법은 서블릿 이용의 기본이라 할 수 있다.

서블릿에 송신된 폼의 내용을 얻으려면 doGet/doPost 인수에 준비되어 있는 HttpServletRequest 인스턴스를 사용한다. 이 안에 있는 "getParameter" 메소드로 전달된 값을 꺼내 올 수 있다.

String 변수 = request.getParameter(이름);

예를 들어, <input type="text" name="txt1">와 같은 입력 요소라면 getParameter("txt1")으로 지정하여 값을 얻을 수 있다. 얻을 수 있는 값은 모든 String으로 되기 때문에 숫자 등의 값은 필요에 따라 거기에서 변환하여 처리하면 된다.

이 getParameter라는 메소드는 이미 다른 곳에서 본 적이 있을 것이다. JSP 암묵 객체 request의 "getParameter"이다. 이는 단순한 우연이 아니다. 사실을 말하자면, 암시 객체 request는 doGet의 인수로 전달되는 HttpServletRequest의 것이기 때문이다.

JSP는 사실 서블릿이라고 설명 했었다. 이는 JSP의 스크립트도 모든 서블릿으로 변환되는 것이다. 서블릿은 기본적으로 doGet 메소드에서 실행되도록 되어 있다. 여기서 "암묵적 객체"라는 것은 "서블릿으로 변환될 때 미리 준비되어 있는 변수"라는 것을 알 수 있을 것이다.

request와 response라는 암묵적 개체는 doGet 인수 그 자체이다. 또한 out의 암묵적 개체는 response에서 얻은 PrintWriter를 보관하고 있는 변수로 생각할 수 있다. 그렇게 생각하면 JSP에서의 지식이 그대로 서블릿에서도 사용할 수 있음을 알게 될 것이다.

그럼 간단한 사용 예제는 아래와 같다.

index.html

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title>Hello App Engine</title>
    <style>
    h1 {
        font-size: 16pt;
        background: #AAFFAA;
        padding: 5px;
    }
    </style>
</head>
<body>
    <h1>Hello App Engine!</h1>
    <p id="msg">무엇가를 써서 송신해 주세요.</p>
    <form method="post" action="/mygaeapp">
    <table>
        <tr>
            <td>입력</td>
            <td><input type="text" id="input" name="text1"></td>
        </tr>
        <tr>
            <td></td>
            <td><input type="submit" value="송신"></td>
        </tr>
    </table>
    </form>
</body>
</html>

MyGaeAppServlet.java

package com.devkuma.mygaeapp;

import java.io.*;

import javax.servlet.http.*;

@SuppressWarnings("serial")
public class MyGaeAppServlet extends HttpServlet {
    
   public void doGet(HttpServletRequest request, HttpServletResponse response)  throws IOException {
       response.setContentType("text/plain");
       request.setCharacterEncoding("utf8");
       response.setCharacterEncoding("utf8");
       PrintWriter out = response.getWriter();
       out.println("Hello, world!");
   }

   public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
       response.setContentType("text/html");
       request.setCharacterEncoding("utf8");
       response.setCharacterEncoding("utf8");
       String param = request.getParameter("text1");
       PrintWriter out = response.getWriter();
       out.println("<html><head></head><body>");
       out.println("<h1>result</h1>");
       out.println("<p>you typed: " + param + ".</p>");
       out.println("</body></html>");
   }
}

index.html에 간단한 양식을 놓고, 그것을 먼저 만든 MyGaeAppServlet 서블릿에서 수신 결과를 표시하도록 하려고 한다. 아주 간단히 값을 서블릿으로 받아 넘기고 있다는 것을 알 수 있다.



Ajax으로 서블릿에 접근

앞에서 설명한 "양식을 제출하여 값을 전달"하는 방식은 별로 편리할 것 같지는 않다. 서블릿에서 PrintWriter를 사용하여 페이지를 출력하는 것은 매우 귀찮은 일이다. 역시 화면 표시는 HTML과 JSP를 이용하고, 서버 측의 처리 부분만 서블릿을 사용하는 방식이 효율이 좋다.

하나의 방법으로 생각나는 것이 Ajax를 사용하는 것이다. HTML 내에서 Ajax에서 서블릿에 액세스하고, 그 결과를 얻어 표시한다. 이렇게 하게 되면 서블릿 측은 결과 값만을 출력하게 되고, 표시는 HTML에서 하게 되어 개발이 편해 진다.

그럼, 샘플을 만들어 그것을 보면서 설명을 하도록 하겠다. 아래에 간단한 예제가 있다.

index.html

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title>Hello App Engine</title>
    <style>
    h1 {
        font-size: 16pt;
        background: #AAFFAA;
        padding: 5px;
    }
    </style>
    <script type="text/javascript">
    function doAction() {
        var req =  createRequest();
        if (req == null) {
            alert("실행이 되지 않는다!");
            return;
        }
        var s = document.getElementById('text1').value;
        req.open("post", "/mygaeapp", true);
        req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        req.onreadystatechange = function(){
            if (this.readyState == 4 && this.status == 200){
                var msg = document.getElementById('msg');
                msg.innerHTML = this.responseText;
            }
        }
        req.send("text1=" + encodeURIComponent(s));
        msg.innerHTML = "<<< please wait... >>>";
    }
         
       function createRequest(){
        var httplist = [
            function(){ return new XMLHttpRequest(); },
            function(){ return new ActiveXObjct("Msxml2.XMLHTTP"); },
            function(){ return new ActiveXObject("Microsoft.XMLHTTP"); }
        ];
        for(var i = 0;i < httplist.length;i++){
            try {
                var http = httplist[i]();
                if (http != null) return http;
            } catch(e){
                continue;
            }
        }
        return null;
    }
    </script>
</head>
<body>
    <h1>Hello App Engine!</h1>
    <p id="msg">정수 입력</p>
    <p name="msg"></p>
    <table>
        <tr>
            <td>입력</td>
            <td><input type="text" id="text1"></td>
        </tr>
        <tr>
            <td></td>
            <td><button onclick="doAction();">송신</button></td>
        </tr>
    </table>
</body>
</html>

MyGaeAppServlet.java

package com.devkuma.mygaeapp;

import java.io.*;
import java.net.*;

import javax.servlet.http.*;

@SuppressWarnings("serial")
public class MyGaeAppServlet extends HttpServlet {
    
   public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
       response.setContentType("text/plain");
       request.setCharacterEncoding("utf8");
       response.setCharacterEncoding("utf8");
       PrintWriter out = response.getWriter();
       out.println("Hello, world!");
   }

   public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
       response.setContentType("text/plain");
       request.setCharacterEncoding("utf8");
       response.setCharacterEncoding("utf8");
       String param = URLDecoder.decode(request.getParameter("text1"),"utf8");
       int result = 0;
       try {
           int n = Integer.parseInt(param);
           for(int i = 1;i <= n;i++){
               result += i;
           }
       } catch (NumberFormatException e) {
           e.printStackTrace();
       }
       PrintWriter out = response.getWriter();
       out.println(result);
   }
}

index.html과 MyGaeAppServlet를 사용한 샘플이다. HTML 내에서 Ajax으로 MyGaeAppServlet에 액세스하여 결과를 받아 와서 표시를 하도록 되어 있다.

이번 샘플에서는 입력 폼에 정수를 입력하면 Ajax 서블릿에 액세스하여 0부터 그 숫자까지의 합계를 계산하고 받아와서 표시하도록 되어 있다. 여러가지 숫자를 입력하여 동작을 확인해 보도록 하자.

그럼 흐름을 살펴 보자. 먼저 Ajax 통신에서 이용하는 XMLHttpRequest 객체의 생성은 createRequest라는 함수에 정리되어 있다. 이것을 호출하여 XMLHttpRequest 객체를 포함하고 open에서 액세스 대상을 지정하여 요청을 오픈하고 send에서 필요한 값을 설정하여 액세스 시작한다. 이 부분의 처리에 대해서는 JavaScript의 Ajax 통신에 대한 이야기가 되기 때문에 생략한다.

그런데, 서블릿 측의 처리하지만, 이것은 사실 먼저 번의 샘플과 거의 차이가 없다. 유일한 차이점은

  1. response.setContentType("text/plain");라고 되어 있다. HTML이 아닌 일반 텍스트를 써서 내보내고 있다.
  2. out.println하는 내용이 단순한 텍스트로만 되어 있다. HTML 태그는 일절 없다.

이 정도이다(물론 숫자를 계산하는 처리는 새로 증가하고 있지만...). Ajax 사용은 서블릿 측에는 거의 의식하는 것은 아니다. 기본적으로 JavaScript 측에서의 문제라고 생각해도 좋을 것이다.



JSP에 전달하고 결과를 forward하여 표시

또 다른 방법은 포워드로 결과를 표시하는 JSP에 표시를 전환하는 것이다. 서블릿에서 결과를 표시하는 JSP를 포워드(forward)로 표시 시키면 서블릿에서 화면의 표시 등을 할 필요는 없다.

단, 이 방법을 사용하는 경우, "어떻게 서블릿에서 포워드 대상의 JSP에 결과 데이터를 전달 하느냐"는 생각을 두어야 한다. 그럼 이도 샘플을 보면서 설명하겠다.

hello.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Sample jsp</title>
<style>
h1{
    font-size: 16pt;
    background: #AAFFAA;
    padding: 5px;
}
</style>
</head>
<body>
    <h1>Hello App Engine!</h1>
    <p>Result:<%=request.getAttribute("result") %></p>
    <hr>
    <p id="msg">정수 입력:</p>
    <form method="post" action="/mygaeapp">
    <table>
        <tr>
            <td>입력</td>
            <td><input type="text" id="input" name="text1" value="<%=request.getAttribute("input") %>"></td>
        </tr>
        <tr>
            <td></td>
            <td><input type="submit" value="전송"></td>
        </tr>
    </table>
    </form>
</body>
</html>

MyGaeAppServlet.java

package com.devkuma.mygaeapp;

import java.io.*;
import java.net.URLDecoder;

import javax.servlet.*;
import javax.servlet.http.*;

@SuppressWarnings("serial")
public class MyGaeAppServlet3 extends HttpServlet {

   public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
       response.setContentType("text/plain");
       request.setCharacterEncoding("utf8");
       response.setCharacterEncoding("utf8");
       PrintWriter out = response.getWriter();
       out.println("Hello, world!");
   }

   public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
       response.setContentType("text/html");
       request.setCharacterEncoding("utf8");
       response.setCharacterEncoding("utf8");
       String param = URLDecoder.decode(request.getParameter("text1"), "utf8");
       PrintWriter out = response.getWriter();
       int result = 0;
       try {
           int n = Integer.parseInt(param);
           for (int i = 1; i <= n; i++) {
               result += i;
           }
       } catch (NumberFormatException e) {
           out.println(e);
       }
       request.setAttribute("input", param);
       request.setAttribute("result", result);
       ServletContext app = this.getServletContext();
       RequestDispatcher dispatcher = app.getRequestDispatcher("/hello.jsp");
       try {
           dispatcher.forward(request, response);
       } catch (ServletException e) {
           out.println(e);
       }
   }
}

위에 있는 양식을 가진 JSP와 그 대상이 되는 서블릿 소스 코드이다. hello.jsp에 액세스하여 폼에 정수를 써 보내면 /mygaeapp에 POST로 전송되어 그대로 hello.jsp에 전달된다. 이 때, "Result : OO"와 같이 서블릿에서 합계한 결과가 표시된다.

여기에서는 서블릿에서 JSP에 필요한 값을 전달하는데, 다음과 같은 처리를 하고 있다.

서블릿에서 값을 저장

request.setAttribute("input", param);
request.setAttribute("result", result);

JSP에서 값을 꺼내오기

<%=request.getAttribute("result") %>
<%=request.getAttribute("input") %>

request는 HttpServletRequest 클래스의 인스턴스이다. 이 "setAttribute"라는 메소드를 호출하는 것으로, HttpServletRequest 내의 값을 보관할 수 있다. 이것은 "getAttribute"메소드에서 언제든지 꺼낸 올 수 있다. 이러한 메소드의 사용법을 정리하면 다음과 같다.

값의 보관

"HttpServletRequest".setAttribute(이름, 값);

값의 취득

변수 = "HttpServletRequest".getAttribute(이름);

이제 HttpServletRequest(요청)에 값을 저장할 수 있게 되었다. 이 후에는 포워드를 사용하여 JSP에 표시를 바꿀 뿐이다. 이 처리는 의외로 귀찮은 일이다. 다음에 같이 정리된다.

1. ServletContext를 얻기

ServletContext app = this.getServletContext();

ServletContext이라는 것은 현재 움직이고 있는 Web 애플리케이션을 관리하기 위한 것이다. 이 인스턴스에는 Web 어플리케이션의 중요한 기능을 포함되어 있다.

2. RequestDispatcher를 얻기

RequestDispatcher dispatcher = app.getRequestDispatcher("/ hello.jsp");

ServletContext에서 "RequestDispatcher"라는 인스턴스를 가져온다. 이것은 요청를 디스패치(다른 곳으로 보내는 것)하는 것이다. 아무튼, 우선은 "이 가운데, 포워드가 이 메소드으로 제공된다"라는 점만 기억하면 된다.

3. forward 메소드로 포워드하기

try {
    dispatcher.forward(request, response);
} catch (ServletException e) {
    out.println(e);
}

취득한 RequestDispatcher에 제공하고 있는 "forward"로 포워드가 실행된다. 인수는 HttpServletRequest와 HttpServletResponse를 지정한다. 이 두개의 인수는 모두 doGet/doPost에 인수로 전달된 인스턴스를 그대로 설정하면 된다.

포워드는 forward라는 메소드에서 실행되지만, 그것을 호출까지 여러 인스턴스를 가져와야 한다. ServletContext와 RequestDispatcher를 얻어와서, 그 안에 메소드를 호출하여 포워드가 실행되는 것이다.



redirect을 이용하여 결과를 표시

포워드의 경우, URL 주소 표시 줄에 표시되는 주소는 변경되지 않기 때문에 /mygaeapp로 표시가 그대로인 상태로 hello.jsp의 내용이 표시되게 된다. 뭐, 그래도 크게 문제는 없지만, 리로드를 하게 되면 서블릿의 doGet 표시되어 버린다.

hello.jsp에 제대로 주소를 돌려 보내기 위하여는 포워드가 아닌 "리다이렉트(redirect)"을 이용해야 한다. 그러나 리다이렉트을 사용하는 경우에는 포워드와는 또 다른 형태로 값을 전달하는 방법으로 해야한다.

아래에 이전에 포워드를 사용한 예제를 리다이렉트을 이용하는 형태로 다시 수정하였다.

<%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Sample jsp</title>
<style>
h1{
    font-size: 16pt;
    background: #AAFFAA;
    padding: 5px;
}
</style>
</head>
<body>
    <h1>Hello App Engine!</h1>
    <p>Result: <%=session.getAttribute("result") %></p>
    <hr>
    <p id="msg">정수 입력:</p>
    <form method="post" action="/mygaeapp">
    <table>
        <tr>
            <td>입력</td>
            <td><input type="text" id="input" name="text1" value="<%=session.getAttribute("input") %>"></td>
        </tr>
        <tr>
            <td></td>
            <td><input type="submit" value="전송"></td>
        </tr>
    </table>
    </form>
</body>
</html>

MyGaeAppServlet.java

package com.devkuma.mygaeapp;

import java.io.*;

import javax.servlet.http.*;

@SuppressWarnings("serial")
public class MyGaeAppServlet4 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.setContentType("text/plain");
        request.setCharacterEncoding("utf8");
        response.setCharacterEncoding("utf8");
        PrintWriter out = response.getWriter();
        out.println("Hello, world!");
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.setContentType("text/html");
        request.setCharacterEncoding("utf8");
        response.setCharacterEncoding("utf8");
        String param = request.getParameter("text1");
        PrintWriter out = response.getWriter();
        int result = 0;
        try {
            int n = Integer.parseInt(param);
            for (int i = 1; i <= n; i++) {
                result += i;
            }
        } catch (NumberFormatException e) {
            out.println(e);
        }
        HttpSession session = request.getSession();
        session.setAttribute("input", param);
        session.setAttribute("result", result);
        response.sendRedirect("/hello.jsp");
    }
}

이것을 동작을 시켜보자. 폼을 전송하면 다시 폼의 표시로 돌아와서, 합계가 계산되어 표시된다. 이때, URL 주소는 제대로 hello.jsp로 돌아와 있다. 이것으로 리로드해도 문제 없다.

리다이렉트은 포워드와 달리 더 쉽게 사용할 수 있다. 다음과 같은 메소드를 호출뿐이다.

"HttpServletRequest".sendRedirect(리다이렉트 주소);

포워드에 비해 매우 간단하다. 리다이렉트 주소를 인수로 지정하면 된다. 그러나! 리디렉션을 사용하는 경우, 이동된 곳에서 "HttpServletRequest의 setAttribute를 사용하여 값 전달받기"를 할 수 없다.

HttpServletRequest는 요청을 관리하는 것이다. 포워드는 서버에 표시되는 내용이 변경되기 때문에 요청이 중단될 것은 없다. 그런데 리다이렉트은 HTTP 헤더 정보를 사용하여 브라우저에 지정된 페이지로 이동하는 것이다. 즉, 브라우저가 받은 헤더 정보를 바탕으로 다른 페이지로 이동하는 단계에서 요청이 중단이 된다. 따라서 HttpServletRequest는 거기에서 사라지고 새로운 HttpServletRequest가 다시 제공이 되는 것이다. 그래서 Request의 setAttribue에 값을 보관해도 값을 얻을 수 없다.

그럼 어떻게 해야 하나? 이런 경우를 위해 있는 것이 "세션"이다. 세션은 JSP에서도 조금 사용했었다. 세션은 서버와 클라이언트 간의 지속적인 연결을 유지하기 위한 구조였다.

이 세션은 HttpSession라는 클래스로 준비되어 있다. 이는 request에서 꺼내 올 수 있다.

HttpSession session = request.getSession();

요청에 있는 HttpServletRequest 인스턴스의 "getSession"을 호출하는 것으로, 현재의 세션을 관리하는 HttpSession 인스턴스를 얻을 수 있다. 그리고 이 인스턴스의 "setAttribute"를 호출하여 세션에 값을 저장할 수 있다.

session.setAttribute("input", param);
session.setAttribute("result", result);

이 후에는 JSP 측에서 값을 얻어 오는 부분을 요청에서 세션을 변경하면 된다. 다음과 같은 식이다. JSP는 HttpSession은 "session"라는 암묵적 객체로 사용할 수 있다.

<% = session.getAttribute ( "result") %>
<% = session.getAttribute ( "input") %>

세션는 요청이 지나도 그대로 유지되기 때문에, 리다이렉트가 된 JSP에서도 제대로 값을 꺼내 올 수 있다. 이것으로 안심하고 페이지 이동이 가능해졌다.



응용 프로그램에 값을 저장

HttpServletRequest와 HttpSession은 이용 가능한 범위(scope라고 한다)가 다르다. HttpServletRequest는 현재 요청이 있는 동안만 존재한다. HttpSession은 세션이 연결되어 있는 동안 항상 존재한다. 이 두가지를 사용 구분하여 "어느 범위에서 값을 저장하고 계속되는지"를 생각해서 데이터 보존이 가능하다.

사실은 이 외에도 값을 저장할 수 있는 또 다른 것이 있다. 그것은 "ServletContext"라는 것이다. 이것은이 Web 어플리케이션 자체를 관리하는 클래스이다. 여기에 보관된 값이 Web 응용 프로그램이 있는 동안에 계속 보관하여 유지한다.

여기서 중요한 것은 "이것은 1개 밖에 없다"는 점이다. HttpServletRequest와 HttpSession는 액세스하는 클라이언트마다 준비된다. 즉, 동시에 여러 사람이 사용하더라도 각각 다른 개체가 준비되어 개별적으로 값이 저장된다.

그런데 ServletContext는 Web 응용 프로그램에 하나 밖에 존재하지 않는다. 이는 누가 접근해도 모두 같은 인스턴스에 액세스한다는 것이다. 즉, 거기에 저장된 값은 누가 접근하더라도 같은 것이 얻게 된다는 것이다.

이를 이용하면 "모두가 공유할 수 있는 데이터"를 쉽게 가질 수 있다. 실제로 해보도록 하자.

hello.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
<%@ page import="java.util.ArrayList" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Sample jsp</title>
<style>
h1{
    font-size: 16pt;
    background: #AAFFAA;
    padding: 5px;
}
table tr td {
    background: #DDFFDD;
    padding: 2px;
}
</style>
</head>
<body>
    <h1>Hello App Engine!</h1>
    <hr>
    <p id="msg">메시지:</p>
    <form method="post" action="/mygaeapp">
    <table>
        <tr>
            <td>입력</td>
            <td><input type="text" id="input" name="text1"></td>
        </tr>
        <tr>
            <td></td>
            <td><input type="submit" value="전송"></td>
        </tr>
    </table>
    </form>
    <hr>
    <table>
    <%
    ArrayList<String> datas = (ArrayList<String>)application.getAttribute("datas");
    if (datas != null){
        for(String str : datas){
            out.println("<tr><td>" + str + "</td></tr>");
        }
    }
    %>
    </table>
</body>
</html>

MyGaeAppServlet.java

package com.devkuma.mygaeapp;

import java.io.*;
import java.util.ArrayList;

import javax.servlet.ServletContext;
import javax.servlet.http.*;

@SuppressWarnings("serial")
public class MyGaeAppServlet5 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.setContentType("text/plain");
        request.setCharacterEncoding("utf8");
        response.setCharacterEncoding("utf8");
        PrintWriter out = response.getWriter();
        out.println("Hello, world!");
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.setContentType("text/html");
        request.setCharacterEncoding("utf8");
        response.setCharacterEncoding("utf8");
        String param = request.getParameter("text1");
        ServletContext application = this.getServletContext();
        ArrayList<String> datas = (ArrayList<String>) application.getAttribute("datas");
        if (datas == null) {
            datas = new ArrayList<String>();
        }
        datas.add(param);
        application.setAttribute("datas", datas);
        response.sendRedirect("/hello.jsp");
    }
}

위에 예제는 전송된 메시지를 ArrayList에 보관한다. 이곳 저곳의 PC에서 액세스하여 메시지를 입력해서 전송해 보자. 모두가 입력한 모든 데이터가 저장되며, 모든 브라우저에 동일한 데이터가 표시되는 것을 알 수 있을 것이다.

ServletContext는 서블릿에서 this에 준비되어 있는 메소드를 호출해 가져온다.

ServletContext application = this.getServletContext();

JSP는 더 간단하다. "application"라는 암묵적 개체로 준비되어 있기 때문에, 그것을 그대로 사용하면 된다.

이 ServletContext에도 역시 "setAttribute", "getAttribute"라는 메소드가 준비되어 있으며, 값을 저장하고 얻어올 수 있다. 사용법은 HttpServletRequest 등과 완전 동일하다.

이 "HttpServletRequest", "HttpSession", "ServletContext"의 3개의 클래스를 구분하여 다양한 형태로 값을 저장할 수 있다. 서블릿과 JSP에서 필요한 값을 주고 받을 때, 이것들은 매우 중요하다. 이 3개는 세트로 기억해 두도록 하자.

+ Recent posts