Struts 2 Jsonplugin詳細
本論文の転送先:http://www.blogjava.net/fuhoujun/archive/2008/10/04/232324.html
Apacheが提供するプラグインパッケージは、アクション中のデータをJSONでパッケージして返すことができます.
これはaction全体の変数をJSONデータに変換します.これを使うなら、アクションは以下の点に従わなければならない.戻るページタイプのうち、「content-type」は、「aplication/json」でなければなりません. JSONの内容はフォーマットの要求に適合していなければなりません. Actにおいてfieldはpublicのset方法が必要である(set方法がないとJSONデータにfieldを追加しないので、検証が必要である). サポートタイプは、基本タイプ(int、long...String)、Date、List、Map、Primitive Arays、その他のクラス、オブジェクト配列です. JSONのいずれかのObjectはlistまたはmapにカプセル化され、データはロードLongにカプセル化され、含まれるデータであればDoubleにカプセル化され、配列はList. にカプセル化される.
以下、JSONのデータフォーマットを示します.
このプラグインは以下のコメントをサポートしています.
コメント名
概要
標準値
序文化
反プロローグ
name
JSONの中のnameを設定します.
empty
yes
no
serialize
serializationでは
true
yes
no
deserialize
deserializationでは
true
no
yes
フォーマット
Dateフィールドの書式設定
「yyy-M-dd'T'HH:mm:ss」
yes
yes
JSONにフィルドを置くことを指摘する構成によって表示することができますが、その中には自分の検証ルールが研究されます.
ルートオブジェクト
親オブジェクトを操作するブロック構成も使用できます.
JSONデータをコメントでカプセル化する
wrapWithCommentsがtrue(デフォルト値はfalse)に設定されていると、生成されたJSONデータはこのようになります.
このようにすれば、jsの中に潜在的なリスクを回避できます.使う時に必要なのは、Var reponseObject=eval("("+"+data.substring(data.indexOf)+2,data.lastIndexOf("*")+")),"),")),"),"),").
親類
「root」オブジェクト中の親類のfieldはJSONデータにデフォルトで保存されません.そうしたくないなら、配置時にInoreHirarchyをfalseに指定する必要があります.
列挙の種類
エニュメレーションの種類をデフォルトで処理すると、JSONデータのnameはエニュメレーションのvalueに等しく、valueはエニュメレーションのnameに等しい.
JSON: 「myEum」:「ValueA」
エニュメレート・タイプを扱う場合、xmlにenumAsBeanを配置すると、ビーンとして扱われ、JSONデータには特別な属性があります.nameの値はname()です.このリストのすべての属性は処理されます.
JSON: myEnum:{_name}:“ValueA”、“val”:“A”}
Xmlの設定:
Apacheが提供するプラグインパッケージは、アクション中のデータをJSONでパッケージして返すことができます.
これはaction全体の変数をJSONデータに変換します.これを使うなら、アクションは以下の点に従わなければならない.
以下、JSONのデータフォーマットを示します.
{
"doubleValue": 10.10,
"nestedBean": { "name": "Mr Bean" },
"list": ["A", 10, 20.20, { "firstName": "El Zorro" }],
"array": [10, 20]
}
このプラグインは以下のコメントをサポートしています.
コメント名
概要
標準値
序文化
反プロローグ
name
JSONの中のnameを設定します.
empty
yes
no
serialize
serializationでは
true
yes
no
deserialize
deserializationでは
true
no
yes
フォーマット
Dateフィールドの書式設定
「yyy-M-dd'T'HH:mm:ss」
yes
yes
JSONにフィルドを置くことを指摘する構成によって表示することができますが、その中には自分の検証ルールが研究されます.
<!-- Result fragment -->
<result type="json">
<param name="excludeProperties">
login.password,
studentList.*".sin
</param>
</result>
<!-- Interceptor fragment -->
<interceptor-ref name="json">
<param name="enableSMD">true</param>
<param name="excludeProperties">
login.password,
studentList.*".sin
</param>
</interceptor-ref>
ルートオブジェクト
<result type="json">
<param name="root">
person.job
</param>
</result>
親オブジェクトを操作するブロック構成も使用できます.
<interceptor-ref name="json">
<param name="root">bean1.bean2</param>
</interceptor-ref>
JSONデータをコメントでカプセル化する
wrapWithCommentsがtrue(デフォルト値はfalse)に設定されていると、生成されたJSONデータはこのようになります.
/* {
"doubleVal": 10.10,
"nestedBean": { "name": "Mr Bean" },
"list": ["A", 10, 20.20, { "firstName": "El Zorro" }],
"array": [10, 20]
} */
このようにすれば、jsの中に潜在的なリスクを回避できます.使う時に必要なのは、Var reponseObject=eval("("+"+data.substring(data.indexOf)+2,data.lastIndexOf("*")+")),"),")),"),"),").
親類
「root」オブジェクト中の親類のfieldはJSONデータにデフォルトで保存されません.そうしたくないなら、配置時にInoreHirarchyをfalseに指定する必要があります.
<result type="json">
<param name="ignoreHierarchy">false</param>
</result>
列挙の種類
エニュメレーションの種類をデフォルトで処理すると、JSONデータのnameはエニュメレーションのvalueに等しく、valueはエニュメレーションのnameに等しい.
public enum AnEnum {
ValueA,
ValueB
}
JSON: 「myEum」:「ValueA」
エニュメレート・タイプを扱う場合、xmlにenumAsBeanを配置すると、ビーンとして扱われ、JSONデータには特別な属性があります.nameの値はname()です.このリストのすべての属性は処理されます.
public enum AnEnum {
ValueA("A"),
ValueB("B");
private String val;
public AnEnum(val) {
this.val = val;
}
public getVal() {
return val;
}
}
JSON: myEnum:{_name}:“ValueA”、“val”:“A”}
Xmlの設定:
<result type="json">
<param name="enumAsBean">true</param>
</result>