核心觀念:JSF 元件負責「狀態與行為」,Renderer 負責「呈現形式」。預設 HTML_BASIC Render Kit 輸出純 HTML;替換為 Ajax Render Kit 即可輸出含局部更新邏輯的 JavaScript,業務代碼零修改。
| 階段 | 標準 JSF | Ajax JSF (OperaMasks) |
|---|---|---|
| 請求類型 | 普通 HTTP POST | x-requested-by: XML Http Request 標頭 |
| 伺服端處理 | 完整生命週期 → 產生整頁 HTML | 完整生命週期(除 Render Response) → 產生元件樹 |
| Render Response | Content-Type: text/html 整頁輸出 | Content-Type: text/javascript 僅輸出變更部分的 JS 更新腳本 |
| 瀏覽器端 | 整頁重繪 | Ajax 回調執行 JS,局部 DOM 更新,無閃爍 |

x-requested-by 標頭的請求,標記為 Ajax 請求。clientId 與先前狀態。document.getElementById(...).innerHTML = ... 或元件特定 JS API)。<ajax:enable> 標籤包裹非 Ajax 元件(如 Tomahawk Tree),自動轉為局部刷新;最佳做法是提供原生 Ajax Renderer。f:ajaxJSF 2.0 (2009) 已標準化 Ajax 支援:
<h:commandButton value="Submit">
<f:ajax execute="@form" render="resultPanel" />
</h:commandButton>
execute:指定要處理的元件(預設 @this)。render:指定要更新的元件 clientId(支援 @form、@all、搜尋表達式)。listener、onevent、onerror 進階控制。原理同屬「伺服端狀態比對 → 僅輸出變更 JS」,但標準化、無需第三方引擎。
「JavaEE Without Ajax」不代表拒絕 Ajax 體驗,而是將 Ajax 複雜度下沉到框架層,讓 Java 開發者專注領域邏輯。無論選擇 JSF 2 標準 Ajax、PrimeFaces/OmniFaces 元件庫、或 OperaMasks 類容器級方案,核心都是:以 Java 為主語言,聲明式定義互動,框架負責生成最佳前端代碼。