Struts2 - ajax - jsonプラグイン利用
struts2-json-plugin-xx.xx.xx.jarを使い、ResultのタイプでJSONを使用できる。
sturts.xml
略 <constant name="struts.i18n.encoding" value="UTF-8"/> <!-- json-defalut継承は必須! --> <package name="example" extends="json-default"> <action name="JSONExample" class="action.JSONExampleAction"> <result type="json"> <param name="noCache">true</param> <param name="contentType">text/html</param> </result> </action> </package>
JSONExampleAction.java
package action; import java.util.HashMap; import java.util.Map; import org.apache.struts2.json.annotations.JSON; import com.opensymphony.xwork2.Action; public class JSONExampleAction { private Map<String, String> map = new HashMap<String, String>(); private String field1; // transientのフィールドはシリアライズされない private transient String field2; // gettor,setterないフィールドはシリアライズされない private String field3; public String execute() { map.put("name", "あああああ"); return Action.SUCCESS; } // シリアライズ後の名称変更 @JSON(name = "newName") public Map getMap() { return this.map; } public void setField1(String field1) { this.field1 = field1; } public String getField1() { return this.field1; } public void setField2(String field2) { this.field2 = field2; } public String getField2() { return this.field2; } // public void setField3(String field3) // { // this.field3 = field3; // } // public String getField3() // { // return this.field3; // } }
<%@ page contentType="text/html; charset=UTF-8" language="java" errorPage="" %> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html> <head> <title>JSON plugin</title> <script src="${pageContext.request.contextPath}/jquery-1.11.1.js" type="text/javascript"> </script> <script type="text/javascript"> function gotClick() { $("#show").hide(); // action実行 $.post("JSONExample" , $("#form1").serializeArray() , // callback function(data , statusText) { $("#show").height(80) .width(240) .css("border" , "1px solid black") .css("border-radius" , "15px") .css("background-color" , "#efef99") .css("color" , "#ff0000") .css("padding" , "20px") .empty(); // propName巡る for(var propName in data) { $("#show").append(propName + "-->" + data[propName] + "<br />"); } $("#show").show(600); }, // レスポンスはJSON "json"); } </script> </head> <body> <s:form id="form1"> <s:textfield name="field1" label="Field 1"/> <s:textfield name="field2" label="Field 2"/> <s:textfield name="field3" label="Field 3"/> <tr><td colspan="2"> <input type="button" value="送信" onclick="gotClick();"/> </td></tr> </s:form> <div id="show"> </div> </body> </html>
※ なぜか、field2はtransient指定したがシリアライズされている????