読者です 読者をやめる 読者になる 読者になる

Slim3でjsonレスポンスを返す

 今、ちょっとやりたいことがあって、Google App Engine for Java上でアプリケーションを作成しています。Datastore部が非常に使い易そうなので、id:higayasuoさんのSlim3を使っています。
 その中で、画面側にてjavascriptを使ってajaxによる呼び出しを行い、サーバからjsonレスポンスを受け取りたいのですが、現状のSlim3には機能がまだ無いようなので、Slim3のdemoを参考に以下のようにjsonレスポンスを返す機能を実装してみました。

index.jsp

<%@page pageEncoding="UTF-8" isELIgnored="false"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>twitter Index</title>
<link rel="stylesheet" type="text/css" href="/css/global.css" />
<script src="/js/jquery-1.4.1.js" type="text/javascript"></script>
</head>
<body>
<p>Hello twitter Index !!!</p>
<p><span id="message">dummy message</span></p>
<input type="button" value="hello"
    onclick="$('#message').load('hello');"/>
</body>
</html>

 javascriptのライブラリはjqueryを使っています。

HelloController.java(import部は一部省略)

import net.arnx.jsonic.JSON;

public class HelloController extends Controller {

    @Override
    public Navigation run() {
        Map<String, String> data = new HashMap<String, String>();
        data.put("FirstName", "Kenichiro");
        data.put("LastName", "Murata");
        
        this.json(data);

        return null;
    }

    private void json(Object data) {
        String encoding = request.getCharacterEncoding();
        if (encoding == null) {
            encoding = "UTF-8";
        }
        response.setContentType("application/json; charset=" + encoding);
        try {
            PrintWriter out = null;
            try {
                out = new PrintWriter(new OutputStreamWriter(response
                        .getOutputStream(), encoding));
                out.print(JSON.encode(data));
            } finally {
                if (out != null) {
                    out.close();
                }
            }
        } catch (IOException e) {
            ThrowableUtil.wrapAndThrow(e);
        }
    }
}

 オブジェクトのJSON.encodeにはJSONICを使っています。
 以下の画面イメージが示すように、初期表示にて「dummy message」と表示されている部分が、helloボタンを押すと、サーバから受け取ったjsonレスポンスの内容に変化します。これで上手く行きそうです。

初期表示

jsonレスポンスを取得