トッカンソフトウェア

ServletでJSON

前回、JavaアプリケーションでJSONを使ってみましたが、今回はServletでJSONを使ってみます。


サンプル:呼び出し元のtest.html

test.html
				
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>jQuery Test</title>
<script
	src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
<script type="text/javascript">
	$(function() {

		$("#btn").click(function() {

			var param = {
				str1 : $("#txt1").val(),
				str2 : $("#txt2").val()
			};
			$.ajax({
				contentType : "Content-Type: application/json; charset=UTF-8",
				url : "./TestJ",
				type : "POST",
				data : JSON.stringify(param)
			}).done(function(data, status, xhr) {
				// 正常
				show(data);
			}).fail(function(xhr, status, error) {
				// 異常
				$("#msg").append(xhr);
				$("#msg").append(":" + status);
				$("#msg").append(":" + error);
			}).always(function(data, status, xhr) {
				// 常に
			});
		});
	});

	function show(data) {
		// var obj = JSON.parse(data);
		var obj = data;

		//ここに結果
		$("#msg").html(obj.str);

		//ここにリスト
		if (obj.ret == "true") {
			var str1 = "<table border='1'>";
			$.each(obj.ary, function(i, val) {
				str1 += "<tr><td>" + i + "</td><td>" + val + "</td></tr>";

				console.log(i + ': ' + val);
			});
			str1 += "</table>";
			$("#ret1").html(str1);
		} else {
			$("#ret1").empty();
		}

		//ここにマップ
		if (obj.ret == "true") {
			var str2 = "<table border='1'>";
			$.each(obj.map, function(key, val) {
				str2 += "<tr><td>" + key + "</td><td>" + val + "</td></tr>";
			});
			str2 += "</table>";
			$("#ret2").html(str2);
		} else {
			$("#ret2").empty();
		}
	}
</script>
</head>
<body>
	<input type="text" id="txt1" />
	<input type="text" id="txt2" />
	<br />
	<input type="button" id="btn" value="ボタン" />
	<div id="msg">ここに結果</div>
	<br />
	<div id="ret1">ここにリスト</div>
	<br />
	<div id="ret2">ここにマップ</div>
</body>
</html>

			
黄色部分がJSONを送る部分です。JSONを受け取る部分は特になにも必要ありません。


サンプル:呼び出し先のServlet

TestJ.java
				
package test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
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 com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;

@WebServlet("/TestJ")
public class TestJ extends HttpServlet implements ServletContextListener {
	private static final long serialVersionUID = 1L;

	public TestJ() {
		super();
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// 送信されたJSONの取得
		BufferedReader buffer = new BufferedReader(request.getReader());
		String reqJson = buffer.readLine();

		// JSONをオブジェクトに変更
		ObjectMapper mapper = new ObjectMapper();
		Map<String, String> reqMap = 
			mapper.readValue(reqJson, new TypeReference<Map<String, String>>() {});

		// 戻り値用のオブジェクト作成
		Map<String, Object> map = new HashMap<>();
		map.put("A", "あいう");
		map.put("B", "えお");

		List<String> list = new ArrayList<>();
		list.add("aaa");
		list.add("bbb");

		Map<String, Object> resMap = new HashMap<>();
		resMap.put("str", reqMap.get("str1") + reqMap.get("str2") + "が送信されました");
		resMap.put("ret", "true");
		resMap.put("map", map);
		resMap.put("ary", list);

		// オブジェクトをJson文字列に変更
		String resJson = mapper.writeValueAsString(resMap);

		// ヘッダ情報などセット
		response.setContentType("application/json");
		response.setHeader("Cache-Control", "nocache");
		response.setCharacterEncoding("utf-8");

		// JSONを戻す
		PrintWriter out = response.getWriter();
		out.print(resJson);
	}

	@Override
	public void contextDestroyed(ServletContextEvent arg0) {
		System.out.println("contextDestroyed");
	}

	@Override
	public void contextInitialized(ServletContextEvent arg0) {
		System.out.println("contextInitialized");
	}

}

			
赤色がJSONを受け取る部分で、黄色部分がJSONを送る部分です。

ブラウザ表示


Eclipseで環境構築

コンパイルを通すためには前回の設定が必要です。
それとは別に実行するために以下の設定が必要になります。

サーバタグを開いて、サーバ(Tomcat v8.0 Server ~)をダブルクリックして、
表示された画面でOpen launch configurationをクリックします。


表示されたダイアログでUser Entriesを選択して、Add External JARsをクリックします。


必要なJarファイルを選択します。


ページのトップへ戻る