當前手動設置響應頭並寫入 JSON:
response.setContentType("text/html;charset=UTF-8");
response.getWriter().println(reportJson);
這本質上是 Servlet API 的標準寫法,Struts2 作為 MVC 框架,本質上無法改變 HTTP 協議的請求-響應本質,但提供了多種簡化封裝。
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; }
}
@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。將 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結果類型,是框架推薦的標準化簡化路徑。
ResultVO<T> 封裝 code、msg、data,Action 返回對象,JSON 插件自動序列化。ExceptionMappingInterceptor 或全局 exception 結果,AJAX 異常自動返回統一錯誤 JSON。jsonValidationWorkflowStack 等精簡攔截器棧,避免不必要的工作流開銷。axios/fetch/$.ajax,統一攔截器處理 Token、Loading、錯誤碼跳轉。Struts2 通過 stream 結果類型 或 JSON 插件 可大幅簡化異步響應代碼,但本質上仍是 Servlet API 的封裝。建議採用 JSON 插件 + 註解配置 實現零配置 RESTful API,配合前端統一請求封裝,達到開發效率與代碼質量平衡。