商城网站开发需求分析,wordpress 变更中文,wordpress支持react,江苏网站建设费用2019独角兽企业重金招聘Python工程师标准 首先了解下OGNL的概念#xff1a; OGNL是Object-Graph Navigation Language的缩写#xff0c;全称为对象图导航语言#xff0c;是一种功能强大的表达式语言#xff0c;它通过简单一致的语法#xff0c;可以任意存取… 2019独角兽企业重金招聘Python工程师标准 首先了解下OGNL的概念 OGNL是Object-Graph Navigation Language的缩写全称为对象图导航语言是一种功能强大的表达式语言它通过简单一致的语法可以任意存取对象的属性或者调用对象的方法能够遍历整个对象的结构图实现对象属性类型的转换等功能。 此外还得先需弄懂OGNL的一些知识 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表达式例如 validators field nameintb field-validator typeint param namemin10/param param namemax100/param messageBAction-test校验数字必须为${min}为${max}之间/message /field-validator /field /validators 下面通过代码对OGNL有更深的了解 action类OgnlAction.java package com.tjcyjd.test.action; import java.util.Date; import java.util.LinkedList; import java.util.List; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Namespace; import org.apache.struts2.convention.annotation.ParentPackage; import org.apache.struts2.convention.annotation.Result; import org.apache.struts2.convention.annotation.Results; import org.springframework.stereotype.Controller; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; Controller Namespace (/test) ParentPackage(struts-default) Results ( { Result (name success, location /other_test/showognl.jsp), Result(name fail, location /bbs/admin_login.jsp), Result(name input, location /bbs/admin_login.jsp) }) public class OgnlAction extends ActionSupport { private static final long serialVersionUID -1494290883433357310L; private ListPerson persons; Action(ognlTest) public String ognlTest() throws Exception { // 获得ActionContext实例以便访问Servlet API ActionContext ctx ActionContext.getContext(); // 存入application ctx.getApplication().put(msg, application信息); // 保存session ctx.getSession().put(msg, seesion信息); // 保存request信息 HttpServletRequest request ServletActionContext.getRequest(); request.setAttribute(msg, request信息); // 为persons赋值 persons new LinkedListPerson(); Person person1 new Person(); person1.setName(pla1); person1.setAge(26); person1.setBirthday(new Date()); persons.add(person1); Person person2 new Person(); person2.setName(pla2); person2.setAge(36); person2.setBirthday(new Date()); persons.add(person2); Person person3 new Person(); person3.setName(pla3); person3.setAge(16); person3.setBirthday(new Date()); persons.add(person3); return SUCCESS; } public ListPerson getPersons() { return persons; } public void setPersons(ListPerson persons) { this.persons persons; } } jsp页面showognl.jsp % page languagejava contentTypetext/html; charsetutf-8 pageEncodingutf-8 % % taglib prefixs uri/struts-tags % !DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN http://www.w3.org/TR/ xhtml1/DTD/xhtml1-transitional.dtd html xmlnshttp://www.w3.org/1999/xhtml head titleStruts2 OGNL 演示/title /head body h3访问OGNL上下文和Action上下文/h3 !-使用OGNL访问属性值-- pparameters: s:property value#parameters.msg //p prequest.msg: s:property value#request.msg //p psession.msg: s:property value#session.msg //p papplication.msg: s:property value#application.msg //p pattr.msg: s:property value#attr.msg //p hr / h3用于过滤和投影(projecting)集合/h3 p年龄大于20/p ul !-判断年龄-- s:iterator valuepersons.{?#this.age20} lis:property valuename / - 年龄s:property valueage //li /s:iterator /ul p姓名为pla1的年龄: s:property valuepersons.{?#this.namepla1}.{age}[0]//p hr / h3构造Map/h3 s:set namefoobar value#{foo1:bar1, foo2:bar2} / pThe value of key foo1 is s:property value#foobar[foo1] //p hr / h4%符号的用法/h4 s:set namefoobar value#{foo1:bar1, foo2:bar2} / pThe value of key foo1 is s:property value#foobar[foo1] //p p不使用s:url value#foobar[foo1] //p p使用s:url value%{#foobar[foo1]} //p hr / % request.setAttribute(req, request scope); request.getSession().setAttribute(sess, session scope); request.getSession().getServletContext().setAttribute(app, aplication scope); % 1.通过ognl表达式获取 属性范围中的值 br s:property value#request.req / br / s:property value#session.sess / br / s:property value#application.app / br / hr 2.通过span stylebackground-color: #fafafa;ognl表达式创建list 集合 并且遍历出集合中的值 br s:set namelist value{eeeee,ddddd,ccccc,bbbbb,aaaaa}/s:set s:iterator value#list varo !-- ${o }br/ -- s:property / br / /s:iterator br / hr 3.通过ognl表达式创建Map 集合 并且遍历出集合中的值 br s:set namemap value#{1:eeeee,2:ddddd,3:ccccc,4:bbbbb,5:aaaaa}/s:set s:iterator value#map varo !-- ${o.key }-${o.value }br/ -- !-- s:property value#o.key/-s:property value#o.value/br/ -- s:property valuekey /-s:property valuevalue / br / /s:iterator br / hr 4.通过ognl表达式 进行逻辑判断 br s:if testaa in {aaa,bbb} aa 在 集合{aaa,bbb}中 /s:if s:else aa 不在 集合{aaa,bbb}中 /s:else br / s:if test#request.req not in #list 不 在 集合list中 /s:if s:else 在 集合list中 /s:else br / hr 5.通过ognl表达式 的投影功能进行数据筛选 br s:set namelist1 value{1,2,3,4,5}/s:set s:iterator value#list1.{?#this2} varo !-- #list.{?#this2}在list1集合迭代的时候从中筛选出当前迭代对象2的集合进行显示 -- ${o }br / /s:iterator br / hr 6.通过ognl表达式 访问某个类的静态方法和值 br s:property valuejava.lang.Mathfloor(32.56) / s:property valuecom.rao.struts2.action.OGNL1Actionaa / br / br / hr 7.ognl表达式 迭代标签 详细 br s:set namelist2 value{aa,bb,cc,dd,ee,ff,gg,hh,ii,jj}/s:set table border1 tr td索引 /td td值/td td奇/td td 偶/td td首/td td 尾/td td当前迭代数量/td /tr s:iterator value#list2 varo statuss tr bgcolors:if test#s.evenpink/s:if td s:property value#s.getIndex() / /td td s:property / /td td s:if test#s.oddY/s:if s:elseN/s:else /td td s:if test#s.evenY/s:if s:elseN/s:else /td td s:if test#s.firstY/s:if s:elseN/s:else /td td s:if test#s.isLast()Y/s:if s:elseN/s:else /td td s:property value#s.getCount()/ /td /tr /s:iterator /table br hr 8.ognl表达式: if/else if/else 详细br % request.setAttribute(aa,0); % s:if test#request.aa0 #request.aa4 在0-4之间 /s:if s:elseif test#request.aa4 #request.aa8 在4-8之间 /s:elseif s:else 大于8 /s:else br hr 9.ognl表达式: url 详细br % request.setAttribute(aa,sss); % s:url actiontestAction namespace/aa/bb s:param nameaa value#request.aa/s:param s:param nameid100/s:param /s:url br/ s:set namemyurl valuehttp://www.baidu.com/s:set value以字符处理 s:url value#myurl/s:urlbr value明确指定以ognl表达式处理: s:url value%{#myurl}/s:url br hr 10.ognl表达式: checkboxlist 详细br 1 .list 生成~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~br name:checkboxlist的名字br list:checkboxlist要显示的列表br value:checkboxlist默认被选中的选项,checkedcheckedcheckedbr s:checkboxlist namecheckbox1 list{上网,看书,爬山,游泳,唱歌} value{上网,看书} /s:checkboxlist br 以上生成代码br xmp input typecheckbox namecheckbox1 value上网 idcheckbox1-1 checkedchecked/ label forcheckbox1-1 classcheckboxLabel上网/label input typecheckbox namecheckbox1 value看书 idcheckbox1-2 checkedchecked/ label forcheckbox1-2 classcheckboxLabel看书/label input typecheckbox namecheckbox1 value爬山 idcheckbox1-3/ label forcheckbox1-3 classcheckboxLabel爬山/label input typecheckbox namecheckbox1 value游泳 idcheckbox1-4/ label forcheckbox1-4 classcheckboxLabel游泳/label input typecheckbox namecheckbox1 value唱歌 idcheckbox1-5/ label forcheckbox1-5 classcheckboxLabel唱歌/label /xmp 2 .Map 生成~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~br name:checkboxlist的名字br list:checkboxlist要显示的列表br listKey:checkbox 的value的值br listValue:checkbox 的lablel(显示的值)br value:checkboxlist默认被选中的选项,checkedcheckedcheckedbr s:checkboxlist namecheckbox2 list#{1:上网,2:看书,3:爬山,4:游泳,5:唱歌} listKeykey listValuevalue value{1,2,5} /s:checkboxlist br 以上生成代码br xmp input typecheckbox namecheckbox2 value1 idcheckbox2-1 checkedchecked/ label forcheckbox2-1 classcheckboxLabel上网/label input typecheckbox namecheckbox2 value2 idcheckbox2-2 checkedchecked/ label forcheckbox2-2 classcheckboxLabel看书/label input typecheckbox namecheckbox2 value3 idcheckbox2-3/ label forcheckbox2-3 classcheckboxLabel爬山/label input typecheckbox namecheckbox2 value4 idcheckbox2-4/ label forcheckbox2-4 classcheckboxLabel游泳/label input typecheckbox namecheckbox2 value5 idcheckbox2-5 checkedchecked/ label forcheckbox2-5 classcheckboxLabel唱歌/label /xmp hr /body /html 总结OGNL的使用方法 访问属性 名字属性获取: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 ,isEmptyListiteratorMapkeys , valuesSetiteratorIteratornext , hasNextEnumerationnext , 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 获取Paraments对象的属性s:property value#parameters.username/ OGNL中%的使用 用%{}可以取出存在值堆栈中的Action对象,直接调用它的方法. 例如你的Action如果继承了ActionSupport .那么在页面标签中用%{getText(key)}的方式可以拿出国际化信息. OGNL中$的使用 “$”有两个主要的用途 l 用于在国际化资源文件中引用OGNL表达式 l 在Struts 2配置文件中引用OGNL表达式 值栈 ValueStack对象。这个对象贯穿整个Action的生命周期每个Action类的对象实例会拥有一个ValueStack对象。当 Struts 2接收到一个.action的请求后会先建立Action类的对象实例但并不会调用Action方法而是先将Action类的相应属性放到 ValueStack对象的顶层节点ValueStack对象相当于一个栈。 在Action中获得ValueStack对象ActionContext.getContext().getValueStack() l Top语法 使用Top获取值栈中的第二个对象:s:property value[1].top.对象/ l N语法 使用N获取值栈中的第二个对象:s:property value[1].对象/ l 语法 调用action中的静态方法s:property valuevs1静态方法/ vs值栈 1表示第一个 转载于:https://my.oschina.net/Failure/blog/311466