View Javadoc

1   package org.seasar.cubby.action;
2   
3   import java.io.Writer;
4   
5   import javax.servlet.http.HttpServletRequest;
6   import javax.servlet.http.HttpServletResponse;
7   
8   import org.seasar.cubby.controller.ActionContext;
9   import org.seasar.framework.util.JSONSerializer;
10  import org.seasar.framework.util.StringUtil;
11  
12  /**
13   * JSON 形式のレスポンスを返す {@link ActionResult} です。
14   * <p>
15   * アクションメソッドの戻り値としてこのインスタンスを指定することで、指定された JavaBean を JSON/JSONP 形式に変換してレスポンスを返します。
16   * ブラウザの JavaScript から発行されたリクエストを処理する場合等に使用してください。
17   * </p>
18   * <p>
19   * 使用例1 : JSON 形式のレスポンスを返す
20   * 
21   * <pre>
22   * MyBean bean = ...;
23   * return new Json(bean);
24   * </pre>
25   * 
26   * </p>
27   * <p>
28   * 使用例2 : コールバック関数名を指定して JSONP 形式のレスポンスを返す
29   * 
30   * <pre>
31   * MyBean bean = ...;
32   * return new Json(bean, &quot;callback&quot;);
33   * </pre>
34   * 
35   * </p>
36   * 
37   * @see <a href="http://www.json.org/">JSON(JavaScript Object Notation)</a>
38   * @see <a href="http://ajaxian.com/archives/jsonp-json-with-padding">JSONP(JSON with Padding)</a>
39   * @see JSONSerializer#serialize(Object)
40   * @author baba
41   */
42  public class Json extends AbstractActionResult {
43  
44  	private Object bean;
45  
46  	private String calllback;
47  
48  	/**
49  	 * JSON 形式でレスポンスを返すインスタンスを生成します。
50  	 * 
51  	 * @param bean
52  	 *            JSON 形式に変換する JavaBean
53  	 */
54  	public Json(final Object bean) {
55  		this(bean, null);
56  	}
57  
58  	/**
59  	 * JSONP 形式でレスポンスを返すインスタンスを生成します。
60  	 * 
61  	 * @param bean
62  	 *            JSON 形式に変換する JavaBean
63  	 * @param callback
64  	 *            コールバック関数名
65  	 */
66  	public Json(final Object bean, final String callback) {
67  		this.bean = bean;
68  		this.calllback = callback;
69  	}
70  
71  	public void execute(final ActionContext context,
72  			final HttpServletRequest request, final HttpServletResponse response)
73  			throws Exception {
74  
75  		response.setContentType("text/javascript; charset=utf-8");
76  		response.setHeader("Cache-Control", "no-cache");
77  		response.setHeader("Pragma", "no-cache");
78  
79  		final String script;
80  		if (isJsonp()) {
81  			script = appendCallbackFunction(JSONSerializer.serialize(bean),
82  					calllback);
83  		} else {
84  			script = JSONSerializer.serialize(bean);
85  		}
86  
87  		final Writer writer = response.getWriter();
88  		writer.write(script);
89  		writer.flush();
90  	}
91  
92  	private boolean isJsonp() {
93  		return !StringUtil.isEmpty(calllback);
94  	}
95  
96  	private static String appendCallbackFunction(final String script,
97  			final String callback) {
98  		final StringBuilder builder = new StringBuilder(script.length()
99  				+ callback.length() + 10);
100 		builder.append(callback);
101 		builder.append("(");
102 		builder.append(script);
103 		builder.append(");");
104 		return builder.toString();
105 	}
106 
107 }