設計tag的目的是為了顯示動態(tài)的數(shù)據(jù)
如果我們想要顯示一個屬性"name",我們傳遞字符串"name"給要顯示的tag
Example1:
<s:textfield name="name"/>
如果在值棧里面有一個"name"屬性,那么它就會在標簽中顯示出來!當這個值提交給struts框架時,標簽的值會放入到“name"屬性中!
有時,我們還會傳遞動態(tài)數(shù)據(jù)給一個tag,例如,我們可能想要使用一個input field和一個label來顯示數(shù)據(jù),而label的數(shù)據(jù)也從應用程序的資源中得到!因為struts會從標簽的屬性中去分析表達式,所以我們可以我們可以在運行時在tag的屬性中加載動態(tài)數(shù)據(jù)!
表達式的格式是: "%{.....}" ,這個表達式中的所有文本會被當作一個表達式!
struts2中的默認表達式語言是OGNL,使用這種表達式可以調(diào)用方法和得到屬性的值,一個比較好的例子是getText方法,這個方法由ActionSupport提供!因為Action也在棧中,所以我們可以在表達中調(diào)用它的任何方法!
例子:
<s:textfield label="%{getText("labelName")}" name="name"/>
其中的"labelName"來自資源文件
package.properties
labelName=The First Label
.........
非字符串屬性
HTTP協(xié)議是基于文本的,不過一些標簽有非String類型的屬性:bool ,int ....。struts2中,所有非String類型由表達式得到,但表達式符號不是必需的,
<s:select key="state.label" name="state" multiple="true"/>
<s:select key="state.label" name="state" multiple="%{true}"/> //有表達式符號
<s:select key="state.label" name="state" multiple="allowMultiple"/>//從屬性中取值
<s:select key="state.label" name="state" multiple="%{allowMultiple}"/>
//詳細的從屬性中取值的表達式
上面的multiple屬性映射為一個boolean值,struts 框架并沒有認為它是一個String 值,是因為框架中把它看成了一個表達式,并自動的轉(zhuǎn)換成一個boolean值!
值是對象
我們由一個例子說明
<s:textfield key="state.label" name="state" value="cA"/>
當一個textfield被傳遞了一個叫"CA"的屬性,struts會從所有的屬性中尋找一個名為getCA的getter屬性從面得到這個對象的引用。
另一種方式是通過表達式符號得到對象的引用!
<s:textfield key="state.label" name="state" value="%{cA}"/>
總結(jié):
通過上面的分析我們得到tag屬性值得到的規(guī)則:
1.所有的String屬性值"value"會被解析為"%{value}"
2.所有非String屬性會直接由表達式得到結(jié)果!
3.在2中當非String值使用"%{}"時,符號會被忽略!