struts2 s:if標籤以及 #,%{},%{#}的使用方法
<s:if>判斷字串的問題:
1、判斷單個字元:<s:if test="#session.user.username=='c'">
這樣是從session中取出username的值,並且判斷其是否為c,但是這樣判斷是不正確的,這樣判斷的話,根本判斷不出來,要改成下面這樣:
<s:if test="#session.user.username=='c'.toString()">
這樣判斷才能正確判斷,至於原因我也不知道,在網上看到struts2中可能它判斷的是char型別。
2、判斷字串:<s:if test="#session.user.username=='milo'">
這樣寫的就是判斷username是不是milo,是String的判斷,這個是不用加toString()的。
3、判斷數值:<s:if test="#session.user.username==0">
這樣寫的就是判斷username是不是0,是int的判斷。
B:判斷為空的問題:
<s:if test="#session.user.username==null">
struts2中的判空似乎只能這麼寫
判斷非空可以這樣寫:
<s:if test="#session.user.username!=null" >
ps:如果從action中取屬性值,test中的屬性值前面的'#'不需要,action中的屬性與jsp中的屬性是互通的。
字串N一定要用“”雙引號包含,從test的包含則用單引號 ‘ ’,如果相反,則不能正確判斷該屬性是否與該字串相等。
正確:
<s:if test='activityBean.searchForce=="N" '>
錯誤:
<s:if test="activityBean.searchForce=='N' ">
因為java是強型別語言,單引號表示char型別,只能賦給一個字元給char型別,
而雙引號則表示String型別
所以我的activityBean.searchForce屬性是String型別,那麼N必須要用雙引號
例如這個語句
要判斷struts堆疊裡systemSettingModel.settingValue 是否等於 "A"
寫成
<s:if test="systemSettingModel.settingValue == 'A'">...</s:if>
是不對的。
這樣A被認為是字元,而systemSettingModel.settingValue是單字元的字串,不匹配
應寫成
<s:if test='systemSettingModel.settingValue == "A"'>。。。 </s:if>
或
<s:if test="systemSettingModel.settingValue == \"A\"">... </s:if>
另外systemSettingModel.settingValue的值可以這樣取得
${systemSettingModel.settingValue}
<s:property value="systemSettingModel.settingValue"/>
<s:property value="#request.systemSettingModel.settingValue"/>
#表示不在struts堆疊裡,沒有#表示從struts堆疊裡取
Struts2堆疊
struts2中的標籤“# ”,“%{ }”,“%{# }”
s:a 中的href 什麼時候使用“# ” 什麼時候該用“%{ }” 什麼時候該用“%{# }” 什麼時候用“”
s:select 中的list 什麼時候使用“# ” 什麼時候該用“%{ }” 什麼時候該用“%{# }” 什麼時候用“”
s:if 中的test 什麼時候使用“# ” 什麼時候該用“%{ }” 什麼時候該用“%{# }” 什麼時候用“”
s:iterator 中的value什麼時候使用“# ” 什麼時候該用“%{ }” 什麼時候該用“%{# }” 什麼時候用“”
s:checkboxlist 中的list 什麼時候使用“# ” 什麼時候該用“%{ }” 什麼時候該用“%{# }” 什麼時候用“”
Struts2中有值堆疊和堆疊上下文的概念,你用 <s:debug />可以看出.
S標籤中用#可以取出堆疊上下文中的存放的物件.
用%{}可以取出存在值堆疊中的Action物件,直接呼叫它的方法.例如你的Action如果繼承了ActionSupport .那麼在頁面標籤中,用%{getText('key')}的方式可以拿出國際化資訊. %{#}, 這是JSP2.1最新規範中的語法,是Struts2為其解決相容性問題而寫成%{#}的
在域物件中使用%{#}
比如%{#session.user.userName}
將獲得user物件的 userName屬性值
%{}強調的是從你設定的root點取
%{}用於計算表示式
如%{10+20}結果將輸出30
如%{"a"+"b"}結果將輸出"ab"
#通常強調從上下文取
如#parameters.name[0]等價於request.getParameter("name")
如#session.name等價於session.getAttribute("name")
如#request.name等價於request.getAttribute("name")
%{#}仍然用於計算表示式,只不過操作元可以是變數
如先定義一個變數
<s:set name="age" value="%{25}"/>
則%{#age}將輸出25,也可以省略"#",寫為%{age}
若將age加10,可這麼寫:
%{#age+10},將輸出30.不能省略"#"。也就說變數用於計算時不能省略"#"
ognl中的#、%和$
#、%和$符號在OGNL表示式中經常出現,而這三種符號也是開發者不容易掌握和理解的部分。在這裡筆者簡單介紹它們的相應用途。
1.#符號的用途一般有三種。
1)訪問非根物件屬性,例如示例中的#session.msg表示式,由於Struts 2中值棧被視為根物件,所以訪問其他非根物件時,需要加#字首。實際上,#相當於ActionContext. getContext();#session.msg表示式相當於ActionContext.getContext().getSession(). getAttribute(”msg”) 。
2)用於過濾和投影(projecting)集合,如示例中的persons.{?#this.age>20}。
3)用來構造Map,例如示例中的#{’foo1′:’bar1′, ’foo2′:’bar2′}。
2.%符號
%符號的用途是在標誌的屬性為字串型別時,計算OGNL表示式的值。如下面的程式碼所示:
構造Map
<s:set name=”foobar” value=”#{’foo1′:’bar1′, ‘foo2′:’bar2′}” />
<p>The value of key “foo1″ is <s:property value=”#foobar['foo1']” /></p>
<p>不使用%:<s:url value=”#foobar['foo1']” /></p>
<p>使用%:<s:url value=”%{#foobar['foo1']}” /></p>
3.$符號
$符號主要有兩個方面的用途。
在國際化資原始檔中,引用OGNL表示式,例如國際化資原始檔中的程式碼:reg.agerange=國際化資源資訊:年齡必須在min同min同{max}之間。
在Struts 2框架的配置檔案中引用OGNL表示式,例如下面的程式碼片斷所示:
<validators>
<field name=”intb”>
<field-validator type=”int”>
<param name=”min”>10</param>
<param name=”max”>100</param>
<message>BAction-test校驗:數字必須為min為min為{max}之間!</message>
</field-validator>
</field>
</validators
另一個很容易錯誤應用的問題
<s:if test="deptType==1" >下屬</s:if>如果你的資料庫對應的欄位型別為整形,可以這樣使用;
<s:if test="deptType=='1'" >下屬</s:if>如果你的資料庫對應的欄位型別為char,可以這樣使用;
<s:if test="deptType=='aa'" >下屬</s:if>如果你的資料庫對應的欄位型別為varchar,並且資料庫中的字串都是多餘一個字元的字串,可以這樣使用;
<s:if test="deptType==\"1\"" >下屬</s:if><s:else>直屬</s:else>(測試通過,這樣用是最正確的)
我遇到的樣式選中問題解決方法:
<li>
<a href="/pro/pro!productList.action?proId=${productType.id}" <s:if test="#productType.id == #parameters.productType[0]">class="currt"</s:if>>${productType.typeName}</a>
</li>