Struts2的#、%{}、和%{#}的區別
#:
#用來取根目錄下的值,例如 session,request等等,取值的時候#session.key.屬性名 ,這樣會取到想要的物件的屬性值。
#代表當前的意思可以取出堆疊上下文的存放物件,不在struts堆疊裡,沒有#表示從struts堆疊裡取
如果從action中取屬性值,則test中的屬性值前面的'#'不需要
#通常強調從上下文取
當Action的valueStack中有該屬性的值時,只需直接使用該屬性的名字即可;
當Action的valueStack中沒有該屬性的值時,比如在session,application範圍中的屬性值時,需要加#或者#attr.;
訪問OGNL上下文和Action上下文,#相當於ActionContext.getContext();
另外OGNL會設定一個根物件(root物件),在Struts2中根物件就是ValueStack(值棧)。如果要訪問根物件(即ValueStack)中物件的屬性,則可以省略#名稱空間,直接訪問該物件的屬性即可。
在struts2中,根物件ValueStack的實現類為OgnlValueStack,該物件不是我們想像的只存放單個值,而是存放一組物件。在OgnlValueStack類裡有一個List型別的root變數,就是使用他存放一組物件
,OGNL表示式需要配合Struts標籤才可以使用。如:<s:property value="name"/>
注意:
在action中設定了該屬性的setter/getter方法
%{}:
%{}類似於強轉為值棧的資料型別
並且%用於OGNL標籤巢狀時候用的,比如想把一個物件的值賦值給另外一個物件:
用%{}可以取出存在值堆疊中的Action物件,
這是JSP2.1最新規範中的語法,是Struts2為其解決相容性問題而寫成%{#}的
%{}強調的是從你設定的root點取
%{}用於計算表示式
如%{10+20}結果將輸出30
如%{"a"+"b"}結果將輸出"ab"
%{#}:
在域物件中使用%{#}
比如%{#session.user.userName}
將獲得user物件的 userName屬性值
%{#}仍然用於計算表示式,只不過操作元可以是變數
如先定義一個變數
<s:set name="age" value="%{25}"/>
則%{#age}將輸出25,也可以省略"#",寫為%{age}
若將age加10,可這麼寫:
%{#age+10},將輸出30.不能省略"#"。也就說變數用於計算時不能省略"#"