Python 查询网站开发,东莞网站开发推荐,公司产品展示网站源码,免费做网站手机软件OGNL(Object-Graph Navigation Language)的概念#xff1a; OGNL是Object-Graph Navigation Language的缩写#xff0c;全称为对象图导航语言#xff0c;是一种功能强大的表达式语言#xff0c;它通过简单一致的语法#xff0c;可以任意存取对象的属性或者调用对象的方法 OGNL是Object-Graph Navigation Language的缩写全称为对象图导航语言是一种功能强大的表达式语言它通过简单一致的语法可以任意存取对象的属性或者调用对象的方法能够遍历整个对象的结构图实现对象属性类型的转换等功能。 1.OGNL表达式的计算是围绕OGNL上下文进行的。 OGNL上下文实际上就是一个Map对象由ognl.OgnlContext类表示。它里面可以存放很多个JavaBean对象。它有一个上下文根对象。 上下文中的根对象可以直接使用名来访问或直接使用它的属性名访问它的属性值。否则要加前缀“#key”。 2.Struts2的标签库都是使用OGNL表达式来访问ActionContext中的对象数据的。 如s:propertyvaluexxx/。 3.Struts2将ActionContext设置为OGNL上下文并将值栈作为OGNL的根对象放置到ActionContext中。 4.值栈(ValueStack) 可以在值栈中放入、删除、查询对象。访问值栈中的对象不用“#”。 Struts2总是把当前Action实例放置在栈顶。所以在OGNL中引用Action中的属性也可以省略“#”。 5.调用ActionContext的put(key,value)放入的数据需要使用#访问。 OGNL中重要的3个符号#、%、$: #、%和$符号在OGNL表达式中经常出现而这三种符号也是开发者不容易掌握和理解的部分需要时间的积累才渐渐弄清楚…… 1#符号 #符号的用途一般有三种。 —访问非根对象属性例如#session.msg表达式由于Struts 2中值栈被视为根对象所以访问其他非根对象时需要加#前缀。实际上#相当于ActionContext. getContext()#session.msg表达式相当 于ActionContext.getContext().getSession(). getAttribute(msg) 。 —用于过滤和投影projecting集合如persons.{?#this.age25}persons.{?#this.namepla1}.{age}[0]。 —用来构造Map例如示例中的#{foo1:bar1, foo2:bar2}。 2%符号 %符号的用途是在标志的属性为字符串类型时计算OGNL表达式的值这个类似js中的eval很暴力。 3$符号 $符号主要有两个方面的用途。 —在国际化资源文件中引用OGNL表达式例如国际化资源文件中的代码reg.agerange国际化资源信息年龄必须在${min}同${max}之间。 —在Struts 2框架的配置文件中引用OGNL表达式例如 1 validators
2 field nameintb
3 field-validator typeint
4 param namemin10/param
5 param namemax100/param
6 messageBAction-test校验数字必须为${min}为${max}之间/message
7 /field-validator
8 /field
9 /validators 深入理解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 ListPerson persons;
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 LinkedListPerson();
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 ListPerson getPersons() {
66 return persons;
67 }
68
69 public void setPersons(ListPerson persons) {
70 this.persons persons;
71 }
72 } jsp页面showognl.jsp 1 % page languagejava contentTypetext/html; charsetutf-8 pageEncodingutf-8 % 2 3 % taglib prefixs 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 html xmlnshttp://www.w3.org/1999/xhtml 7 8 head 9 10 titleStruts2 OGNL 演示/title 11 12 /head 13 14 body 15 16 h3访问OGNL上下文和Action上下文/h3 17 18 !-使用OGNL访问属性值-- 19 20 pparameters: s:property value#parameters.msg //p 21 22 prequest.msg: s:property value#request.msg //p 23 24 psession.msg: s:property value#session.msg //p 25 26 papplication.msg: s:property value#application.msg //p 27 28 pattr.msg: s:property value#attr.msg //p 29 30 hr / 31 32 h3用于过滤和投影(projecting)集合/h3 33 34 p年龄大于20/p 35 36 ul 37 38 !-判断年龄-- 39 40 s:iterator valuepersons.{?#this.age20} 41 42 lis:property valuename / - 年龄s:property valueage //li 43 44 /s:iterator 45 46 /ul 47 48 p姓名为pla1的年龄: s:property valuepersons.{?#this.namepla1}.{age}[0]//p 49 50 hr / 51 52 h3构造Map/h3 53 54 s:set namefoobar value#{foo1:bar1, foo2:bar2} / 55 56 pThe value of key foo1 is s:property value#foobar[foo1] //p 57 58 hr / 59 60 h4%符号的用法/h4 61 62 s:set namefoobar value#{foo1:bar1, foo2:bar2} / 63 64 pThe value of key foo1 is s:property value#foobar[foo1] //p 65 66 p不使用s:url value#foobar[foo1] //p 67 68 p使用s:url value%{#foobar[foo1]} //p 69 70 hr / 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 br 79 s:property value#request.req / 80 br / 81 s:property value#session.sess / 82 br / 83 s:property value#application.app / 84 br / 85 hr 86 87 2.通过span stylebackground-color: #fafafa;ognl表达式创建list 集合 并且遍历出集合中的值 88 br 89 s:set namelist value{eeeee,ddddd,ccccc,bbbbb,aaaaa}/s:set 90 s:iterator value#list varo 91 !-- ${o }br/ -- 92 s:property / 93 br / 94 /s:iterator 95 br / 96 hr 97 98 3.通过ognl表达式创建Map 集合 并且遍历出集合中的值 99 br
100 s:set namemap
101 value#{1:eeeee,2:ddddd,3:ccccc,4:bbbbb,5:aaaaa}/s:set
102 s:iterator value#map varo
103 !-- ${o.key }-${o.value }br/ --
104 !-- s:property value#o.key/-s:property value#o.value/br/ --
105 s:property valuekey /-s:property valuevalue /
106 br /
107 /s:iterator
108 br /
109 hr
110 4.通过ognl表达式 进行逻辑判断
111 br
112 s:if testaa in {aaa,bbb}
113 aa 在 集合{aaa,bbb}中
114 /s:if
115 s:else
116 aa 不在 集合{aaa,bbb}中
117 /s:else
118 br /
119 s:if test#request.req not in #list
120 不 在 集合list中
121 /s:if
122 s:else
123 在 集合list中
124 /s:else
125 br /
126 hr
127
128 5.通过ognl表达式 的投影功能进行数据筛选
129 br
130 s:set namelist1 value{1,2,3,4,5}/s:set
131 s:iterator value#list1.{?#this2} varo
132 !-- #list.{?#this2}在list1集合迭代的时候从中筛选出当前迭代对象2的集合进行显示 --
133 ${o }br /
134 /s:iterator
135 br /
136 hr
137 6.通过ognl表达式 访问某个类的静态方法和值
138 br
139 s:property valuejava.lang.Mathfloor(32.56) /
140
141 s:property valuecom.rao.struts2.action.OGNL1Actionaa /
142 br /
143 br /
144 hr
145 7.ognl表达式 迭代标签 详细
146 br
147 s:set namelist2
148 value{aa,bb,cc,dd,ee,ff,gg,hh,ii,jj}/s:set
149 table border1
150 tr
151 td索引 /td
152 td值/td
153 td奇/td
154 td 偶/td
155 td首/td
156 td 尾/td
157 td当前迭代数量/td
158 /tr
159 s:iterator value#list2 varo statuss
160 tr bgcolors:if test#s.evenpink/s:if
161 td
162 s:property value#s.getIndex() /
163 /td
164 td
165 s:property /
166 /td
167 td
168 s:if test#s.oddY/s:if
169 s:elseN/s:else
170 /td
171 td
172 s:if test#s.evenY/s:if
173 s:elseN/s:else
174 /td
175 td
176 s:if test#s.firstY/s:if
177 s:elseN/s:else
178 /td
179 td
180 s:if test#s.isLast()Y/s:if
181 s:elseN/s:else
182 /td
183 td
184 s:property value#s.getCount()/
185 /td
186 /tr
187 /s:iterator
188 /table
189 br
190 hr
191
192
193 8.ognl表达式: if/else if/else 详细br
194 % request.setAttribute(aa,0); %
195 s:if test#request.aa0 #request.aa4
196 在0-4之间
197 /s:if
198 s:elseif test#request.aa4 #request.aa8
199 在4-8之间
200 /s:elseif
201 s:else
202 大于8
203 /s:else
204 br
205 hr
206 9.ognl表达式: url 详细br
207 % request.setAttribute(aa,sss); %
208 s:url actiontestAction namespace/aa/bb
209 s:param nameaa value#request.aa/s:param
210 s:param nameid100/s:param
211 /s:url
212 br/
213 s:set namemyurl valuehttp://www.baidu.com/s:set
214 value以字符处理 s:url value#myurl/s:urlbr
215 value明确指定以ognl表达式处理: s:url value%{#myurl}/s:url
216 br
217 hr
218 10.ognl表达式: checkboxlist 详细br
219 1 .list 生成~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~br
220 name:checkboxlist的名字br
221 list:checkboxlist要显示的列表br
222 value:checkboxlist默认被选中的选项,checkedcheckedbr
223 s:checkboxlist namecheckbox1 list{上网,看书,爬山,游泳,唱歌} value{上网,看书} /s:checkboxlist
224 br
225 以上生成代码br
226 xmp
227 input typecheckbox namecheckbox1 value上网 idcheckbox1-1 checkedchecked/
228 label forcheckbox1-1 classcheckboxLabel上网/label
229 input typecheckbox namecheckbox1 value看书 idcheckbox1-2 checkedchecked/
230 label forcheckbox1-2 classcheckboxLabel看书/label
231 input typecheckbox namecheckbox1 value爬山 idcheckbox1-3/
232 label forcheckbox1-3 classcheckboxLabel爬山/label
233 input typecheckbox namecheckbox1 value游泳 idcheckbox1-4/
234 label forcheckbox1-4 classcheckboxLabel游泳/label
235 input typecheckbox namecheckbox1 value唱歌 idcheckbox1-5/
236 label forcheckbox1-5 classcheckboxLabel唱歌/label
237 /xmp
238 2 .Map 生成~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~br
239 name:checkboxlist的名字br
240 list:checkboxlist要显示的列表br
241 listKey:checkbox 的value的值br
242 listValue:checkbox 的lablel(显示的值)br
243 value:checkboxlist默认被选中的选项,checkedcheckedbr
244 s:checkboxlist namecheckbox2 list#{1:上网,2:看书,3:爬山,4:游泳,5:唱歌} listKeykey listValuevalue value{1,2,5} /s:checkboxlist
245 br
246 以上生成代码br
247 xmp
248 input typecheckbox namecheckbox2 value1 idcheckbox2-1 checkedchecked/
249 label forcheckbox2-1 classcheckboxLabel上网/label
250 input typecheckbox namecheckbox2 value2 idcheckbox2-2 checkedchecked/
251 label forcheckbox2-2 classcheckboxLabel看书/label
252 input typecheckbox namecheckbox2 value3 idcheckbox2-3/
253 label forcheckbox2-3 classcheckboxLabel爬山/label
254 input typecheckbox namecheckbox2 value4 idcheckbox2-4/
255 label forcheckbox2-4 classcheckboxLabel游泳/label
256 input typecheckbox namecheckbox2 value5 idcheckbox2-5 checkedchecked/
257 label forcheckbox2-5 classcheckboxLabel唱歌/label
258 /xmp
259 hr
260 /body
261 /html ONGL总结 访问属性 名字属性获取:s:property valueuser.username/br 地址属性获取:s:property valueuser.address.addr/br 访问方法 调用值栈中对象的普通方法s:property valueuser.get()/br 访问静态属性和方法 调用Action中的静态方法s:property valuestruts.action.LoginActionget()/ 调用JDK中的类的静态方法s:property valueJava.lang.Mathfloor(44.56)/br 调用JDK中的类的静态方法(同上)s:property valuefloor(44.56)/br 调用JDK中的类的静态方法s:property valuejava.util.CalendargetInstance()/br 调用普通类中的静态属性s:property valuestruts.vo.AddressTIPS/br 访问构造方法 调用普通类的构造方法:s:property valuenew struts.vo.Student(李晓红 , 美女 , 3 , 25).username/ 1.5. 访问数组 获取List:s:property valuetestList/br 获取List中的某一个元素(可以使用类似于数组中的下标获取List中的内容): s:property valuetestList[0]/br 获取Set:s:property valuetestSet/br 获取Set中的某一个元素(Set由于没有顺序所以不能使用下标获取数据): s:property valuetestSet[0]/br × 获取Map:s:property valuetestMap/br 获取Map中所有的键:s:property valuetestMap.keys/br 获取Map中所有的值:s:property valuetestMap.values/br 获取Map中的某一个元素(可以使用类似于数组中的下标获取List中的内容): s:property valuetestMap[m1]/br 获取List的大小:s:property valuetestSet.size/br 访问集合 – 投影、选择(? ^ $) 利用选择获取List中成绩及格的对象:s:property valuestus.{?#this.grade60}/br 利用选择获取List中成绩及格的对象的username: s:property valuestus.{?#this.grade60}.{username}/br 利用选择获取List中成绩及格的第一个对象的username: s:property valuestus.{?#this.grade60}.{username}[0]/br 利用选择获取List中成绩及格的第一个对象的username: s:property valuestus.{^#this.grade60}.{username}/br 利用选择获取List中成绩及格的最后一个对象的username: s:property valuestus.{$#this.grade60}.{username}/br 利用选择获取List中成绩及格的第一个对象然后求大小: s:property valuestus.{^#this.grade600}.{username}.size/br 集合的伪属性 OGNL能够引用集合的一些特殊的属性,这些属性并不是JavaBeans模式,例如size(),length()等等. 当表达式引用这些属性时,OGNL会调用相应的方法,这就是伪属性. 集合 伪属性 Collection(inherited by Map, List Set) size ,isEmpty List iterator Map keys , values Set iterator Iterator next , hasNext Enumeration next , hasNext , nextElement , hasMoreElements Lambda :[…] 格式:[…] 使用Lambda表达式计算阶乘: s:property value#f :[#this1?1:#this*#f(#this-1)] , #f(4)/br OGNL中#的使用 #可以取出堆栈上下文中的存放的对象. 名称 作用 例子 parameters 包含当前HTTP请求参数的Map #parameters.id[0]作用相当于 request.getParameter(id) request 包含当前HttpServletRequest的属性attribute)的Map #request.userName相当于 request.getAttribute(userName) session 包含当前HttpSession的属性attribute的Map #session.userName相当于 session.getAttribute(userName) application 包含当前应用的ServletContext的属性attribute的Map #application.userName相当于 application.getAttribute(userName) attr 用于按request session application顺序访问其属性attribute