Struts标签和OGNL表达式
1.OGNL通過索引訪問ValueStack中的對象。
[0].name
[1].name
上面使用的索引的方式并不是直接取得指定元素,而是從指定索引開始向下搜索。
訪問ValueStack里的屬性:${bar}
2.OGNL對非根對象屬性的訪問前要加#號
#foo.blash
Struts2的命名對象,他們與根對象無關,只是存在于Stack Context中,所以訪問他們時需要使用#前綴來指明:
parameters對象:#parameters['foo'] 或 #parameters.foo
request對象:#request['foo'] 或 #request.foo
session對象:#session['foo'] 或 #session.foo
application對象
attr對象:按PageContext,request.session.ServletContext的順序尋找對象
3.OGNL集合操作
生成List集合:{e1,e2,e2 ...}
生成Map集合:#{key1:value1,key2:value2 ...}
in 與 notin:
<s:if text="'foo' in {'foo','bar'}">...</s:if>
<s:if text="'foo' notin {'foo','bar'}">...</s:if>
獲取集合子集:
person.relatives.{? #this.gender == 'male'} (問號可以替換為:^,$)
集合后緊跟.{}元素運算符用于取出集合的子集,而#this代表集合里的元素
4.如果為<s:iterator .../>標簽指定status屬性,即每次迭代時都會有一個IteratorStatus實例,該實例包含以下方法:getCount(),getIndex(),isEven(),isOdd(),isFirst(),isLast()
在OGNL表達式中可以通過 #st.odd, #st.count來訪問,st為IteratorStatus的實例
5.使用iterator迭代Map對象:
<s:iterator value="集合對象" status="st">
??? <s:property value="key"/><s:property value="value">
</s:iterator>
6.使用append標簽將多個集合拼接成一個新集合,然后使用iterator進行迭代
<s:append id="newList">
??? <s:param value="集合1"/>
??? <s:param value="集合2"/>
</s:append>
<s:iterator value="#newList">...</s:iterator>
7.generator標簽:分割字符串,生成的集合存放在ValueStack棧頂,在標簽體中使用iterator迭代,不使用values屬性(默認迭代ValueStack棧頂集合),標簽結束,此集合即被刪除。如果指定了此標簽的id,則將臨時生成的集合放置到pageContext屬性中
<s:generator val="字符串">
??? <s:iterator status="st">
??????? <s:property/> 個人理解:每次迭代都會把迭代元素放到ValueStack棧頂,使用完后即刪除,<s:property/>默認去棧頂元素,去完刪除,然后迭代下一個
??? </s:iterator>
</s:generator>
8.做XXBean對象的編輯時,如醫生編譯,可以實例化一個醫生對象,并設置相關屬性,并將這個bean push到ValueStack中,跳轉到相關頁面。
9.struts2 token防止重復提交的原理:
首先,jsp頁面在每次加載的時候都會生成一個新GUID,這個id會分別存放到頁面隱藏域和Session中,當頁面提交的時候,攔截器將對頁面隱藏域中的id與session中的id進行對比,如果相同,則刪除session中的id(等待再次請求頁面時的再次創建),繼續執行,完成后面的操作。但如果此時請求失敗,用history.back(-1)返回時,頁面中的id與session中已經不相同,再次提交就會出現重復提交的問題。這和F5刷新的道理一樣,session中id被刪除后,刷新頁面,提交上來的id還是原來的id,而session中此時已沒有id,判斷提交失敗!這才是token解決重復提交問題的原理。
10.struts2中ActionContext內置對象的作用(他們都是Map類型的集合):
parameters 包含當前Http請求參數的Map,也包含通過<s:param>標簽傳進的參數
#parameters.id[0]=request.getParameter("id")
request 包含當前HttpServletReqeust的屬性(attribute)的Map
#reqeust.username=request.getAttribute("username");
session 包含當前HttpSession的屬性的Map
#session.username=session.getAttribute("username");
application 包含當前ServletContext的屬性的Map
#application.username=application.getAttribute("username");
attr 用于按request->session->application順序訪問其屬性
11.在action中需要真正使用request,session,application對象是,action要實現ServletRequestAware, SessionAware, ServletContextAware接口
轉載于:https://www.cnblogs.com/macooma/archive/2010/03/15/1686240.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Struts标签和OGNL表达式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 移植基于linux-2.6.26.5内核
- 下一篇: 模式规则及自动化变量