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

Struts 2 學習筆記(八):標籤庫架構與 OGNL 存取機制——統一前綴、多根物件、ValueStack 搜尋邏輯

     編輯:Java 相關知識

系統闡述 Struts 2 標籤庫架構優勢、OGNL 表達式多根物件存取機制、ValueStack 搜尋邏輯與 Stack Context 內建物件,為高效開發奠定理論基礎。

標籤庫架構優勢

  • 統一前綴:<s:xxx>,不再像 Struts 1 分 html:、bean:、logic: 多命名空間
  • 表現層技術無關:JSP、Velocity、FreeMarker 通用
  • 預設支援多種表達式:OGNL、JSTL、Groovy、Velocity(Struts 1 需額外引入 struts-el.jar + JSTL)
  • 功能更強、用法更簡單:標籤定義於 /struts-tags 命名空間,struts2-core.jar/META-INF/struts-tags.tld

標籤庫載入機制

  • Servlet 2.4+:啟動時遞歸掃描 classpath 下 .tld 載入
  • Servlet 2.3:自動掃描 WEB-INF 下 .tld
  • 更早版本:需在 web.xml 配置 <taglib>

XWork 擴展 OGNL:ValueStack 與多根物件

Struts 2 的 Stack Context 需要多個「根」物件,ValueStack 為其中之一。存取規則:

  • 屬性屬於根物件 → 直接存取
  • 否則需命名空間(如 #bar)

ValueStack 以屬性名 "struts.valueStack" 存放於 Request 中(OgnlValueStack 實例)。

OGNL 兩大根物件與特殊存取器

  1. 系統 ValueStack:key=com.opensymphony.xwork2.util.ValueStack.ValueStack,OGNL 第一個根
  2. 最近的 Action 上下文:key=com.opensymphony.xwork2.ActionContext.name(僅 Action 名稱),第二個根

<s:debug/> 可顯示 Stack Context 與 Value Stack 內容。

標準 OGNL 存取

<s:property value="#request['struts.request_uri']"/>  <!-- # 表示從根開始,request 為根 -->

若只寫屬性名 ${name},因多根不明確,Struts 2 會存取 ValueStack 中物件的 name 屬性。

Struts 2 特殊存取器:從棧頂向下搜尋匹配

ValueStack 中有 Animal(name,species)(棧頂)與 LoginAction(name,salary):

<s:property value="species"/>  → Animal.species
<s:property value="salary"/>   → LoginAction.salary
<s:property value="name"/>    → Animal.name(棧頂優先匹配)

如何取得被遮蔽的屬性?

  1. 類型限定:<s:property value="?LoginAction?.name"/>(但壓棧不帶實例名,實測不一定可行)
  2. 索引存取:<s:property value="[1].name"/> → 從第二個位置開始找,獲取 LoginAction.name ("Unmi")

Stack Context 內建命名物件

Struts 2 在 Stack Context 放入:

  • parameters、request、session、application、attr

存取範例:request['name'] 或 request.name。特別說明 attr:依序搜尋 PageContext → HttpServletRequest → HttpSession → ServletContext 對應屬性。

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