首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Struts2 整合 AJAX:Action 處理請求還是 Servlet?JSON 返回最佳實踐

     編輯:程式設計綜合問答

直接回答

推薦使用 Struts2 Action 處理 AJAX 請求,無需單獨寫 Servlet。Struts2 內建 JSON 插件或配合 Fastjson/Gson 即可優雅返回數據。

方案一:Struts2 JSON 插件(官方,零配置返回對象)

1. 引入依賴

<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-json-plugin</artifactId>
    <version>2.5.30</version> // 與 struts2-core 版本一致
</dependency>

2. struts.xml 配置

<package name="ajax" extends="json-default">
    <action name="userAjax" class="com.example.UserAction" method="list">
        <result type="json">
            <param name="root">userList</param>      // 要序列化的屬性
            <param name="includeProperties">userList\[\d+\]\.(id|name)</param> // 精確控制字段
        </result>
    </action>
</package>

3. Action 代碼

public class UserAction extends ActionSupport {
    private List<User> userList = new ArrayList<>();

    public String list() {
        userList = userService.findAll();
        return SUCCESS; // json-default 會自動序列化 root 對象
    }
    public List<User> getUserList() { return userList; }
}

方案二:Fastjson / Gson 手動輸出(靈活、無需插件、性能更好)

Action 返回 void,手寫響應

public class UserAction extends ActionSupport {
    @Autowired private UserService userService;

    public void listJson() {
        List<User> list = userService.findAll();
        String json = JSON.toJSONString(list); // Fastjson
        // String json = new Gson().toJson(list); // Gson

        HttpServletResponse response = ServletActionContext.getResponse();
        response.setContentType("application/json;charset=UTF-8");
        try (PrintWriter out = response.getWriter()) {
            out.write(json);
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 返回 null/void,Struts2 不再查找 result
    }
}

struts.xml

<action name="userJson" class="com.example.UserAction" method="listJson">
    <!-- 無 result 配置 -->
</action>

方案對比

維度JSON PluginFastjson/Gson 手動
配置複雜度需 extends json-default、配置 root/includeProperties無需配置 result,極簡
字段控制靜態配置 includeProperties(正則),動態較難代碼層面完全可控,可根據參數動態過濾
性能反射序列化,稍慢直接序列化,快 2-3 倍
異常處理統一由 Struts2 異常攔截器處理需自行 try-catch 寫錯誤 JSON
適用場景簡單 CRUD、字段固定複雜嵌套、動態字段、高併發、需統一錯誤碼格式

前端調用示例

$.ajax({
    url: '${pageContext.request.contextPath}/userJson.action', // 或 .do 視 struts.action.extension
    type: 'GET',
    dataType: 'json',
    success: function(data) {
        // data 為數組 [{id:1,name:"Tom"},...]
        renderTable(data);
    }
});

最佳實踐建議

  1. 新項目優先 Fastjson/Gson 手動輸出,解耦視圖層,便於後續遷移 Spring MVC / Spring Boot。
  2. 統一錯誤碼格式:`{code:200, msg:"ok", data:...}` / `{code:500, msg:"錯誤信息"}`。
  3. 配置 `struts.action.extension=action,json` 讓 `.json` 後綴也能訪問 Action。
  4. 開啟 `struts.enable.JSONValidation=false` 避免驗證錯誤干擾 JSON 輸出。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved