系統闡述 Struts 2 標籤庫架構優勢、OGNL 表達式多根物件存取機制、ValueStack 搜尋邏輯與 Stack Context 內建物件,為高效開發奠定理論基礎。
<s:xxx>,不再像 Struts 1 分 html:、bean:、logic: 多命名空間/struts-tags 命名空間,struts2-core.jar/META-INF/struts-tags.tld.tld 載入WEB-INF 下 .tldweb.xml 配置 <taglib>Struts 2 的 Stack Context 需要多個「根」物件,ValueStack 為其中之一。存取規則:
#bar)ValueStack 以屬性名 "struts.valueStack" 存放於 Request 中(OgnlValueStack 實例)。
key=com.opensymphony.xwork2.util.ValueStack.ValueStack,OGNL 第一個根key=com.opensymphony.xwork2.ActionContext.name(僅 Action 名稱),第二個根<s:debug/> 可顯示 Stack Context 與 Value Stack 內容。
<s:property value="#request['struts.request_uri']"/> <!-- # 表示從根開始,request 為根 -->
若只寫屬性名 ${name},因多根不明確,Struts 2 會存取 ValueStack 中物件的 name 屬性。
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(棧頂優先匹配)
<s:property value="?LoginAction?.name"/>(但壓棧不帶實例名,實測不一定可行)<s:property value="[1].name"/> → 從第二個位置開始找,獲取 LoginAction.name ("Unmi")Struts 2 在 Stack Context 放入:
parameters、request、session、application、attr存取範例:request['name'] 或 request.name。特別說明 attr:依序搜尋 PageContext → HttpServletRequest → HttpSession → ServletContext 對應屬性。