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

Struts2 異步響應實現方式與簡化方案

     編輯:程式設計疑難解答

現狀分析

當前手動設置響應頭並寫入 JSON:

response.setContentType("text/html;charset=UTF-8");
response.getWriter().println(reportJson);

這本質上是 Servlet API 的標準寫法,Struts2 作為 MVC 框架,本質上無法改變 HTTP 協議的請求-響應本質,但提供了多種簡化封裝。

Struts2 簡化異步響應的三種方式

1. 結果類型 stream(推薦標準方式)

<!-- struts.xml -->
<action name="ajaxData" class="com.example.AjaxAction">
    <result type="stream">
        <param name="contentType">application/json</param>
        <param name="inputName">jsonStream</param>  <!-- 對應 Action 中的 getJsonStream() -->
        <param name="bufferSize">4096</param>
    </result>
</action>
// Action 類
public class AjaxAction extends ActionSupport {
    private InputStream jsonStream;
    
    public String execute() {
        String json = "{\"status\":\"ok\",\"data\":[1,2,3]}";
        jsonStream = new ByteArrayInputStream(json.getBytes("UTF-8"));
        return SUCCESS;
    }
    
    public InputStream getJsonStream() { return jsonStream; }
}
  • 優勢:框架自動處理響應頭、流關閉、異常捕獲、編碼。
  • 適用:返回 JSON、XML、文本、二進制文件下載等流式數據。

2. @Action 註解 + JSON 插件(零配置)

需引入 struts2-json-plugin-x.x.x.jar。

@Action(value = "ajaxData", results = {
    @Result(type = "json", params = {"rootObject", "resultData"})
})
public class AjaxAction extends ActionSupport {
    private Map<String, Object> resultData = new HashMap<>();
    
    public String execute() {
        resultData.put("status", "ok");
        resultData.put("data", Arrays.asList(1, 2, 3));
        return SUCCESS;
    }
    
    public Map<String, Object> getResultData() { return resultData; }
}
  • 自動將 rootObject 序列化為 JSON 響應,設置正確 Content-Type。
  • 支持複雜對象圖、日期格式化、排除屬性等高級配置。

3. 模板標簽封裝(極簡調用)

將 AJAX 邏輯封裝為 JSP 標簽或 Freemarker 宏:

<!-- /tags/ajax.tag -->
<%@ tag body-content="scriptless" %>
<%@ attribute name="url" required="true" %>
<%@ attribute name="onSuccess" required="true" %>
<script>
$.ajax({
    url: "${url}",
    dataType: "json",
    success: function(data) { ${onSuccess} }
});
</script>
<!-- 頁面使用 -->
<t:ajax url="/ajaxData.action" onSuccess="renderTable(data)" />
  • 將重復的 $.ajax 參數、錯誤處理、Loading 狀態封裝到標簽內。
  • 頁面調用簡化為一行聲明式標簽。

對比總結

方式配置複雜度代碼量適用場景學習成本
手寫 response.getWriter()無多(重復樣板代碼)極簡項目/舊代碼維護低
stream 結果類型低中通用流式響應( JSON/文件/圖片)低
JSON 插件 + 註解極低(零 XML)少RESTful JSON API 為主中
標簽/宏封裝一次性投入極少(調用端)大量重復 AJAX 頁面中

核心觀點

Struts2 無法、也不需要「改變 AJAX 執行流程」。框架的價值在於封裝樣板代碼、統一異常處理、自動類型轉換、聲明式配置。選擇 stream 或 json 結果類型,是框架推薦的標準化簡化路徑。

最佳實踐建議

  1. 統一響應格式:定義 ResultVO<T> 封裝 code、msg、data,Action 返回對象,JSON 插件自動序列化。
  2. 全局異常攔截:配置 ExceptionMappingInterceptor 或全局 exception 結果,AJAX 異常自動返回統一錯誤 JSON。
  3. 攔截器優化:僅對 AJAX Action 應用 jsonValidationWorkflowStack 等精簡攔截器棧,避免不必要的工作流開銷。
  4. 前端統一封裝:二次封裝 axios/fetch/$.ajax,統一攔截器處理 Token、Loading、錯誤碼跳轉。

總結

Struts2 通過 stream 結果類型 或 JSON 插件 可大幅簡化異步響應代碼,但本質上仍是 Servlet API 的封裝。建議採用 JSON 插件 + 註解配置 實現零配置 RESTful API,配合前端統一請求封裝,達到開發效率與代碼質量平衡。

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