root根:Listjava
|
||||||||||||||
contextMap:Mapurl
|
須要熟悉ActionContext和valueStack的API。框架爲咱們存數據。
a、如何獲取ValueStack:
b、ValueStack中的getRoot()方法:
c、CompoundRoot是什麼:
d、棧操做:
使用OGNL表達式來去,struts2的OGNL表達式必須寫在struts2標籤中。
a、取contextMap中的數據,需使用#
b、取contextMap裏面ValueStack中對象的屬性:直接寫屬性名
若是遇有對象屬性重名,能夠經過OGNL表達式,選擇查找的起始位置
特殊說明:當s:property不給定value屬性時,默認取棧頂對象。
OGNL的使用總結:
1.取根中對象的屬性,不使用#。
2.取contextMap中key的值,要使用#。
a、setValue方法
在Jsp頁面上獲取【李四】
b、set方法
細節問題:
當按照以下方式,往根中存放數據時,根中元素是什麼順序?
使用<s:debug/>標籤查看:
c、findValue:咱們在Jsp上調用的都是findValue
前提:
咱們應該知道,若是咱們沒有往值棧(根)中放入數據的話,那麼咱們的動做類默認是在值棧的棧頂。
問題:
咱們放到請求域中的屬性,使用EL表達式取出來了。可是放到應用域中的屬性,使用EL表達式沒取出來。
分析:
咱們知道EL表達式是從四大域對象中依次查找屬性。搜索範圍是由小到大。page Scope————>request Scope————>sessionScope————>application Scope
可是經過測試發現,搜索完request範圍後就沒有繼續搜索,而是返回了ValueStack中棧頂對象name屬性的值。
EL表達式: page Scope————>request Scope————>sessionScope————>application Scope
OGNL表達式:page Scope————>request Scope————>valueStack(根中)————>contextMap————>sessionScope————>application Scope
注意:如下內容知道便可。
a、取contextMap中key時使用,例如<s:property value="#name" />
b、OGNL中建立Map對象時使用,例如:<s:radio list="#{'male':'男','female':'女'}" />
a、在JSP中使用EL表達式時使用,例如${name}
b、在xml配置文件中,編寫OGNL表達式時使用,例如文件下載時,文件名編碼。
struts.xml——>${@java.net.URLEncoder.encode(filename)}
在struts2中,有些標籤的value屬性取值就是一個OGNL表達式,例如<s:property value="OGNL Expression" />
還有一部分標籤,value屬性的取值就是普通字 符串,例如<s:textfield value="username"/>,若是想把一個普通的字符串強制當作時OGNL,就須要使用%{}把字符串套起來。
例如<s:textfield value="%{username}"/>。固然在<s:property value="%{OGNL Expression}" />也可使用,但不會這麼用。
4.2、action標籤
4.3、if標籤,elseif標籤 else標籤
4.4、url和a標籤(頗有用)
自動的數據回顯和錯誤提示功能
自帶的簡單樣式和排版
說明:UI標籤中value的取值通常都是字符串。
默認主題的名稱是XHTML,都是在struts的默認屬性文件中定義着:default.properties
a、更改表單某個元素的默認主題:使用的是表單元素的theme屬性。
b、更改表單全部主題:使用的是form標籤的theme屬性。
c、更改全站全部表單主題:是在struts.xml配置文件中,覆蓋原有主題的設置。
遺留的問題:防不住後退,再提交。
點擊後退的時候,會提示:
配置結果視圖:
遺留的問題:此種解決方式,是產生了錯誤以後再告知用戶,你錯了。