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

Struts 1.x核心架構深度總結:初始化流程、請求處理鏈與標籤庫體系

     編輯:J2EE

優缺點速覽

優點缺點
良好架構設計、可重用模塊化、開源、豐富標籤庫強依賴Web容器(改配置需重啟)、配置文件複雜、ActionForm難測試、Action測試依賴Servlet API需Mock

核心初始化流程(ActionServlet啟動)

  1. initInternal():載入國際化資源(MessageResources工廠模式)
  2. initOther():解析web.xml中config/convertNull參數,默認配置WEB-INF/struts-config.xml
  3. initServlet():載入ActionServlet初始化參數、DTD緩存至HashMap、解析web.xml、將自身壓入Digester棧
  4. initChain():讀取責任鏈配置(默認org/apache/struts/chain/chain-config.xml)
  5. 註冊至ServletContext
  6. 獲取ModuleConfig實例(MessageResource/PlugIn/DataSource/FormBean/Forward/Exception/Action統一管理入口)
  7. 依次初始化:資源文件、插件、FormBean、Forward、Exception、Action配置
  8. moduleConfig.freeze():凍結配置,不可變
  9. 掃描config/前綴參數,初始化多模塊配置
  10. initModulePrefixes():初始化其他模塊前綴映射

核心組件:commons-digester(XML↔對象轉換)、commons-chain(責任鏈模式組織復雜流程)

單次請求處理流程

  1. *.do攔截 → service() → doGet/doPost()
  2. 調用process() → 獲取RequestProcessor實例
  3. RequestProcessor.process()核心處理:
      ① processMultipart()處理文件上傳
      ② processPath()獲取路徑映射
      ③ 依次處理:Locale、Content、NoCache、Preprocess、CachedMessages、Mapping、Roles、ActionForm、Populate、Validate、Forward、Include
      ④ 創建Action實例 → 執行execute() → 返回ActionForward
      ⑤ 處理ActionForward → 轉發JSP生成HTML響應

全程採用責任鏈模式,各Command節點處理特定職責,異常即時中斷鏈路。

關鍵常識速查

  • 默認配置:struts-config.xml
  • Action核心方法:execute()
  • 雙重驗證:服務端FormBean.validate() + 客戶端validator-rules.xml/validation.xml
  • 啟動時執行init()初始化
  • 編碼問題:過濾器解決
  • Jar衝突:jsp-api.jar/servlet-api.jar與Tomcat衝突 → 獨立lib目錄引用
  • 驗證框架:Form類必繼承ValidatorForm

五大標籤庫體系

標籤庫核心用途
HTML表單標籤與ActionForm綁定,HTML標籤一一映射
Bean輸出文本信息(國際化、屬性訪問)
Logic邏輯判斷/循環,消除JSP腳本代碼
Nested巢狀屬性訪問
Tiles視圖佈局模板化

自定義標籤開發三步驟

  1. 編寫標籤類繼承SimpleTagSupport,實現doTag()
  2. 編寫.tld文件配置URI、屬性、標籤類
  3. JSP頁面<%@ taglib uri="" prefix="" %>引入使用

DynaValidatorForm動態表單配置

<form-bean name="LoginForm" type="org.apache.struts.validator.DynaValidatorForm">
    <form-property name="userName" type="java.lang.String"/>
    <form-property name="password" type="java.lang.String"/>
</form-bean>

Action中使用:DynaValidatorForm form = (DynaValidatorForm) formParam;

客戶端 vs 服務端驗證本質區別

  • 客戶端:瀏覽器JS執行,速度快,但可被繞過(駭客100+種繞過手法)
  • 服務端:Web Service業務邏輯執行,最後防線,需防SQL注入

鐵律:客戶端驗證為體驗優化,服務端驗證為安全底線,絕不可僅依賴客戶端驗證。

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