設計tag的目的是為了顯示動態的數據
   如果我們想要顯示一個屬性"name",我們傳遞字符串"name"給要顯示的tag
   Example1:
   
<s:textfield name="name"/>
如果在值棧里面有一個"name"屬性,那么它就會在標簽中顯示出來!當這個值提交給struts框架時,標簽的值會放入到“name"屬性中!

有時,我們還會傳遞動態數據給一個tag,例如,我們可能想要使用一個input field和一個label來顯示數據,而label的數據也從應用程序的資源中得到!因為struts會從標簽的屬性中去分析表達式,所以我們可以我們可以在運行時在tag的屬性中加載動態數據!
表達式的格式是: "%{.....}" ,這個表達式中的所有文本會被當作一個表達式!
  
struts2中的默認表達式語言是OGNL,使用這種表達式可以調用方法和得到屬性的值,一個比較好的例子是getText方法,這個方法由ActionSupport提供!因為Action也在棧中,所以我們可以在表達中調用它的任何方法!
例子:
    
<s:textfield label="%{getText("labelName")}" name="name"/>
     其中的"labelName"來自資源文件
    
package.properties
             labelName=The First Label
             .........

非字符串屬性 
 HTTP協議是基于文本的,不過一些標簽有非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 值,是因為框架中把它看成了一個表達式,并自動的轉換成一個boolean值!

值是對象
  我們由一個例子說明
<s:textfield key="state.label" name="state" value="cA"/>
     當一個textfield被傳遞了一個叫"CA"的屬性,struts會從所有的屬性中尋找一個名為getCA的getter屬性從面得到這個對象的引用。
另一種方式是通過表達式符號得到對象的引用!
<s:textfield key="state.label" name="state" value="%{cA}"/>

總結:
 通過上面的分析我們得到tag屬性值得到的規則:
1.所有的String屬性值"value"會被解析為"%{value}"
2.所有非String屬性會直接由表達式得到結果!
3.在2中當非String值使用"%{}"時,符號會被忽略!