1. 程式人生 > >Struts2的#、%{}、和%{#}的區別

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方法

時,該屬性才會取到,否則它不會被攔截器處理,value引數的型別是object,可以理解為這個預設是會解析成ognl表示式的。如果需要輸入一個字串<s:property value="'ddd'">注意,在value裡面的ddd字串外面加了單引號,這樣不會將ddd解析成ognl表示式了。

%{}:

%{}類似於強轉為值棧的資料型別

並且%用於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.不能省略"#"。也就說變數用於計算時不能省略"#"