ZHTML中表达式是从EL修改而来,主要增加了对ZCF中常用的数据对象的支持,用法和EL相似。
1. 表达式的语法结构
${expression}:expression里可以包含常量、变量名和运算符,其中常量主要有null、true、false、数值和字符串,字符串既可以用双引号也可以用单引号。
2. 表达式中的运算符
包括五个算术运算符:+、-、*、/、%;
六个关系运算符:==、!=、<、>、<=、>=;
三个逻辑运算符:&&、||、!;
三个其它运算符:empty、条件运算符a?b:c、以及括号()。
示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | Operators: $< span ></ span >{1+1}=${1+1}< br /> $< span ></ span >{1-1}=${1-1}< br /> $< span ></ span >{3*3}=${3*3}< br /> $< span ></ span >{2/3}=${2/3}< br /> $< span ></ span >{17%5}=${17%5}< br /> < br /> $< span ></ span >{2>1}=${2>1}< br /> $< span ></ span >{2>=1}=${2>=1}< br /> $< span ></ span >{2< 1 }=${2<1}<br/> $< span ></ span >{2<=1}=${2<=1}< br /> $< span ></ span >{2==1}=${2==1}< br /> $< span ></ span >{2!=1}=${2!=1}< br /> < br /> $< span ></ span >{true&&false}=${true&&false}< br /> $< span ></ span >{true||false}=${true||false}< br /> $< span ></ span >{!false}=${!false}< br /> < br /> $< span ></ span >{empty a}=${empty a}< br /> $< span ></ span >{2>1?'2':'1'}=${2>1?'2':'1'}< br /> $< span ></ span >{12-2*3}=${12-2*3}< br /> $< span ></ span >{(12-2)*3}=${(12-2)*3}< br /> |
3. 取变量中的成员数据
表达式中数组可以使用[]来按下标存储,例如${arr[1]};
表达式中的对象和Map可以用点运算符(.)来获取属性和键值,例如${obj.field}、${map.key};
表达式中的对象和Map除了用点运算符来获取外,还可以使用[]来获取,例如${obj['field']}、${map[key]};
特别是当要取的属性和键值含有特殊或者是一个变量时,只有用[],例如${map['a?']}、${obj[fieldName]}。
示例如下:
1 2 3 4 5 6 7 8 | Variables:< br /> < z:set var = "org" json = "{id:'0001',name:'泽元软件',postcode:'100085',children:[]}" /> $< span ></ span >{org}=${org}< br /> $< span ></ span >{org.name}=${org.name}< br /> $< span ></ span >{org['name']}=${org['name']}< br /> < z:set var = "field" value = "id" /> $< span ></ span >{field}=${field}< br /> $< span ></ span >{org[field]}=${org[field]}< br /> |
注意:成员数据包括map中的key、对象的publich属性和getter。
4. 表达式中的函数
表达式中支持使用函数,语法为:prefix:function( arg1, arg2, arg3 …. argN);
ZCF内置的函数都不用prefix部分,直接写为function( arg1, arg2, arg3 …. argN);
表达式中凡是可以写参数的地方都可以用一个函数来代替,例如${pow(2,pow(2,2))};
函数可以自定义,请参见知识库自定义ZHTML函数相关的文章。
1 2 3 | Functions:< br /> $< span ></ span >{substring('这是测试字符串',2,4)}=${substring('这是测试字符串',2,4)}< br /> $< span ></ span >{substring('这是测试字符串',2,indexof('这是测试字符串','符'))}=${substring('这是测试字符串',2,indexof('这是测试字符串','符'))}< br /> |
5. 表达式中的变量查找顺序
表达式中如果有变量的话,ZCF会去上下文中查找变量的值。首先ZCF会从当前标签提供的变量表中查找有没有指定名称的变量,如果有则返回该变量的值,如果没有找到则从当前标签的父标签的变量表中查找,此时还没有找到则逐级上溯查找,直到整个页面的全局变量表。如果表达式不在任何标签之中,则直接从全局变量表中查找。
有时候会遇到两个变量在本标签和父标签中都有的情况,例如z:list标签中的${i},这时可以用${i}取本标签中的值,用${parent.i}取父标签,甚至在三层z:list嵌套时可以用${parent.parent.i}取父标签的父标签中的变量值。
以输出乘法口诀表为例:
1 2 3 4 5 6 | Variable Serach Order:< br /> < z:for from = "1" to = "10" > < z:for from = "1" to = "${i+1}" > ${i}×${parent.i}=${i*parent.i} </ z:for >< br /> </ z:for > |
6. 可用全局变量前缀清单
Request :http请求参数;
Response :响应参数,注意此处不是取http响应中的attribute,而是取我们在JAVA方法中通过$S()方法或者Response.put()设置的值;
Header :http头信息;
Cookie :cookie数据;
Current :本次请求的全局数据;
User :当前用户的数据;
Member :当前会员的数据;
Priv :当前用户或者会员的权限数据;
Config :系统全局配置数据;
前缀不区分大小写,其中Request和Response变量可以加前缀,也可以不加前缀,例如如果url中带了type=1的参数,则${type}和${request.type}都可以取到1。
示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | Global Variables:< br /> $< span ></ span >{Request.URL}=${Request.URL}< br /> $< span ></ span >{Request.ClientIP}=${Request.ClientIP}< br /> $< span ></ span >{Request.Port}=${Request.Port}< br /> $< span ></ span >{User.UserName}=${User.UserName}< br /> $< span ></ span >{Config['App.Code']}=${Config['App.Code']}< br /> $< span ></ span >{Config['App.Name]}=${Config['App.Name']}< br /> < br /> < br /> < z:foreach data = "${Config}" > < z:if condition = "${!startswith(key,'Database')}" > [Config]${key}=${value}< br /> </ z:if > </ z:foreach > < br />< br /> < z:foreach data = "${Header}" > [Header]${key}=${value}< br /> </ z:foreach > < br />< br /> < z:foreach data = "${Cookie}" > [Cookie]${value.name}=${value.value}< br /> </ z:foreach > |
7. 所有示例的执行结果
如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 | Expression Test: Operators: ${1+1}=2 ${1-1}=0 ${3*3}=9 ${2/3}=0.6666666666666666 ${17%5}=2 ${2>1}=true ${2>=1}=true ${2<1}=false ${2<=1}=false ${2==1}=false ${2!=1}=true ${true&&false}=false ${true||false}=true ${!false}=true ${empty a}=true ${2>1?'2':'1'}=2 ${12-2*3}=6 ${(12-2)*3}=30 Variables: ${org}={"id":"0001","name":"泽元软件","postcode":"100085","children":[]} ${org.name}=泽元软件 ${org['name']}=泽元软件 ${field}=id ${org[field]}=0001 Functions: ${substring('这是测试字符串',2,4)}=测试 ${substring('这是测试字符串',2,indexof('这是测试字符串','符'))}=测试字 Variable Serach Order: 1×1=1 1×2=2 2×2=4 1×3=3 2×3=6 3×3=9 1×4=4 2×4=8 3×4=12 4×4=16 1×5=5 2×5=10 3×5=15 4×5=20 5×5=25 1×6=6 2×6=12 3×6=18 4×6=24 5×6=30 6×6=36 1×7=7 2×7=14 3×7=21 4×7=28 5×7=35 6×7=42 7×7=49 1×8=8 2×8=16 3×8=24 4×8=32 5×8=40 6×8=48 7×8=56 8×8=64 1×9=9 2×9=18 3×9=27 4×9=36 5×9=45 6×9=54 7×9=63 8×9=72 9×9=81 Global Variables: ${Request.URL}=http://localhost:10090/zcms/example/expression.zhtml ${Request.ClientIP}=0:0:0:0:0:0:0:1 ${Request.Port}=10090 ${User.UserName}=admin ${Config['App.Code']}=ZCMS ${Config['App.Name]}=ZCMS内容管理系统 [Config]System.ContainerInfo=Apache Tomcat/5.5.29 [Config]App.ContextRealPath=G:/Workspace2.x/ZCMS2.x/UI/ [Config]System.JavaVendor=Sun Microsystems Inc. [Config]System.JavaHome=E:\Java\jdk1.5.0_22\jre [Config]System.OSPatchLevel=Service Pack 1 [Config]System.OSArch=x86 [Config]System.OSVersion=6.1 [Config]System.OSName=Windows 7 [Config]System.OSUserLanguage=zh [Config]System.OSUserName=Administrator [Config]System.LineSeparator= [Config]System.FileSeparator=\ [Config]System.FileEncoding=UTF-8 [Config]App.Code=ZCMS [Config]App.Name=ZCMS内容管理系统 [Config]App.DebugMode=true [Config]App.Log.SQL=true [Config]App.Log.PageServerCost=true [Config]App.Log.PageClientCost=true [Config]App.LoginMethod=com.zving.platform.ui.LoginUI.submit [Config]App.LoginPage=login.zhtml [Config]App.MemberLoginPage=member/login [Config]App.CodeSource=com.zving.platform.pub.PlatformCodeSource [Config]App.ExistPlatformDB=true [Config]App.DefaultLanguage=zh-cn [Config]App.FrontDeploy=false [Config]App.Uptime=1392348448701 [Config]Content.ContextURL=http://trunk.2x.zving.com/ZCMS2/ [Config]Content.ResourceRoot=${Parent}/wwwroot/ [Config]DreamWeaverPassword=admin [Config]FrontAppContext=http://trunk.2x.zving.com/ZCMS2/ [Config]ImageLibType=0 [Config]ImageMagickPath=D:\Program Files\ImageMagick-6.3.9-Q8\ [Config]IsMaxWordLength=N [Config]Member.IsSeparateSite=N [Config]Member.Mail.Host=smtp.163.com [Config]Member.Mail.Password=zvingsoft [Config]Member.Mail.UserName=zcmstest@163.com [Config]OpenOfficeExecDir=C:\Program Files\OpenOffice.org 3\program\ [Config]Platform.AppDataPath=${Parent}/wwwroot/.data/ [Config]Platform.Mail.Host=smtp.163.com [Config]Platform.Mail.Password=zvingsoft [Config]Platform.Mail.UserName=zcmstest@163.com [Config]Platform.UpdateServerURLs=http://release.update.zving.com/ http://beta.update.zving.com/ [Config]SinaWeiboConfig.AccessTokenURL=https://api.weibo.com/oauth2/access_token [Config]SinaWeiboConfig.AppKey=398155621 [Config]SinaWeiboConfig.AppSecret=b0ad9659090a7228d46fb313f14045e7 [Config]SinaWeiboConfig.AuthorizeURL=https://api.weibo.com/oauth2/authorize [Config]SinaWeiboConfig.RedirectURI=http://news.2x.zving.com/ZCMS2/ [Config]System.Version=2.0.0.0 [Config]TencentWeiboConfig.AccessTokenURL=1111111 [Config]TencentWeiboConfig.AppKey=11 [Config]TencentWeiboConfig.AppSecret=1 [Config]TencentWeiboConfig.AuthorizeURL=111111 [Config]TencentWeiboConfig.RedirectURI=111111 [Config]Test.TestConfig=dgdsgg [Config]Platform.SlowSQLThreshold=10000 [Config]AdminUserName=admin [Config]System.JavaVersion=1.5.0_22 [Config]App.ContextPath=/zcms/ [Header]host=localhost:10090 [Header]connection=keep-alive [Header]cache-control=max-age=0 [Header]accept=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 [Header]user-agent=Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36 LBBROWSER [Header]accept-encoding=gzip,deflate,sdch [Header]accept-language=zh-CN,zh;q=0.8 [Header]cookie=zcms_skin=zvingclassic; CurrentSite=14; Gather.isAutoWrap4Filter_138=off; Gather.isAutoWrap4Template_138=off; _ZCMS_ShowNewMessage=false; Content.LastCatalog=9191; Content.LastCatalogCode=000022000008; Content.LastEditorView=Default; JSESSIONID=F56A85E7875D1F3ED53A6D654F8C57B1 [Cookie]zcms_skin=zvingclassic [Cookie]CurrentSite=14 [Cookie]Gather.isAutoWrap4Filter_138=off [Cookie]Gather.isAutoWrap4Template_138=off [Cookie]_ZCMS_ShowNewMessage=false [Cookie]Content.LastCatalog=9191 [Cookie]Content.LastCatalogCode=000022000008 [Cookie]Content.LastEditorView=Default [Cookie]JSESSIONID=F56A85E7875D1F3ED53A6D654F8C57B1 |
所有评论仅代表网友意见