JSONプラグインを利用したActionクラス
Struts 2のActionクラスを使って、JSON形式のデータを利用する場面としては、AJAXを利用した非同期リクエストに対してデータのみをレスポンスするところです。では実際にActionクラスでの利用方法を見てみましょう。
@Namespace("/json") // パッケージ継承はjson-default @ParentPackage("json-default") // Actionクラスの結果。type=jsonでJSON形式 @Results({ @Result(name="list" , type="json" , params={"root","resultList" , "ignoreHierarchy","false"}), }) public class SampleJSONAction extends ActionSupport { @Action("search") public String execute() throws Exception { // JSONで返す内容を作成する resultList = new ArrayList<String>(); resultList.add("群馬"); resultList.add("栃木"); resultList.add("茨城"); resultList.add("埼玉"); resultList.add("東京"); resultList.add("千葉"); resultList.add("神奈川"); resultList.add("山梨"); resultList.add("長野"); // @Resultで設定してあるresultを返す return "list"; } private List<String> resultList; public void setResultList(List<String> resultList) { this.resultList = resultList; } public List<String> getResultList() { return resultList; } }
JSONプラグイン独自の設定は、@ParentPackage、ならびに@Resultの2か所になります。
- @ParentPackageはjson-default(またはjson-defaultを継承したもの)
- @Resultではtypeにjsonを指定する。Actionクラスから返す内容をparamsにて指定する
次にparams内で指定できる設定内容を示します。
パラメータ名 | 内容 |
root | Actionクラスから返すActionフィールド名 |
ignoreHierarchy | falseを指定すると指定したオブジェクトの階層ごと全て出力する |
excludeNullProperties | trueを指定すると返す値にnullがあった場合取り除かれる |
statusCode | レスポンスコード |
errorCode | エラー用レスポンスコード。エラーハンドリングする際に利用する |
contentType | レスポンスタイプ。application/json以外の値を指定する場合に指定する |
callbackParameter | JSONP(※1)を利用する場合に指定する関数名 |
この中で特に大切なのは、rootです。rootで指定したActionクラスのフィールドを指定します。指定しない場合には、Actionクラスのフィールドすべてを返すようになります。Actionクラスにて扱うフィールドにて、本来レスポンスに返したくないオブジェクトなどがある場合などに使います。
JSONプラグインでは対象のフィールドのgetメソッドを検索し返そうと動くので、JSONプラグインを利用する際に注意すべきことがあります。Struts 2ではActionクラスにさまざまなオブジェクトをフィールドに持たせることができるため、JSONプラグインが無設定の場合には、本来画面側へ返す必要のないオブジェクトが返されてしまい、思わぬ誤動作や実行時エラーの原因となることがあります。特にデータベースコネクションを参照するオブジェクトがある場合は除外しておかないと、アプリケーションの誤動作を招きます。
JSONPとは、サーバからの戻り値にJavaScriptのコードを含めることで、あらかじめ用意したコールバック関数を呼び出すことのできる仕組みです。