[Servlet] JSON 문자열로 응답하기

Published: by Creative Commons Licence

참고 문서

서블릿에서 JSON 형태의 문자열을 클라이언트로 전달하는 방법 정리.

문자열로 응답

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;

public class Dispatcher extends HttpServlet {
    private static final long serialVersionUID = 1L;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        process(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        process(req, resp);
    }

    protected void process(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {

        String jsonTxt = "{\"code\":\"200\", \"msg\":\"success\"}";
        req.setAttribute("data", jsonTxt);
        req.getRequestDispatcher("/result.jsp").forward(req, resp);
    }
}

JSON 기본구조 - { "이름" : "값" } 에 맞는 문자열을 전달한다.

<script>
  $(document).ready(function() {
    ob1 = $.parseJSON('${data}');
    ob2 = ${data};
  });

  // non-jquery
  window.onload = function() {
    ob3 = JSON.parse('${data}');
  }
</script>

클라이언트는 전달받은 JSON을 문자로 취급(ob1)하거나 전달받은 그대로 객체로써 다루는 방법(ob2)으로 처리할 수 있다. 여기서 사용한 JSON.parse는 파폭, 크롬에서만 기본으로 지원되며 익스9는 라이브러리를 추가해야 한다.

JSON 배열을 의미하는 String 리터럴은 다음과 같은 형식으로 작성한다:

"[{\"code\":\"200\", \"msg\":\"success\"}, {\"code\":\"404\", \"msg\":\"page not found\"}]"

만약 컬렉션 프레임워크 타입을 JSON으로 파싱하고 싶다면 jackson.ObjectMapper를 사용한다.

EL이 있어 아무도 쓰지 않는 스크립릿으로는 다음처럼 쓴다:

<script>
  $(document).ready(function() {
    ob = <%=request.getAttribute("data")%>;
  });
</script>

org.json.simple 패키지 이용

JSONObject

protected void process(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
    JSONObject json = new JSONObject();
    json.put("code", "200");
    json.put("msg", "success");

    req.setAttribute("data", json);
    req.getRequestDispatcher("/result.jsp").forward(req, resp);
}

JSONObject는 HashMap을 상속받은 클래스다. 따라서 put() 메서드로 프로퍼티를 추가한다.

<script>
  $(document).ready(function() {
    ob1 = '${data}';
    ob2 = ${data};
  });
</script>

JSONArray

JSON Package는 JSON객체를 배열로 다룰 수 있는 JSONArray 클래스를 지원한다. JSONArray는 ArrayList를 상속받은 클래스다.

protected void process(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
    JSONArray jsonList = new JSONArray();

    JSONObject jsonOb = new JSONObject();
    jsonOb.put("code", "200");
    jsonOb.put("msg", "success");
    jsonList.add(jsonOb);

    jsonOb = new JSONObject();
    jsonOb.put("code", "404");
    jsonOb.put("msg", "page not found");
    jsonList.add(jsonOb);

    req.setAttribute("data", jsonList);
    req.getRequestDispatcher("/result.jsp").forward(req, resp);
}

전달된 JSONArray 객체를 for문으로 처리해봤다.

<script>
  $(document).ready(function() {
    list = ${data};

    for (var loop = 0; loop < list.length; loop++) {
      console.log('code : ' + list[loop].code);
      console.log('msg : ' + list[loop].msg);
    }
  });
</script>

AJAX로 응답하기

비동기 요청에 JSON으로 응답하는 방법을 알아보자. 이 예시에선 jQuery의 ajax()를 사용했다.

<script>
  function getSome() {
    $.ajax({
      type: "GET",
      url: "/test.do",
      dataType: "json",
      success: function(data) {
        ob = data;
      }
    });
  }
</script>

문자열로 직접 응답하는 경우 다음과 같다:

protected void process(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
    PrintWriter writer = resp.getWriter();

    String jsonTxt = "{\"code\":\"200\", \"msg\":\"success\"}";
    writer.print(jsonTxt);
}

만약 org.json.simple 패키지의 JSONObject, JSONArray 객체를 사용한다면 다음처럼 가능하다:

protected void process(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
    PrintWriter writer = resp.getWriter();

    JSONArray jsonList = new JSONArray();

    JSONObject jsonOb = new JSONObject();
    jsonOb.put("code", "200");
    jsonList.add(jsonOb);

    jsonOb = new JSONObject();
    jsonOb.put("msg", "success");
    jsonList.add(jsonOb);

    writer.print(jsonList);

    System.out.println(jsonList); // [{"code":"200"},{"msg":"success"}]
}

이 것은 JSONObject와 JSONArray의 toString 메서드가 JSON 형태로 프로퍼티를 출력하도록 되어 있기 때문에 가능한 방법이다.