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レスポンスの内容に変化します。これで上手く行きそうです。