A:<s:if>判斷字符串的問題
判斷單個字符<s:if test=#sessionuserusername==c>
這樣是從session中取出username的值並且判斷其是否為c但是這樣判斷是不正確的這樣判斷的話根本判斷不出來要改成下面這樣
<s:if test=#sessionuserusername==ctoString()>
這樣判斷才能正確判斷至於原因我也不知道在網上看到struts中可能它判斷的是char類型
判斷字符串<s:if test=#sessionuserusername==milo>
這樣寫的就是判斷username是不是milo是String的判斷這個是不用加toString()的
判斷數值<s:if test=#sessionuserusername==>
這樣寫的就是判斷username是不是是int的判斷
B判斷為空的問題
<s:if test=#sessionuserusername==null>
struts中的判空似乎只能這麼寫
判斷非空可以這樣寫
<s:if test=#sessionuserusername!=null >
ps:如果從action中取屬性值test中的屬性值前面的#不需要action中的屬性與jsp中的屬性是互通的
字符串N一定要用雙引號包含從test的包含則用單引號 如果相反則不能正確判斷該屬性是否與該字符串相等
正確
<s:if test=activityBeansearchForce==N >
錯誤
<s:if test=activityBeansearchForce==N >
因為java是強類型語言單引號表示char類型只能賦給一個字符給char類型
而雙引號則表示String類型
所以我的activityBeansearchForce屬性是String類型那麼N必須要用雙引號
/*************************************************************************************************************************************************************
例如這個語句
要判斷struts堆棧裡systemSettingModelsettingValue 是否等於 A
寫成
<s:if test=systemSettingModelsettingValue == A></s:if>
是不對的
這樣A被認為是字符而systemSettingModelsettingValue是單字符的字符串不匹配
應寫成
<s:if test=systemSettingModelsettingValue == A> </s:if>
或
<s:if test=systemSettingModelsettingValue == \A\> </s:if>
另外systemSettingModelsettingValue的值可以這樣取得
${systemSettingModelsettingValue}
<s:property value=systemSettingModelsettingValue/>
<s:property value=#requestsystemSettingModelsettingValue/>
#表示不在struts堆棧裡沒有#表示從struts堆棧裡取
/*********************************************************************************************************************************************************
Struts堆棧
struts中的標簽
s:a 中的href 什麼時候使用# 什麼時候該用%{ } 什麼時候該用%{# } 什麼時候用
s:select 中的list 什麼時候使用# 什麼時候該用%{ } 什麼時候該用%{# } 什麼時候用
s:if 中的test 什麼時候使用# 什麼時候該用%{ } 什麼時候該用%{# } 什麼時候用
s:iterator 中的value什麼時候使用# 什麼時候該用%{ } 什麼時候該用%{# } 什麼時候用
s:checkboxlist 中的list 什麼時候使用# 什麼時候該用%{ } 什麼時候該用%{# } 什麼時候用
Struts中有值堆棧和堆棧上下文的概念你用 <s:debug />可以看出
S標簽中用#可以取出堆棧上下文中的存放的對象
用%{}可以取出存在值堆棧中的Action對象直接調用它的方法例如你的Action如果繼承了ActionSupport 那麼在頁面標簽中用%{getText(key)}的方式可以拿出國際化信息 %{#} 這是JSP最新規范中的語法是Struts為其解決兼容性問題而寫成%{#}的
在域對象中使用%{#}
比如%{#sessionuseruserName}
將獲得user對象的 userName屬性值
%{}強調的是從你設定的root點取
%{}用於計算表達式
如%{+}結果將輸出
如%{a+b}結果將輸出ab
#通常強調從上下文取
如#parametersname[]等價於requestgetParameter(name)
如#sessionname等價於sessiongetAttribute(name)
如#requestname等價於requestgetAttribute(name)
%{#}仍然用於計算表達式只不過操作元可以是變量
如先定義一個變量
<s:set name=age value=%{}/>
則%{#age}將輸出也可以省略#寫為%{age}
若將age加可這麼寫
%{#age+}將輸出不能省略#也就說變量用於計算時不能省略#
===================================================================================================
ognl中的#%和$
#%和$符號在OGNL表達式中經常出現而這三種符號也是開發者不容易掌握和理解的部分在這裡筆者簡單介紹它們的相應用途
.#符號的用途一般有三種
)訪問非根對象屬性例如示例中的#sessionmsg表達式由於Struts 中值棧被視為根對象所以訪問其他非根對象時需要加#前綴實際上#相當於ActionContext getContext()#sessionmsg表達式相當於ActionContextgetContext()getSession() getAttribute(msg)
)用於過濾和投影(projecting)集合如示例中的persons{?#thisage>}
)用來構造Map例如示例中的#{foo′:bar′ foo′:bar′}
.%符號
%符號的用途是在標志的屬性為字符串類型時計算OGNL表達式的值如下面的代碼所示
構造Map
<s:set name=foobar value=#{foo′:bar′ foo′:bar′} />
<p>The value of key foo″ is <s:property value=#foobar[foo] /></p>
<p>不使用%<s:url value=#foobar[foo] /></p>
<p>使用%<s:url value=%{#foobar[foo]} /></p>
.$符號
$符號主要有兩個方面的用途
在國際化資源文件中引用OGNL表達式例如國際化資源文件中的代碼regagerange=國際化資源信息年齡必須在${min}同${max}之間
在Struts 框架的配置文件中引用OGNL表達式例如下面的代碼片斷所示
<validators>
<field name=intb>
<fieldvalidator type=int>
<param name=min></param>
<param name=max></param>
<message>BActiontest校驗數字必須為${min}為${max}之間!</message>
</fieldvalidator>
</field>
</validators>
From:http://tw.wingwit.com/Article/program/Java/ky/201311/27854.html