liguofeng29’s blog

個人勉強用ブログだっす。

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指定したがシリアライズされている????

f:id:liguofeng29:20160317000716g:plain