Struts2中的OGNL详解.docx
- 文档编号:4336257
- 上传时间:2022-11-29
- 格式:DOCX
- 页数:18
- 大小:23.87KB
Struts2中的OGNL详解.docx
《Struts2中的OGNL详解.docx》由会员分享,可在线阅读,更多相关《Struts2中的OGNL详解.docx(18页珍藏版)》请在冰豆网上搜索。
Struts2中的OGNL详解
Struts2中的OGNL详解
首先了解下OGNL的概念:
OGNL是Object-GraphNavigationLanguage的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整个对象的结构图,实现对象属性类型的转换等功能。
此外,还得先需弄懂OGNL的一些知识:
1.OGNL表达式的计算是围绕OGNL上下文进行的。
OGNL上下文实际上就是一个Map对象,由ognl.OgnlContext类表示。
它里面可以存放很多个JavaBean对象。
它有一个上下文根对象。
上下文中的根对象可以直接使用名来访问或直接使用它的属性名访问它的属性值。
否则要加前缀“#key”。
2.Struts2的标签库都是使用OGNL表达式来访问ActionContext中的对象数据的。
如:
propertyvalue="xxx"/>。 3.Struts2将ActionContext设置为OGNL上下文,并将值栈作为OGNL的根对象放置到ActionContext中。 4.值栈(ValueStack): 可以在值栈中放入、删除、查询对象。 访问值栈中的对象不用“#”。 Struts2总是把当前Action实例放置在栈顶。 所以在OGNL中引用Action中的属性也可以省略“#”。 5.调用ActionContext的put(key,value)放入的数据,需要使用#访问。 OGNL中重要的3个符号: #、%、$: #、%和$符号在OGNL表达式中经常出现,而这三种符号也是开发者不容易掌握和理解的部分,需要时间的积累才渐渐弄清楚…… 1.#符号 #符号的用途一般有三种。 — 访问非根对象属性,例如#session.msg表达式,由于Struts2中值栈被视为根对象,所以访问其他非根对象时,需要加#前缀。 实际上,#相当于ActionContext.getContext();#session.msg表达式相当于ActionContext.getContext().getSession().getAttribute("msg") 。 — 用于过滤和投影(projecting)集合,如persons.{? #this.age>25},persons.{? #this.name=='pla1'}.{age}[0]。 — 用来构造Map,例如示例中的#{'foo1': 'bar1', 'foo2': 'bar2'}。 2.%符号 %符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值,这个类似js中的eval,很暴力。 3.$符号 $符号主要有两个方面的用途。 — 在国际化资源文件中,引用OGNL表达式,例如国际化资源文件中的代码: reg.agerange=国际化资源信息: 年龄必须在${min}同${max}之间。 — 在Struts2框架的配置文件中引用OGNL表达式,例如: 1. 2. 3. 4. 10 5. 100 6. 数字必须为${min}为${max}之间! 7. 8. 9. 下面通过代码对OGNL有更深的了解: action类OgnlAction.java: 1.package com.tjcyjd.test.action; 2. 3.import java.util.Date; 4.import java.util.LinkedList; 5.import java.util.List; 6. 7.import javax.servlet.http.HttpServletRequest; 8. 9.import org.apache.struts2.ServletActionContext; 10.import org.apache.struts2.convention.annotation.Action; 11.import org.apache.struts2.convention.annotation.Namespace; 12.import org.apache.struts2.convention.annotation.ParentPackage; 13.import org.apache.struts2.convention.annotation.Result; 14.import org.apache.struts2.convention.annotation.Results; 15.import org.springframework.stereotype.Controller; 16. 17.import com.opensymphony.xwork2.ActionContext; 18.import com.opensymphony.xwork2.ActionSupport; 19. 20.@Controller 21.@Namespace("/test") 22.@ParentPackage("struts-default") 23.@Results( { @Result(name = "success", location = "/other_test/showognl.jsp"), 24. @Result(name = "fail", location = "/bbs/admin_login.jsp"), 25. @Result(name = "input", location = "/bbs/admin_login.jsp") }) 26.public class OgnlAction extends ActionSupport { 27. private static final long serialVersionUID = -1494290883433357310L; 28. private List 29. 30. @Action("ognlTest") 31. public String ognlTest() throws Exception { 32. // 获得ActionContext实例,以便访问Servlet API 33. ActionContext ctx = ActionContext.getContext(); 34. // 存入application 35. ctx.getApplication().put("msg", "application信息"); 36. // 保存session 37. ctx.getSession().put("msg", "seesion信息"); 38. // 保存request信息 39. HttpServletRequest request = ServletActionContext.getRequest(); 40. request.setAttribute("msg", "request信息"); 41. // 为persons赋值 42. persons = new LinkedList 43. Person person1 = new Person(); 44. person1.setName("pla1"); 45. person1.setAge(26); 46. person1.setBirthday(new Date()); 47. persons.add(person1); 48. 49. Person person2 = new Person(); 50. person2.setName("pla2"); 51. person2.setAge(36); 52. person2.setBirthday(new Date()); 53. persons.add(person2); 54. 55. Person person3 = new Person(); 56. person3.setName("pla3"); 57. person3.setAge(16); 58. person3.setBirthday(new Date()); 59. persons.add(person3); 60. 61. return SUCCESS; 62. 63. } 64. 65. public List 66. return persons; 67. } 68. 69. public void setPersons(List 70. this.persons = persons; 71. } 72.} jsp页面showognl.jsp: 1.<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %> 2. 3.<%@ taglib prefix="s" uri="/struts-tags" %> 4. DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http: //www.w3.org/TR/ xhtml1/DTD/xhtml1-transitional.dtd"> 5. 6. //www.w3.org/1999/xhtml"> 7. 8.
9.
10.
11.
12.
13.
14.
15.
16.
访问OGNL上下文和Action上下文
17.
18.
-使用OGNL访问属性值-->
19.
20.
parameters:
property value="#parameters.msg" />
21.
22.
request.msg:
property value="#request.msg" />
23.
24.
session.msg:
property value="#session.msg" />
25.
26.
application.msg:
property value="#application.msg" />
27.
28.
attr.msg:
property value="#attr.msg" />
29.
30.
31.
32.
用于过滤和投影(projecting)集合
33.
34.
年龄大于20
35.
36.
property value="name" /> - 年龄:
property value="age" />
37.
38.
-判断年龄-->
39.
40. iterator value="persons.{? #this.age>20}"> 41. 42.
43.
44.
iterator>
45.
46.
47.
48.
姓名为pla1的年龄:
property value="persons.{? #this.name=='pla1'}.{age}[0]"/>
49.
50.
51.
52.
构造Map
53.
54. set name="foobar" value="#{'foo1': 'bar1', 'foo2': 'bar2'}" /> 55. 56. The value of key "foo1" is property value="#foobar['foo1']" /> 57. 58.
59.
60.
%符号的用法
61.
62. set name="foobar" value="#{'foo1': 'bar1', 'foo2': 'bar2'}" /> 63. 64. The value of key "foo1" is property value="#foobar['foo1']" /> 65. 66. 不使用%: url value="#foobar['foo1']" /> 67. 68. 使用%: url value="%{#foobar['foo1']}" /> 69. 70.
71. <%
72. request.setAttribute("req", "request scope");
73. request.getSession().setAttribute("sess", "session scope");
74. request.getSession().getServletContext().setAttribute("app",
75. "aplication scope");
76. %>
77. 1.通过ognl表达式获取 属性范围中的值
78.
79. property value="#request.req" /> 80. 81. property value="#session.sess" /> 82. 83. property value="#application.app" /> 84. 85. 86. 87. 2.通过 #fafafa;">ognl表达式创建list 集合 ,并且遍历出集合中的值 88. 89. set name="list" value="{'eeeee','ddddd','ccccc','bbbbb','aaaaa'}"> set> 90. iterator value="#list" var="o"> 91. -- ${o } 92. property /> 93. 94. iterator> 95. 96. 97. 98. 3.通过ognl表达式创建Map 集合 ,并且遍历出集合中的值 99. 100. set name="map" 101. value="#{'1': 'eeeee','2': 'ddddd','3': 'ccccc','4': 'bbbbb','5': 'aaaaa'}"> set> 102. iterator value="#map" var="o"> 103. -- ${o.key }->${o.value } 104. -- property value="#o.key"/>-> property value="#o.value"/> 105. property value="key" />-> property value="value" /> 106. 107. iterator> 108. 109. 110. 4.通过ognl表达式 进行逻辑判断 111. 112. if test="'aa' in {'aaa','bbb'}"> 113. aa 在 集合{'aaa','bbb'}中; 114. if> 115. else> 116. aa 不在 集合{'aaa','bbb'}中; 117. else> 118. 119. if test="#request.req not in #list"> 120. 不 在 集合list中; 121. if> 122. else> 123. 在 集合list中; 124. else> 125. 126. 127. 128. 5.通过ognl表达式 的投影功能进行数据筛选 129. 130. set name="list1" value="{1,2,3,4,5}"> set> 131. iterator value="#list1.{? #this>2}" var="o"> 132. -- #list.{? #this>2}: 在list1集合迭代的时候,从中筛选出当前迭代对象>2的集合进行显示 --> 133. ${o } 134. iterator> 135. 136. 137. 6.通过ognl表达式 访问某个类的静态方法和值 138. 139. property value="@java.lang.Math@floor(32.56)" /> 140. 141. property value="@com.rao.struts2.action.OGNL1Action@aa" /> 142. 143. 144. 145. 7.ognl表达式 迭代标签 详细 146. 147. set name="list2" 148. value="{'aa','bb','cc','dd','ee','ff','gg','hh','ii','jj'}"> set> 149. 150. 151. 如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。 copyright@ 2008-2022 冰点文档网站版权所有 经营许可证编号:鄂ICP备2022015515号-1
-->
-->
-->
索引