JSP/Servlet | 서블릿과 JSP/HTML | 응용 프로그램에 값을 저장


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개는 세트로 기억해 두도록 하자.