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

用 XSLT 與 XML 改進 Struts:Model 2x 架構深度解析

     編輯:Java 程式設計入門

從 Model 1 到 Model 2x 的演進

模型視圖技術控制器核心痛點
Model 1 JSP (Scriptlet + HTML) 無(頁面自控) 業務/展示耦合,難維護
Model 2 (Struts/JSP) JSP + Struts Taglibs ActionServlet JSP 仍可寫 Java 代碼,非 Well-formed XML,標籤庫學習曲線陡峭
Model 2x XSLT + XML (無 JSP) ActionServlet (未修改) 徹底分離邏輯/展示,標準化 XPath/XSLT,多渠道輸出

Model 2x 處理流程

  1. 請求進入 ActionServlet,按 struts-config.xml 分發到 Action 子類。
  2. Action 執行業務邏輯,生成 Result Bean(Form Bean、Request Bean、Session Bean)。
  3. XSL Servlet(自定義)攔截轉發,執行兩步:
    • XML 序列化:遞歸內省所有 Bean(基本類型 + Collection),構建 DOM 樹,同時注入 Struts 配置、資源束等上下文信息。
    • XSLT 轉換:載入緩存的樣式表,對 DOM 執行轉換,輸出 XHTML/PDF/WML/SVG/CSV 等任意格式。
  4. 響應發送客戶端。

XML 序列化示例

<?xml version="1.0" encoding="UTF-8"?>
<page name="TestForm">
    <request>
        <TestForm>
            <testString>My Test String</testString>
            <testList>
                <item>One</item>
                <item>Two</item>
                <item>Three</item>
            </testList>
        </TestForm>
    </request>
    <resources locale="zh_CN">...</resources>
    <struts-config>...</struts-config>
</page>

XSLT 樣式表示例

<xsl:template match="page">
    <h2>Please enter some text and submit</h2>
    <form name="testForm" method="get" action="result">
        <input type="text" name="testString" value="{request/TestForm/testString}"/>
        <select name="outSelect">
            <xsl:for-each select="request/TestForm/testList/item">
                <option><xsl:value-of select="."/></option>
            </xsl:for-each>
        </select>
        <input type="submit" value="Submit"/>
    </form>
</xsl:template>

Model 2x 核心優勢

維度優勢說明
業務/展示強分離 XSLT 無法調用 Java 業務代碼(擴展函數非標準、不可移植),強迫開發者將邏輯下沉到 Action/Bean。
標準化表達能力 XPath 替代 <logic:iterate>、<bean:write>,支持函數、遞歸、條件分支,功能嚴格超集。
多渠道輸出 同一 XML 數據源,配置不同樣式表輸出 HTML 4.0 / XHTML / WML / PDF (XSL-FO) / SVG / CSV / 純文本。
佈局與風格分離 樣式表可組合:<xsl:apply-templates select="table"/> 由佈局樣式表統一裝飾數據樣式表生成的表格。
開發週期縮短 修改樣式表無需重啟容器、無 JSP 重編譯延遲;前端工程師可獨立開發 XSLT。

關鍵挑戰與對策

挑戰對策
國際化 資源束序列化入 DOM,按 Locale 動態切換樣式表(而非 Java ResourceBundle)。
錯誤處理 ActionErrors 序列化入 DOM,樣式表按錯誤類型渲染錯誤消息或重顯表單。
工作流控制 原 struts-config.xml 流程定義失效,需在 Action 返回自定義 Forward 或引入獨立流程引擎。
性能 DOM 構建內存佔用大 → 改用 SAX/StAX 流式序列化 + XSLT 編譯為 Translet (Xalan) 提速。
客戶端 XSLT 現代瀏覽器支持客戶端轉換,可下發 XML+XSLT 卸載服務端 CPU,但需嚴格控制數據敏感度。

與 Cocoon 對比

Apache Cocoon 採用 Pipeline 架構(Generator → Transformer → Serializer),功能更強大但複雜度高。Model 2x 是「輕量級 Struts + XSLT 融合」,適合存量 Struts 專案平滑遷移,不引入重型容器。

總結

Model 2x 以「Struts 控制器 + Bean 模型 + XSLT 視圖」三角形重構 MVC,用 W3C 標準技術替換專有標籤庫,實現了更純粹的關注點分離、更強的多渠道適應性、更短的視圖修改週期。雖然現代框架(Spring MVC + Thymeleaf/React)已成主流,但 Model 2x 的設計思想——以標準化數據契約(XML)為中介,解耦邏輯與展示——在微服務網關聚合、多端適配層等場景依具備指導意義。

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