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

Struts2 OGNL 表達式寫法:%{}、#{}、直接寫三種場景區分

     編輯:程式設計綜合問答

三種寫法對比

語法名稱用途典型標簽屬性
%{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"/>

判斷規則:查看標簽屬性定義 (TLD)

  • 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 屬性直接寫**。

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