| 語法 | 名稱 | 用途 | 典型標簽屬性 |
|---|---|---|---|
%{expr} | 強制 OGNL 求值 | 屬性值**預期為字符串**時,強制按 OGNL 表達式解析 | <s:property value="%{user.name}"/>、<s:if test="%{count>0}"/> |
#{expr} | 上下文變量引用 | 引用 **ValueStack 外** 的上下文對象:#request、#session、#application、#parameters、#attr | <s:property value="#session.user.name"/> |
expr (直接寫) | 隱式 OGNL | 標簽屬性**已聲明為 OGNL 類型** (如 test、list、listKey、listValue) 時直接寫表達式 | <s:iterator value="userList"/>、<s:if test="user.active"/> |
rtexprvalue="true" + 類型為 String → 需 %{} 強制求值。boolean/List/Object 等 → 直接寫表達式。request/session/application 作用域 → #{}。<!-- 需 %{ } -->
<s:property value="%{user.name}" />
<s:set name="foo" value="%{bar}" />
<s:url action="%{actionName}" />
<!-- 直接寫 -->
<s:iterator value="userList" />
<s:if test="user.active" />
<s:select list="countryList" listKey="id" listValue="name" />
<!-- 需 #{ } -->
<s:property value="#session.token" />
<s:if test="#request.error != null" />
%{}** → 雙重求值導致錯誤/性能損耗。%{}** → 字符串字面量被當作表達式文本輸出。# 只用於作用域引用**,不用於 ValueStack 內對象(如 user.name 不加 #)。<s:debug/> 查看 ValueStack 結構。CSDN 博客詳細表:Struts2 OGNL 表達式寫法總結
核心口訣:**屬性期望字符串加 %{},需跨作用域加 #{},原生 OGNL 屬性直接寫**。