2021-10數(shù)據(jù)驗證常用標簽5.struts ognl_第1頁
2021-10數(shù)據(jù)驗證常用標簽5.struts ognl_第2頁
2021-10數(shù)據(jù)驗證常用標簽5.struts ognl_第3頁
2021-10數(shù)據(jù)驗證常用標簽5.struts ognl_第4頁
2021-10數(shù)據(jù)驗證常用標簽5.struts ognl_第5頁
已閱讀5頁,還剩44頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、北京傳智播客教育 Struts2廣州傳智北京傳智播客教育 Struts2的OGNLOGNL表達式 OGNL是Object Graphic Navigation Language(對象圖導航語言)的縮寫,它是一個開源項目。 Struts2框架使用OGNL作為默認的表達式語言。OGNL優(yōu)勢 1、支持對象方法調(diào)用,如xxx.doSomeSpecial(); 2、支持類靜態(tài)的方法調(diào)用和值訪問,表達式的格式: 類全名(包括包路徑)方法名 | 值名,例如: java.lang.Stringformat(foo %s, bar) 或tutorial.MyConstantAPP_NAME; 3、支持賦值操作和

2、表達式串聯(lián),如price=100, discount=0.8, calculatePrice(),這個表達式會返回80; 4、訪問OGNL上下文(OGNL context)和ActionContext; 5、操作集合對象??偨Y(jié) OGNL 有一個上下文(Context)概念,說白了上下文就是一個MAP結(jié)構,它實現(xiàn)了 java.utils.Map 的接口。Ognl的基本實現(xiàn)Ognl的API類和方法OgnlContext類【本質(zhì)是一個Map】 OgnlContext context = new OgnlContext(); context.put(user, user); context.put(a

3、ddress, address); context.setRoot(address)Ognl類 Object obj1 = Ognl.parseExpression(“country”); 解析ognl表達式 Ognl.getValue(obj1, context, context.getRoot(); 獲取ognl的表達式值 Object obj2 = Ognl.parseExpression(“l(fā)anguage.toUpperCase()”); 方法調(diào)用 Object obj3 = Ognl.parseExpression(java.lang.IntegertoBinaryString(1

4、0); Object obj4 = Ognl.parseExpression(“min(10,4)”); Math類的方法直接調(diào)用北京傳智播客教育 Struts2的值棧ValueStack理解ValueStack ValueStack實際是一個接口,在Struts2中利用OGNL時,實際上使用的是實現(xiàn)了該接口的OgnlValueStack類,這個類是Struts2利用OGNL的基礎。ValueStack特點 ValueStack貫穿整個 Action 的生命周期(每個 Action 類的對象實例都擁有一個 ValueStack 對象). 相當于一個數(shù)據(jù)的中轉(zhuǎn)站. 在其中保存當前Action 對

5、象和其他相關對象. Struts2框架把 ValueStack 對象保存在名為 “struts.valueStack” 的request請求屬性中。ValueStack存儲對象 ObjectStack: Struts 把動作和相關對象壓入 ObjectStack 中-List ContextMap: Struts 把各種各樣的映射關系(一些 Map 類型的對象) 壓入 ContextMap 中 Struts 會把下面這些映射壓入 ContextMap 中 parameters: 該 Map 中包含當前請求的請求參數(shù) request: 該 Map 中包含當前 request 對象中的所有屬性 s

6、ession: 該 Map 中包含當前 session 對象中的所有屬性 application:該 Map 中包含當前 application 對象中的所有屬性 attr: 該 Map 按如下順序來檢索某個屬性: request, session, application北京傳智播客教育 Struts2的值棧ValueStack理解ValueStack獲取 ValueStack valuestack1 = (ValueStack) request.getAttribute(struts.valueStack) ValueStack valuestack2 = ServletActionCon

7、text.getContext().getValueStack(); 直接輸出類引用變量可見值棧類 com.opensymphony.xwork2.ognl.OgnlValueStackValueStack分析 在獲取值棧的代碼處添加斷點查看 valuestack1 變量。北京傳智播客教育 Struts2的值棧ValueStack理解ValueStack分析 CompoundRoot root; 是繼承ArrayList的對象棧 Map context; 是實現(xiàn)Map的Map棧對象棧分析 默認的對象棧第一個索引存儲的是當前的Action 使用以下代碼往對象棧中添加基本數(shù)據(jù)和對象數(shù)據(jù)分析存儲原理

8、 由于是對象棧是ArrayList集合,因此可以根據(jù)索引插入來改變插入數(shù)據(jù)的位置。使用Struts2標簽標簽在頁面中查看對象棧(值棧)。北京傳智播客教育 Struts2的值棧ValueStack理解ValueStack分析 CompoundRoot root; 是繼承ArrayList的對象棧 Map context; 是實現(xiàn)Map的Map棧Map棧分析 Map棧中主要存儲的是域變量屬性值。北京傳智播客教育 Struts2的值棧ValueStack理解ValueStack總結(jié) 值棧以struts.valueStack的名字存儲在request請求中,值棧主要包含兩個棧:對象棧和Map棧。 對象

9、棧存儲的是用戶的基本數(shù)據(jù)和對象數(shù)據(jù) ; Map棧主要存儲的是域?qū)ο髮傩浴?用戶每次一個請求就一個Action實例,對應一個值棧對象。思考 放在request中的值棧中可以存儲session和servletContext域數(shù)據(jù),顯然request的作用于沒有那么大?直接使用拷貝的方式以key=value的方式拷貝到Map棧對應的Map中。Map棧中的_root debug可見該屬性中引用的是對象棧數(shù)據(jù)。如果在Map棧中不存儲_root對于對象棧的引用,那么開發(fā)者需要訪問數(shù)據(jù)時候首先要區(qū)分是訪問對象棧還是Map棧,比較繁瑣。因此以后操作數(shù)據(jù)直接操作Map棧即可。源碼分析 public class

10、OgnlContext extends Object implements Map private Object _root; / 對象棧引用 private Map _values = new HashMap(23); / Map棧 OgnlContext是OGNL的數(shù)據(jù)中心北京傳智播客教育 Struts2中OgnlContextOgnlContext OgnlContext是Struts2的數(shù)據(jù)中心。結(jié)構示意圖如下:分析 當Struts2接受一個請求時,會迅速創(chuàng)建ActionContext、ValueStack和Action對象。然后把action存放進ValueStack,所以actio

11、n的實例變量可以被OGNL訪問。 注意 Struts2中,OGNL表達式需要配合Struts標簽才可以使用。如: OgnlContextparametersrequestsessionapplicationattrvalue stack (OgnlValueStack的root屬性(List)北京傳智播客教育 ActionContext和ServletActionContextActionContext和ServletActionContext的繼承關系分析 ActionContext提供了對ognl上下文對象中數(shù)據(jù)操作的方法。 ServletActionContext.getRequest(

12、).setAttribute(username, username_request); ServletActionContext.getServletContext().setAttribute(username, username_application); ServletActionContext.getContext().getSession().put(username, username_session); ValueStack valueStack=ServletActionContext.getContext().getValueStack(); System.out.print

13、ln(valueStack +valueStack); valueStack.set(username, username_valueStack);北京傳智播客教育 OGNL表達式之#號#號的作用 #號主要用于訪問訪問Map棧信息,不使用#號主要用于訪問List(對象棧)信息。舉例 / 獲取對象棧信息(默認從棧頂檢索) Struts2的property 標簽中value屬性值會特意的將其中的值以OGNL表達式的方式進行運行。北京傳智播客教育 OGNL表達式之深入理解對象棧檢索順序?qū)ο髼V刑砑訉ο?1、給Action添加name和psw屬性 2、創(chuàng)建一個User指定name和psw屬性 3、創(chuàng)建

14、一個Student指定name和psw屬性 分別將User和Studen存儲到對象棧中分析 name = psw = 一定是從棧頂開始查詢,一旦找到就 顯示。沒有找到依次遍歷對象棧的所 有屬性。OgnlValueStack類里有一個List類型的root變量,存放了一組對象,處于第一位的對象叫棧頂對象。(list集合的 索引為0為棧頂)。通常我們在OGNL表達式里直接寫上屬性的名稱即可訪問root變量里對象的屬性,索順序是從棧頂對象開始尋找,如果棧頂對象不存在該屬性,就會從第二個對象尋找,如果沒有找到就從第三個對象尋找,依次往下訪問,直到找到為止。北京傳智播客教育 OGNL表達式之#號#號的作

15、用 #號還有一個作用就是在JSP頁面中構建Map集合。 不用#號可以在jsp頁面中創(chuàng)建List集合。 格式:#key:value,key:value.舉例 Struts2的radio標簽主要任務是在頁面中顯示單選按鈕 運行結(jié)果源碼: 男 女北京傳智播客教育 OGNL表達式之$號$號的作用 在國際化資源文件中,引用OGNL表達式(先不講) 在Struts2配置文件中,引用OGNL表達式舉例 ognl.xml配置文件 /ognl/ognl.jsp?username=$#request.username 在ognl.jsp中獲取攜帶的參數(shù): 北京傳智播客教育 OGNL表達式之%號%號的作用 “%”符

16、號的作用是在當Struts2標簽的屬性值為OGNL表達式時OGNL表達式卻被理解為字符串類型原樣輸出時,用于通知執(zhí)行環(huán)境%里的是OGNL表達式。 舉例 Struts2中的textfield標簽主要用于在頁面中顯示一個文本輸入框數(shù)據(jù)。類似input 此時#request.username被理解為一個普通的字符串,因此直接顯示。因為這里脫離了 運行OGNL的環(huán)境即:環(huán)境。 通知運行環(huán)境將#request.username以OGNL表達式運行: 總結(jié) 為了方便使用%我們可以在任何地方都直接添加%來確保運行OGNL表達式: 北京傳智播客教育 Struts2標簽Struts2標簽邏輯標簽UI標簽(節(jié)省h

17、tml代碼s)北京傳智播客教育 property標簽property標簽用于輸出指定值: * default:可選屬性, 如果需要輸出的屬性值為null,則顯示該屬性指定的值 * escape:可選屬性,指定是否格式化HTML代碼。 * value: 可選屬性,指定需要輸出的屬性值,如果沒有指定該屬性,則默認輸 出ValueStack棧頂?shù)闹?。例?: :輸出棧頂?shù)闹?輸出: username=username_valueStack, msgxx=msg_valueStack s:property value=% hr的使用 escape=false / 輸出: hr的使用 注:escape=

18、“false”時,hr作為html標簽使用北京傳智播客教育 set標簽set標簽用于將某個值放入指定范圍。 var:變量的名字,name,id和var表達的含義是一樣的,name,id被var替代 scope:指定變量被放置的范圍,該屬性可以接受application、session、request、 page或 action。如果沒有設置該屬性,則默認放置在action中。 value:賦給變量的值.如果沒有設置該屬性,則將ValueStack棧頂?shù)闹蒂x給變量。例子: 北京傳智播客教育 push標簽push:將對象放入棧頂,不能放入其他范圍,當標簽結(jié)束,會從棧頂刪除。 value:要push

19、到堆棧中的值 。例子: 測試刪除: 北京傳智播客教育 bean標簽(了解)bean標簽: 實例化一個符合JavaBeans規(guī)范的class,標簽體內(nèi)可以包含幾個Param元素, 用于調(diào)用setter方法給此class的屬性賦值. name:要被實例化的class名字(必須符合JavaBeans規(guī)范) var: 賦給變量的值.放置在request作用域中 如果沒有設置該屬性,則對象被放置到棧頂例子: 北京傳智播客教育 action標簽Action:通過指定命名空間和action名稱,該標簽允許在jsp頁面直接調(diào)用Action name:action名字(不包括后綴,如.action) names

20、pace:action所在命名空間 executeResult:Action的result是否需要被執(zhí)行,默認值是false不執(zhí)行例子: /ognl/ongl.jsp?msg=$msgxx 北京傳智播客教育 iterator標簽Iterator:標簽用于對集合進行迭代,這里的集合包含List、Set和數(shù)組。value:可選屬性,指定被迭代的集合,如果沒有設置該屬性,則使用ValueStack棧頂?shù)募?。var: 可選屬性,引用變量的名稱.status:可選屬性,該屬性指定迭代時的IteratorStatus實例。該實例包含如下幾個方法:int getCount(),返回當前迭代了幾個元素。in

21、t getIndex(),返回當前迭代元素的索引。boolean isEven(),返回當前被迭代元素的索引是否是偶數(shù)boolean isOdd(),返回當前被迭代元素的索引是否是奇數(shù)boolean isFirst(),返回當前被迭代元素是否是第一個元素。boolean isLast(),返回當前被迭代元素是否是最后一個元素。 北京傳智播客教育 iterator標簽 st.getCount(): st.getIndex(): st.isEven(): st.isOdd(): st.isFirst: st.isLast(): tr class= style type=text/css .odd

22、background-color: red; .even background-color:blue; 北京傳智播客教育 if/elseif/else標簽if/elseif/else 基本的流程控制.If標簽可單獨使用也可以和Else If標簽和(或)一個多個Else一起使用 2321都不等 s:if test=#person.age少年 s:elseif test=#person.age中年 老年 北京傳智播客教育 url標簽url:該標簽用于創(chuàng)建url,可以通過param標簽提供request參數(shù). value:如果不提供就用當前action,使用value后綴必須加.action act

23、ion:用來生成url的action,如果沒有則使用value namespace :命名空間 var:引用變量的名稱. 使用action a href= xxxx a href= xxxx 使用value a href= xxxx北京傳智播客教育 ognl操作集合使用ognl操作list和數(shù)組. Action中: private List allList = new ArrayList();Jsp: 集合的長度:北京傳智播客教育 ognl操作集合使用ognl操作list和數(shù)組. ognl也可直接創(chuàng)建集合對象. 利用下拉列表框:Jsp: 北京傳智播客教育 ognl操作集合使用ognl操作map

24、 ognl用多種方式使用#號,每種是不同的.動態(tài)map對于動態(tài)單選按扭組很有用.創(chuàng)建map與創(chuàng)建list語法很相似,不同的是map前需要加#號.北京傳智播客教育 ognl操作集合 使用ognl操作map ognl用多種方式使用#號,每種是不同的.動態(tài)map對于動態(tài)單選按扭組很有用. 創(chuàng)建map與創(chuàng)建list語法很相似,不同的是map前需要加#號. key= value= key= value= UI標簽表單標簽將在 HTML 文檔里被呈現(xiàn)為一個表單元素使用表單標簽的優(yōu)點:表單回顯對頁面進行布局和排版標簽的屬性可以被賦值為一個靜態(tài)的值或一個 OGNL 表達式. 如果在賦值時使用了一個 OGNL

25、表達式并把它用 % 括起來, 這個表達式將會被求值.表單標簽的共同屬性* 該屬性只在沒有使用 simple 主題時才可以使用. *form 標簽form 標簽用來呈現(xiàn) HTML 語言中的表單元素默認情況下, form 標簽將被呈現(xiàn)為一個表格形式的 HTML 表單. 嵌套在 form 標簽里的輸入字段 將被呈現(xiàn)為一個表格行. 每個表格行由兩個字段組成, 一個對應著行標, 一個對應著輸入元素. 提交按鈕將被呈現(xiàn)為一個橫跨兩列單元格的行textfield, password, hidden 標簽textfield 標簽將被呈現(xiàn)為一個輸入文本字段, password 標簽將被呈現(xiàn)為一個口令字段, hi

26、dden 標簽將被呈現(xiàn)為一個不可見字段. password 標簽擴展自 textfield 標簽, 多了一個 showPassword 屬性.該屬性是布爾型. 默認值為 false, 它決定著在表單回顯時是否顯示輸入的密碼. true顯示密碼 submit 標簽submit 標簽將呈現(xiàn)為一個提交按鈕. 根據(jù)其 type 屬性的值. 這個標簽可以提供 3 種呈現(xiàn)效果:input: button: image: reset 標簽reset 標簽將呈現(xiàn)為一個重置按鈕. 根據(jù)其 type 屬性的值. 這個標簽可以提供 2 種呈現(xiàn)效果:input: button: label 標簽label 標簽將呈現(xiàn)

27、一個 HTML 行標元素: textarea 標簽textarea 標簽將呈現(xiàn)為一個 HTML 文本域元素*checkbox 標簽checkbox 標簽將呈現(xiàn)為一個 HTML 復選框元素. 與其他 HTML 輸入元素類似, 當包含著一個單選框的表單被提交時, 這個單選框按鈕在 HTTP 請求里增加一個請求參數(shù). 如果某個單選框被選中了, 它的值將為 true, 但如果該單選框未被選中, 在請求中就不會增加一個請求參數(shù). checkbox 標簽解決了這個局限性, 它采取的辦法是為單選框元素創(chuàng)建一個配對的不可見字段*checkbox 標簽checkbox 標簽有一個 fieldValue 屬性,

28、該屬性指定的值將在用戶提交表單時作為被選中的單選框的實際值發(fā)送到服務器. 如果沒有使用 fieldValue 屬性, 單選框的值將為 true 或 false.checkboxlist 標簽checkboxlist 標簽將呈現(xiàn)一組多選框.checkbox 標簽被映射到一個字符串數(shù)組或是一個基本類型的數(shù)組. 若它提供的多選框一個也沒有被選中, 相應的屬性將被賦值為一個空數(shù)組而不是空值.北京傳智播客教育 checkboxlist 標簽如果集合為list生成如下html代碼:Java.NetRoRPHP如果集合為MAP生成如下html代碼:瑜珈用品戶外用品球類自行車北京傳智播客教育 checkboxlist 標簽如果集合里存放的是javabean % Person person1 = new Person(1,第一個); Person person2 = new Person(2,第二個); List list = new ArrayList(); list.add(person1); list.add(person2); request.setAttribute(persons,list);

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論