問題一:#,%{},$符號 java
在Struts2標籤屬性中常常會出現"#"或者"%{}"的符號出現,經過上面OGNL表達式基礎的介紹,知道了OGNL上下文中有且僅有一個根對象。Struts2爲咱們定義了許多明明對象,他們分別是"ValueStack","Parameters","Session","Request", "Appliction","Attr",其中"ValueStack"被設置爲上下文的根對象。訪問非根對象必須加上"#"號,這就是出現"#"的緣由。Struts2中的標的處理類,並非全部都將標籤的屬性做爲OGNL表達式來看待,有時候咱們須要設置動態地值,則必須告訴標籤的處理類該字符串按照OGNL表達式來處理,%{}符號的做用就是告訴標籤的處理類將它包含的字符串按照OGNL表達式處理。 "$"符號用於XML文件中用於獲取動態值,與%{}做用相似。 express
問題二:%{}符號的影響 lua
Struts2的標籤有不少,要記住哪個標籤的處理類將標籤的屬性做爲OGNL表達式是一件很困難的事情,在不清楚處理類的處理方式時怎麼辦,%{}對於標籤處理類來講,若處理類將屬性值做爲普通字符串則%{}符號包含的字符串當作OGNL表達式,若處理類將屬性值做爲OGNL表達式來處理,則直接忽略%{}符號。換句話說,不清楚處理方式的話,能夠都使用%{}符號。 spa
問題三:標籤是如何得到數據 code
下面是ValueStack的官方描述: 對象
ValueStack allows multiple beans to be pushed in and dynamic EL expressions to be evaluated against it. When evaluating an expression, the stack will be searched down the stack, from the latest objects pushed in to the earliest, looking for a bean with a getter or setter for the given property or a method of the given name (depending on the expression being evaluated). ip
大體意思:ValueStack容許保存多個bean(也就是Action),而且可使用表達式語言得到他們。當評估一個表達式,ValueStack將會從棧頂到棧底的方向被搜索一遍,對於給定的屬性名稱尋找bean的getter或setter方法或尋找給定的方法。 字符串
每當一個請求到達Action時,Struts2會將Action對象推入ValueStack中。 get
<body> username:<s:property value="username"/><br/> username:<%=((HelloWorldAction)ActionContext.getContext().getValueStack().peek()).getUsername() %><br/> </body>
頁面顯示結果: it
username:zhangsan username:zhangsan
能夠看到標籤取值與用Java代碼取值的結果相同,明顯標籤的取值方式更簡練簡潔。OGNL表達式"username"表示了從根對象ValueStack中取出屬性username的值。它會從棧頂到棧底遍歷ValueStack,直到找某一個Action中的"username"屬性。