首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Struts 2 JSON 插件實現 Ajax 互動完整指南

     編輯:Java 相關知識

核心價值

JSON 插件提供 json Result Type,Action 回傳 JSON 資料無需 JSP/Velocity 等視圖模板,直接支援前端 Ajax 異步呼叫。

安裝步驟

  1. 下載 jsonplugin-x.x.jar (Struts 2.3/2.5 對應版本) 至 WEB-INF/lib。
  2. 或 Maven:
    <dependency><groupId>com.googlecode.json-plugin</groupId><artifactId>jsonplugin</artifactId><version>0.41</version></dependency>

Action 實作

@Namespace("/api")
@Action(value = "user", results = {
    @Result(type = "json", params = {"includeProperties", "id,name,email,roles.*"})
})
public class UserAction extends ActionSupport {
    private String id;
    private String name;
    private String email;
    private List<Role> roles = new ArrayList<>();
    private Map<String, Object> metadata = new HashMap<>();

    // Getter/Setter 略

    @JSON(name = "userName") // 重新命名序列化欄位
    public String getName() { return name; }

    @JSON(serialize = false) // 不序列化敏感欄位
    public String getPassword() { return password; }

    @JSON(format = "yyyy-MM-dd") // 日期格式化
    public Date getCreateTime() { return createTime; }

    public String execute() {
        // 模擬查詢
        this.id = "1001";
        this.name = "Alice";
        this.email = "alice@example.com";
        this.roles.add(new Role("ADMIN"));
        this.roles.add(new Role("USER"));
        metadata.put("lastLogin", System.currentTimeMillis());
        return SUCCESS;
    }
}

JSON 註解完整屬性

屬性說明
name序列化後的 JSON key 名稱
serialize是否序列化 (預設 true)
deserialize是否反序列化 (預設 true)
format日期/數字格式化模式

struts.xml 配置 (非註解方式)

<package name="api" namespace="/api" extends="json-default">
    <action name="user" class="com.example.UserAction">
        <result type="json">
            <param name="includeProperties">id,name,email,roles.*</param>
            <param name="excludeProperties">password</param>
            <param name="enableGZIP">true</param>
            <param name="noCache">true</param>
        </result>
    </action>
</package>

關鍵點:
- extends="json-default" 繼承 JSON 插件預設攔截器堆疊。
- includeProperties/excludeProperties 以 OGNL 運算式控制序列化範圍。
- enableGZIP 壓縮回應;noCache 防快取。

前端 Ajax 呼叫範例 (jQuery)

$.ajax({
    url: "${pageContext.request.contextPath}/api/user.action",
    type: "GET",
    dataType: "json",
    success: function(data) {
        console.log("User:", data.name); // "Alice"
        console.log("Roles:", data.roles); // [{name:"ADMIN"},{name:"USER"}]
        $("#userName").text(data.userName); // 對應 @JSON(name="userName")
    }
});

進階:JSONP 跨域支援

<result type="json">
    <param name="callbackParameter">callback</param> <!-- 支援 ?callback=xxx -->
</result>

前端:dataType: "jsonp"。

常見問題

問題解決
中文亂碼確保 struts.i18n.encoding = UTF-8,前端 AJAX 請求預設 UTF-8
循環參考使用 excludeProperties 排除雙向關聯,或實作自訂序列化
大量資料效能啟用 GZIP、分頁、精簡 includeProperties

結語

Struts 2 JSON 插件讓 Action 直接輸出 JSON,極大簡化 Ajax 開發。善用註解與 includeProperties 精確控制序列化範圍,配合 GZIP 與快取控制,即可構建高效能 RESTful 端點。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved