设计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值使用"%{}"时,符号会被忽略!