Struts2中的OGNL表达式.doc_第1页
Struts2中的OGNL表达式.doc_第2页
Struts2中的OGNL表达式.doc_第3页
Struts2中的OGNL表达式.doc_第4页
Struts2中的OGNL表达式.doc_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

浅析值栈ValueStack对象相当于一个栈,它贯穿整个Action的生命周期,每个Action类的对象实例都会拥有一个ValueStack对象当Struts2接收到一个*.action请求后,并不是直接调用Action方法,而是先将Action类的相应属性放到ValueStack对象的顶层节点值栈也位于内存中,它也是和parameters、request、session、application、attr对象放在一起的值栈属于ONGL Context里面的根对象。也就是说它位于整个内存中最最重要的地方,所以叫根对象根对象和另外五个对象是有区别的,根对象可以省写#号,比如值栈的生命周期与request请求相关,每次请求产生一个值栈。默认所有的Action会被自动放到值栈里服务器跳转时共用值栈假设从一个Action11通过服务器跳转到Action22的话,就意味着这两个Action是共享一个值栈的,因为一次请求只使用一个值栈这时内存中情况是这样的:首先接收到Action11请求后,会产生一个值栈,在栈顶存放Action11对象以及它所有的属性然后经过服务器跳转到Action22,这时就会把Action22对象压入值栈的栈顶位置,此时Action11对象以及它的所有属性就位于栈底了取值过程栈的特征是后进先出。于是首先到栈顶的对象里查找是否存在这个属性,如果栈顶的Action22对象中不存在这个属性的话它就会继续向下寻找直至栈底对象,一直查找是否存在这个属性如果最后找到该属性的话,那么就会在JSP页面中通过输出属性值如果在Action22和Action11都有一个同名的同类型的username属性的话,那么将输出Action22中的属性值因为它是先从栈顶开始寻找属性的,值栈的特征就是后进先出,但有个前提:请求过程是通过服务器跳转的三个语法假设此时想要获取Action11中的username属性的话,就可以使用值栈的Top语法或者N语法使用Top语法获取值栈中的第二个对象的属性:使用 N 语法获取值栈中的第二个对象的属性:另外值栈还有一个语法,例如使用语法调用Action中的静态方法:vsget()等价于vs1getVOMethod(),指的是栈顶对象的静态getVOMethod()方法同理vs2getVOMethod()就是取值栈中第二个对象的静态getVOMethod()方法客户端跳转时使用各自的值栈假如中间某一个步骤中出现了客户端跳转的话,那么两个Action所使用的就是两个不同的值栈了所以在Action22中就不能再使用Action11中的属性了,在最后跳转到的JSP页面中也就无法获取Action11的属性了也即从Action22跳转到JSP页面时使用的是redirect的话,那么最后值栈中是没有任何的Action对象的这个时候我们可以通过链接传参,比如test.jsp?netname=$username意思就是取出Action22中的username属性作为参数,通过浏览器地址栏传递到JSP页面中然后使用OGNL中的#号获取Paraments对象的属性,即就可以取到值了手工向值栈中压入对象正常情况下值栈保存的是Action对象,而我们也可以直接往值栈中添加其它对象,这时可以在Action中添加如下代码向值栈中添加对象:ActionContext.getContext.getValueStack().push(new Student(沈浪,22);而且我们手工往值栈中添加的Student对象会位于栈顶。这是因为Struts2会首先初始化Action,然后才能调用它的方法初始化Action的时候,便把Action放到值栈中了,然后在执行它的execute()方法时,就又往值栈中添加了Student对象浅析OGNLOGNL是Object-Graph Navigation Language的缩写,是一种功能强大的表达式语言通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能OGNL用得最多的地方就是和Struts2的标签绑定,也可以在配置文件中通过$使用OGNL表达式OGNL中$号的使用1.在国际化资源文件中,引用OGNL表达式2.在struts.xml文件中,引用OGNL表达式OGNL中%号的使用1.使用%可以取出保存在值堆栈中的Action对象,直接调用它的方法2.如果Action继承了ActionSupport,那么在页面标签中可以使用%getText(key)获取国际化信息OGNL中#号的使用OGNL中的#号可以取出堆栈上下文中存放的对象名称作用例子attr用于按requestsessionapplication顺序访问其属性#attr.userName相当于按顺序从三个范围读取userName属性直到找到为止request包含当前HttpServletRequest的属性的Map#request.userName相当于request.getAttribute(userName)session包含当前HttpSession的属性的Map#session.userName相当于session.getAttribute(userName)application包含当前应用的ServletContext的属性的Map#application.userName相当于application.getAttribute(userName)parameters包含当前HTTP请求参数的Map#parameters.id0相当于request.getParameter(id)获取Action中的属性值或者Action中的对象的某某属性值利用标签可以直接获取Action中的引用类型user里面的username属性同样可以通过user.address.addr获取user中引用类型address中的addr属性的值像这种一层一层往下传递的访问方式,即所谓的导航,也就是一步步的往下调用调用Action的对象里面的普通方法默认的会把Action放到值栈里面,而值栈在访问的时候,并不需要值栈的名字当我们调用的时候它会自动到值栈里面查找Action对象里面有没有user对象,然后它就发现有user然后它就再找user里面有没有getVOMethod()方法,然后它发现有,于是调用getVOMethod()实际上调用User中的getVOMethod()方法的过程与获取表单中的姓名密码的方式都是相同的都是到值栈里面查找,找是否存在user对象,如果存在,接着查找user中是否存在某某属性或方法调用Action中的静态方法同样我们也可以在JSP页面中写一个OGNL表达式调用Action中的静态方法调用Action中的静态方法时,与调用user对象的getVOMethod()方法的过程,是截然不同的此时value的写法是固定的,以开头,后面跟上具体的包名,然后加上静态方法比如另外user对象是LoginAction中的一个属性,这个属性会自动的放到值栈里面而值栈调用的时候,不用加上或者包名等等,所以直接user.getVOMethod()就可以了调用JDK类中的静态方法可以使用输出floor()的执行结果这就意味着如果不在中指定类的话,默认的就表示java.lang.Math类当前大多数情况下,我们都不会省略这个类,都会写全了的,然后在后面加上静态方法集合的伪属性OGNL能够引用集合的一些特殊的属性,这些属性并不是JavaBean模式,例如size()、length()当表达式引用这些属性时,OGNL会调用相应的方法,这就是伪属性比如获取List的大小:List的伪属性:size、isEmpty、iteratorSet的伪属性:size、isEmpty、iteratorMap的伪属性:size、isEmpty、keys、valuesIterator的伪属性:next、hasNextEnumeration伪属性:next、hasNext、nextElement、hasMoreElements获取集合中元素的实质就是调用它的toString()方法它还可以直接获取集合中的元素,事实上是在调用集合的toString()方法所以我们可以根据实际情况通过重写集合的toString()方法来实现个性化输出甚至它还可以像访问数组那样,直接testList2获取集合中的元素但这种方法只适用于List,不适用于Map。因为Map的索引是key,不是数值另外,由于HashSet中的元素是没有顺序的,所以也不能用下标获取单个元素Lambda表达式补充一下:使用Lambda表达式可以在OGNL中书写递归式子,在帮助中对它有很详细的说明打开帮助中的/struts-2.0.14-all/struts-2.0.14/docs/index.html页面在左侧的Documentation下面点击Guides链接,然后在这个页面中点击OGNL最后跳转到/struts-2.0.14-all/struts-2.0.14/docs/docs/ognl.html将这个页面右侧的下拉条拖放到最下面,就会看到它的说明了,它举的例子如下所示Lambda表达式的语法是:.,中括号前面有一个冒号,所有东西都在中括号里面写也就是说我们只要看到一个冒号跟着一个中括号,就表示这里使用的是Lambda表达式#this指的是表达式的参数所以这个例子可以这样理解:先判断这个参数是否等于零,如果等于零,那么它的值最后就是零如果参数不等于零,就再判断它是否等于壹。如果参数等于壹,那么它的值最后就是壹如果参数不等于壹,就继续调用#fib。注意这里已经用中括号将整体的值赋给了fib实际上很少能够用得到Lambda表达式利用投影获取属性利用投影获取List中对象的username属性时,其中表示的是一个集合stus.username就表示将suts中所有的username属性取出组成一个新的列表利用选择获取属性OGNL表达式是很灵活的,可以同时使用选择技术与投影技术获取属性使用选择技术时,#this代表当前元素,问号?是把所有满足条件的元素都取出来上箭头是开始的意思,所以stus.#this.grade=60.username输出的是张三注意,此时输出文本中包含中括号,这表示它是一个列表而stus.?#this.grade=60.username0输出的是张三,是字符串,二者是不同的美元符号$是结束的意思,所以stus.$#this.grade=60.username输出的是王五这三个符合:问号、上箭头、美元符所返回的都是List补充1.当OGNL取不到值的时候,它不会报错,而是什么都不显示2.返回的是ValueStack中从上至下的所有的Object返回的是ValueStack中从上至下的第二个Object3.返回的是成员变量username的值 假设ValueStack中存在两个Action的话,如果第一个Action如果没有username变量 那么它会继续找第二个Action。那么在什么情况下ValueStack中会存在两个Action呢 答案是在struts.xml中配置的是从一个Action通过跳转到另一个Action4. 在Struts2.1.6中必须设置struts.ognl.allowStaticMethodAccess为true之后 才允许使用OGNL访问静态方法。而在Struts2.0.11则无需设置,即可直接访问下面是OGNL测试的工程代码,这是一个Struts2.0.11应用首先是web.xml文件1. 2. 7. 8. struts29. org.apache.struts2.dispatcher.FilterDispatcher10. 11. 12. struts213. /*14. 15. 16. login.jsp17. 18. 1. 2. 7. 8. struts29. org.apache.struts2.dispatcher.FilterDispatcher10. 11. 12. struts213. /*14. 15. 16. login.jsp17. 18. 然后是用于输入用户名和密码等信息的测试页面login.jsp1. 2. 这是测试OGNL使用的登录页面3. 提示:程序设定的用户名和密码各为admin和jadyer4. 注意:用户名和密码不正确时将停留在页面不动5. formaction=/login.actionmethod=POST6. 7. 8. 姓名:9. 密码:10. 地址:11. 12. xhtmlview plaincopyprint?1. 2. 这是测试OGNL使用的登录页面3. 提示:程序设定的用户名和密码各为admin和jadyer4. 注意:用户名和密码不正确时将停留在页面不动5. formaction=/login.actionmethod=POST6. 7. 8. 姓名:9. 密码:10. 地址:11. 12. 然后是用于显示OGNL处理结果的loginSuc.jsp页面1. 2. 3. 这是使用OGNL输出的结果页面4. 5. 6. 获取姓名属性:7. 8. 9. %-%10. %-%11. 12. %-%13. 14. 15. 获取地址属性:16. 17. 18. 19. 调用值栈中的对象的普通方法:20. 21. 22. 23. 调用值栈中Action的普通方法:24. 25. 26. 27. 28. 29. 30. 获取普通类的静态属性:31. 32. 33. 34. 访问普通类的构造方法:35. 36. 37. 38. 调用Action中的静态方法:39. 40. 41. 42. 调用JDK中的类的静态方法:43. 44. 45. 46. 调用JDK中的类的静态方法:47. 48. 49. 50. 调用JDK中的类的静态方法:51. 52. 53. 54. 55. 56. 57. 获取List中的所有元素:58. 59. 60. 61. 获取Set中的所有元素:62. 63. 64. 65. 获取Map中的所有元素:66. 67. 68. 69. 获取Map中的某个元素:70. 71. 72. %-%73. %-%74. 75. 76. 获取Set中的某个元素:77. 78. 79. 80. 81. 获取List中的某个元素:82. 83. 84. 85. 86. 87. 88. 获取List的大小:89. 90. 91. 92. 获取Set的大小:93. 94. 95. 96. 获取Map的大小:97. 98. 99. 100. 获取Map中所有的键:101. 102. 103. 104. 获取Map中所有的值:105. 106. 107. 108. Lambda计算4的阶乘:109. 110. 111. 112. 113. 114. 115. 获取List中的所有对象:116. 117. 118. 119. 利用投影获取List中对象的名字:120. 121. 122. 123. 利用投影获取List中第二个对象的名字:124. %- 使用获取到的值为:李四 -%125. 126. 127. 128. 129. 130. 131. 132. 利用选择获取List中成绩及格的所有对象:133. =60/134. 135. 136. 利用选择获取List中成绩及格的第一个对象:137. =60/138. 139. 140. 利用选择获取List中成绩及格的最后一个对象:141. =60/142. 143. 144. 145. 146. 147. 利用选择获取List中成绩及格的所有对象的名字:148. =60.username/149. 150. 151. 利用选择获取List中成绩及格的第二个对象的名字:152. =60.username1/153. 154. 155. 利用选择获取List中成绩及格的第一个对象的名字:156. =60.username/157. 158. 159. 利用选择获取List中成绩及格的最后一个对象的名字:160. =60.username/161. 162. 163. 利用选择获取List中成绩及格的第一个对象然后求大小:164. =60.username.size/165. 166. 167. 168. 169. 170. 利用OGNL中的#号获取attr中的属性:171. 172. 173. 174. 利用OGNL中的#号获取reque

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论