版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Version3.7版一ZK开发手册
目录
Version3.7版一ZK开发手册1
第1章简介14
传统的Web应用程序14
点对点(Ad-hoc)AJAX应用14
ZK:它是什么15
ZK:它不是什么16
ZK:局限16
第2章让我们开始吧16
HelloWorld!16
互动性17
zscript元素17
脚本语言18
将脚本代码放在一个单独的文件中18
attribute元素18
EL表达式19
id属性19
if和unless属性20
forEach属性20
use和apply属性20
use属性21
apply属性21
以zscript实现Java类22
与forward属性」一起使用22
手动创建组件23
不使用ZUML来开发ZK应用程序23
为某一页面定义新的组件24
第3章基础24
架构概况24
执行流25
组件,页面和桌面26
组件26
页面26
页面标题26
桌面26
createComponents方法26
组件树的森林26
组件:视觉部分和Java对象27
标识27
UUID27
ID空间27
命名空间和ID空间28
在zscript中定义变量和函数29
zscript和EL表达式29
多范围(Multi-Scope)的解释器30
Java解释器(BeanShell)30
单范围(Single-Scope)解释器31
在一个页面中使用多种脚本语言31
getVariableVSgetZScriptVariable31
事件32
桌面和事件处理32
桌面及创建组件32
ZUML和XML命名空间32
第4章组件活动周期33
加载页面的活动周期33
页面初始阶段33
组件创建阶段33
事件处理阶段33
响应阶段33
更新页面的活动周期34
请求处理阶段34
事件处理阶段34
响应阶段34
模型(TheMolds)34
组件垃圾回收35
第5章事件监听及处理35
通过标记语言添加事件监听器35
通过程序添加或移除事件监听器35
声明一个成员35
动态地添加与移除事件监听器36
延期事件监听器36
为页面动态地添加和移除事件监听器36
调用顺序37
中止调用序列38
事件监听器提交,发送和回显事件38
提交事件38
发送事件38
回显事件38
线程(Thread)模型39
挂起及恢复39
长操作(LongOperations)40
选择I:服务器推动40
安全问题41
幕后41
选择2:线程挂起和恢复42
事例:一个异步产生标签的工作线程42
选择3:Timer(没有挂起/恢复)43
选择4:捎带(piggyback)(没有挂起/恢复,没有Timer)44
初始与清理事件处理线程45
处理每个事件前的初始化45
处理完每个事件后清理45
第6章ZK用户界面标记语言46
XML46
元素必须格式良好46
特殊字符必须被替换47
属性值必须被指定且用引号包围47
注释47
字符编码47
命名空间48
使用Schema自动完成48
条件式流程49
If和Unless49
Switch和Case49
复合Case49
正则表达式49
和forEach一起使用50
Choose和When50
反复式流程50
each变量51
forEachStatus变量51
如何在事件监听器中使用each和fbrEachStatus变量51
一个解决方法:定制属性52
随机存取(LoadonDemand)52
使用fulfill属性的随机存取52
使用事件监听器的随机存取53
隐含对象53
隐含对像列表53
关于Request和Execution的信息54
进程指令55
page指令55
component指令55
宏格式(Theby-macroFormat)55
类格式(Theby-classFormat)55
init指令56
variable-resolver指令56
import指令56
link和meta指令57
ZK属性57
apply属性57
use属性58
if属性58
unless属性58
forEach属性58
forEachBegin属性58
forEachEnd属性58
fulfill属性58
使用URI表达式59
onFulfill事件59
forward属性59
Forward事件60
为Forward事件传递信息60
Forward条件内的EL表达式60
ZK元素60
zk元素61
一个页面中的多个根元素61
通用的迭代组件61
zscript元素62
如何推迟赋值63
如何选择一种不同的脚本语言63
如何支持更多的脚本语言63
attribute元素64
variables元素64
和composite属性——起使用List和Map值65
null(ThenullValue)65
为一个变量分配保留名65
custom-attributes元素65
组件集及XML命名空间67
标准的命名空间67
第7章ZUML页面及XUL组件集68
基本组件68
标签68
pre,hyphen,maxlength和multiline属性68
按钮69
onClick事件和href属性69
org.zkoss.zk.ui.Execution接口的sendRedirect方法69
单选按钮和单选按钮组70
多用途设计版面70
图像71
本地图像71
图像映射(Imagemap)71
区域72
shape属性72
音频73
输入控件73
type属性73
format属性73
约束74
Datebox的约束74
定制属性74
定制方式显示错误信息75
提图响应能力76
onChange事件76
onChanging事件76
日历76
value属性和onChange事件77
compact属性77
进度条77
Slider77
计时器77
分页77
ListBoxes和Grids的Paging78
窗口78
标题78
closables属性79
sizable属性79
onSize事件79
样式类79
contentstyle属性80
滚动窗口80
边框80
重叠,弹出,Modal,标示和嵌入80
嵌入81
重叠81
弹出81
Modal81
标示81
Modal窗口和事件监听器82
position属性83
通用对话框84
消息框84
文件上传对话框84
一次上传多个文件84
fileupload组件85
onUpload事件85
OnClose事件85
文件下载对话框85
布局组件86
嵌套的borderlayout组件87
size和border属性87
splittable和collapsible属性88
maxsize和minisize属性88
flex属性88
open属性88
onOpen属性89
箱式模型89
spacing属性89
widths和heights属性90
分割器90
collapse属性91
open属性91
onOpen事件91
Tab箱91
嵌套tabbox92
TheAccordionTabBoxes93
orient属性93
Tabs的align属性93
closable属性94
disabled属性94
Tab面板的随机存取94
网格95
滚动网格96
可变列宽96
onColSize事件97
分页网格97
pageSize属性98
paginal属性98
paging属性99
OnPaging事件及方法100
排序100
sortDirection属性100
onSort事件100
sort方法101
实况数据101
实况数据的排序102
辅助表头102
特殊属性103
spans属性103
更多的布局组件104
Separators和空格104
Groupboxes104
contentstyle属性及滚动Groupbox105
工具栏105
菜单栏105
执行一个菜单命令106
像复选框一样使用菜单项目106
autodrop属性106
onOpen事件106
更多的菜单特性107
上下文菜单107
定制的tooltip及弹出菜单107
onOpen事件108
列表框109
多列列表框109
栏头110
栏尾110
下拉列表110
多选111
滚动列表框111
rows属性111
可变列表头112
分页列表框112
排序112
sortAscending和sortDescending属性112
sortDirection属性113
onSort事件113
sort方法113
特殊属性113
checkmark属性113
vflex属性115
maxlength属性115
实况数据115
为实况数据排序115
包含按钮的列表框116
树控件116
open属性和onOpen事件118
多选118
分页118
onPaging和onPageSize事件118
特殊属性119
rows属性119
checkmark属性119
vflex属性119
maxlength属性119
可变列宽119
Tree控件的打开时创建119
下拉列表框120
autodrop属性120
description属性120
onOpen事件121
onChanging事件121
Bandboxes122
closeDropdown方法122
autodrop属性123
onOpen事件123
onChanging事件123
图表123
实况数据124
向下钻取(onClick事件)124
操作区125
拖放125
draggable和droppable属性125
onDrop事件126
使用多选拖曳127
可拖曳组件的多种类型127
HTML相关组件128
html组件128
Native命名空间,/2005/zk/native129
使用Native输出另外的命名空间130
XHTML命名空间,/1999/xhtml130
include组件131
将值传递至包含页面131
包含ZUML页面131
style组件131
script组件132
iframe组件132
onURIChange事件133
与其他技术的整合133
用HTMLFORM和JavaServlets134
name属性134
支持name属性的组件134
丰富用户界面135
客户端行为135
引用一个组件135
一个onfocus和的onblur例子136
强制规则136
onshow和onhide行为136
改变window如何出现的例子136
CSAJavaScriptIM137
action对象137
comm对象137
anima对象138
事件140
鼠标事件140
按键事件140
ctrlKeys属性141
输入事件142
List和Tree事件142
Slider和Scroll事件143
其它事件143
Radio和radiogroup的事件流144
第8章数据绑定145
基本概念145
添加一个数据源145
建立数据绑定管理器146
将UI组件关联至数据源146
何时从数据源加载数据至UI147
何时从UI组件保存数据至数据源147
将相同的数据源关联至多个UI组件148
关联UI组件和一个集合149
在数据源和UI组件间定制转换150
定义数据绑定管理的访问权限151
第9章在ZUML中使用XHTML组件集152
目标152
有效的XHTML页面即为有效的ZUM页面152
以服务器为中心的交互153
像平常一样使用Servlet154
差异154
为每个标签创建一个组件154
UUID即为ID154
副作用155
所有标签都有效155
大小写155
无模型支持155
浏览器端的DOM树155
TABLE和TBODY标签156
事件156
与JSF,JSP及其它的集成156
使用已存在的Servlet156
使用包含丰富156
丰富一个静态的HTML页面157
使用ZKJSP标签157
使用ZKJSF组件158
使用ZKFilter丰富动态生成的页面158
第10章宏组件159
使用宏组件的三个步骤159
第一步.实现159
第二步.实现160
其它属性160
第三步.使用160
传递属性160
arg.includer160
内联宏161
一个例子161
常规宏162
宏组件和1D空间162
从外部访问子组件162
访问定义在Ancestor的变量163
运行时改变macro-uri163
增设方法163
在java中增设方法163
在zscript中增设方法164
当实例化时重写实现类165
手动创建一个宏组件165
第11章高级特性165
标识页面165
表示组件166
组件路径166
排序166
浏览器的信息及控制167
onClientlnfo事件167
org.zkoss.ui.util.Clients类168
防止用户关闭窗口168
浏览器的历史管理168
添加合适的状态到浏览器历史169
监听onBookmarkChange事件并据此操作桌面169
为iframe使用书签功能170
一个简单的事例170
组件克隆171
组件序列化171
序列化会话172
序列化监听器173
跨页面通信173
提交和发送事件173
属性173
跨Web应用程序通信173
来自路径的Web资源174
注释174
注释ZUML页面174
注释组件声明的标准方式174
注释属性(Property)声明的标准方式174
注释属性声明的简单方式175
注释组件声明的简单方式175
手动注释组件175
获取注释175
Richlets176
实现org.zkoss.zk.ui.Richlet接口176
每个URL一个Richlet177
配置web.xml和zk.xml177
会话超时管理178
错误处理178
加载页面时的错误处理178
ZKMobile错误处理179
更新页面时的错误处理180
更新页面时ZKMobile错误181
其它181
配置ZK加载器不压缩输出181
第12章性能提示182
使用编译过的Java代码182
使用deferred属性182
deferred属性和onCreate事件183
使用fonvard属性183
使用Servlet线程处理事件184
模态窗口184
消息框184
文件上传185
使用本地命名空间代替XHTML命名空间185
延长时期(ProlongthePeriod)检查文件是否被修改186
延迟子组件的创建186
为大型Listbox使用实况数据和分页186
使用ZKJSP标签或ZKJSF组件代替ZKFilter186
第13章其它设备和输出格式187
ZKMobile187
Mobile组件集,/2007/mil188
XML输出188
使用ZUML页面输出产生XML输出的三步188
使用XML组件集,/2007/xml188
将文件扩展映射到ZK加载器189
将文件扩展映射到XML组件集189
XML组件集190
TheXMLTransformer190
第14章国际化191
地域191
px_preferred_locale会话属性191
请求拦截器192
时区192
px_prefened_time_zone会话属性193
请求拦截器193
标签193
本地文件193
浏览器和本地URI193
在Java中定位浏览器与本地资源194
消息194
主题195
改变字体大小和/或样式195
使用Library属性195
使用内置的小字体主题196
使用内置的大字体主题196
根据Locale使用主题196
使用自制主题196
主题提供者196
第15章数据库连接197
ZK仅为表现层197
使用JDBC的简单方式(但不推荐)197
使用连接池198
打开及关闭一个连接198
配置连接池200
Tomcat5.5+MySQL200
JBoss+MySQL200
JBoss+PostgreSQL201
易于数据库访问的ZK特性202
org.zkoss.zk.ui.event.EventThreadCleanup接口202
在EL表达式中访问数据库202
实现org.zkoss.zk.ui.util.Initiator接口203
事务处理和org.zkoss.zk.util.Initiator204
J2EE事务处理及Initiator204
Web容器和Initiator204
第16章整合Hibernate206
什么是Hibernate206
安装Hibernate>206
配置ZK的配置文件206
创建Java对象206
映射Java对象207
使用映射文件207
使用Java注释208
仓ij建Hibernate酉己置文件209
使用映射文件209
使用Java注释210
创建DAO对象211
在ZUML页面访问持久对象212
第17章整合Spring212
什么是Spring212
使用Spring的准备212
将spring.jar复制至!|你的Weblibrary212
酉已置wcb.xml213
创建Spring配置文件213
创建SpringBean类213
在ZUML页面内访问SpringBean214
使用variable-Resolver214
使用SpringUtil214
SpringSecurity215
运行一个简单的应用程序215
使用SpringSecurity的准备215
配置/WEB-INF/web.xml文件215
仓犍/WEB-INF/applicationContext-security.xml216
定义哪些服务被保护217
定义那些ZK事件被保护218
ZUML页面219
第18章Portal整合219
配置220
WEB-INF/portlet.xml220
WEB-INF/web.xml220
使用方法220
zk_page及zk_richlet参数和属性220
事例221
第19章ZK之外221
Logger221
如何使用ZK配置日志等级222
i3-log.conf的内容222
被允许的级别222
i3-log.conf的位置223
禁用所有日志223
DSP223
iDOM224
第1章简介
欢迎使用ZK--一种丰富Web应用程序的最简单方式。
此开发手册描述了ZK的概念和功能。关于如何安装配置ZK的环境,请参阅QuickStartGuide。如果想得到的各个组
件(components)的属性和方法的详细描述,请参阅Developer'sReference。
这章描述了Web程序,AJAX技术和ZK项目的历史背景。如果你想马上了解ZK的功能,可以跳过这一章。
传统的Web应用程序
以简单高效交换文档为目的的Web技术,例如超文本传输协议(HTTP)和超文本标记语言(HTML),都来源于单页性
(based)和无状态(stateless-communication)的模式。在这种模式中,一个页面是自给自足(sel&contained)的,并且是沟通
客户端与服务器端的最小单位。
BrowserServer
Nge1
随着网络俨然成为应用开发的默认平台,这种模式面临着巨大的挑战:对于表现当今应用程序中复杂性的无能为力。举
个例子,为了给客户报价,你或许必须打开另一个页面来查询此客户的交易记录,再打开一个页面来显示当前的价格,还得
开一个页面来存储当前信息。用户被迫离开他正在工作的页面,并且在几个页面间来回浏览。这很容易迷失,混淆,结果是
把客户弄得不愉快,销售机会的损失和低生产力。
在这种单页性(based)的模式上开发一个现代的应用程序也是•个极大的挑战。在这种模式中,运行在服务器上的
应用程序必须处理来自从语法上分析请求,送出回应,连接用户从一个页面到另一个页面路由的一切,并且处理用户的各
种错误。数十种框架,例如Struct,Tapestry和JSF,随即出现用来简化开发过程。由于单页性(based)模式与现代模式
之间的巨大差别,学习和使用这些框架并不是一个愉快的过程,更不耍提直觉感知(intuition)和简化了。
点对点(Acbhoc)AJAX应用
经过数十年的演变,Web应用已经从静态HTML发展到DHTML,applets»Flash,最后发展到了AJAX[1](Asynchronous
JavaScriptandXML,非同步的JavaScript和XML)。通过谷歌地图及推荐(GoogleMapsandSuggest)的说明,AJAX技术通
过提供与桌面应用程序同等水平的互动性和反应能力给Web应用带来了新生命。不同于叩plets或Flash,AJAX基于标准的
浏览器和JavaScript,并且不需要专门的插件。
Browser
AHTMLpage
AJAX是新一代的DHTML,就像DHTML,它在很大程度上依赖了JavaScript监听用尸活动产生的事件,然后动态的操
纵浏览器中一个页面(亦称DOM)的视觉表现。此外,它更近一步,能够使与服务器的沟通异步进行,即不需要离开或提交
整个页面。它通过引入客户与服务器间轻量级的通信(light-weightcommunication)打破了基于页面的模式。妥善设计,AJAX
可以给Web应用带来丰富的桌面通用组件,而且在Web应用程序的活动周期内可以动态更新这些组件并通过应用程序获得
对组件的更多控制。
当提供给用户需要的交互性的同时,AJAX给已经很昂贵的Web应用程序开发增加了复杂性和技术先决条件。开发者
不得不在浏览器中操纵DOM,并且使用不兼容甚至是错误的JavaScript与服务器通信,为了更好的交互性,开发者必须重
复复制应用数据和业务逻辑以便于浏览。这样就增加了维护成本且面临在服务端与客户端同步数据的挑战。
底线是在关于处理请求方面,点对点(Ad-hoc)的AJAX应用与传统的Web应用没有区别。开发者仍然必须解决由单页
性(based)和无状态(stateless-communication)模式造成的隔阂。
[1]Ajax是由JesseJamesGarrett於Ajax:ANewApproachtoWebApplications中所提出的。
ZK:它是什么
ZK是一个事件驱动(event-driven)的,基于组件(component-based)的,用以丰富网络程序中用户界面的框架。ZK包括一
个基于AJAX事件驱动的引擎(engine),一套丰富的XUL和XHTML,以及一种被称为ZUML(ZKUserInterfaceMarkup
Language,ZK用户界面标记语言)的标记语言。
有了ZK,您可以利用XUL和XHTML的丰富特性来呈现您的Web应用,操纵它们来处理因用户活动而引发的事件,
就像在桌面应用程序中那样。不同于大多数其它框架,就ZK而言,AJAX是种幕后(bchind-thc-sccne)技术,组件内容的
同步和流水线事件(pipeliningofevents)都由ZK引擎自动完成。
您的用户获得了如同桌面程序的互动性和反应能力,而您的开发仍然像开发桌面应用程序那样简单。
除了简单的模型和丰富的组件,ZK也支持一种文本标记语言,称为ZUML。ZUML,如同HTML,可以让开发人员设
计界面而无需编程。通过XML的命名空间,ZUML无缝的集成了一套不同的标签[2]到同一页面。目前,ZUML支持两套
标签,即XUL和HTML。
为了方便快速模型开发(prototyping)和定制,ZK允许开发人员嵌入EL表达式,以及您喜欢的脚本语言,包括但不限于
Java[3],JavaScript[4],Ruby[5]andGroovy[6].开发人员可以选择不嵌入任何脚本语言,如果他们喜欢更严格的要求
(disciplinc)o不同于JavaScript嵌入在HTML,ZK在服务器端执行所有的嵌入脚本。
注意一切运行在服务器端是从应用程序开发者的角度出发的。组件开发人员必须平衡互动性与简单性来决定什么任务由
浏览器来完成,而什么任务由服务器来完成。
[2]标签是XML元素。组件是在当ZUML网页被翻译时所产生出来的。
[3]使用BcanShcll()ft'JJavainterpretero
[4]使用Rhino(http:〃www.moziH/rhino)的JavaScriptinterpretero
[5]使用JRuby(/)fl'JRubyinterpreter。
[6]使用Groovy(/)Groovyinterpreter<)
ZK:它不是什么
ZK并没有关注持久化(persistence)或伺服务器之间的沟通(inter-servercommunication)。ZK被设计的尽可能的简单,它只
针对表示层(presentationtier)。他并不要求和暗示任何后端技术,所有你喜欢的中间件就像以前一样工作,如JDBC,
Hibernate>JavaMail,EJB或JMS。
Zk并没有为开发人员提供(tunnel),RMI或其他的API用来在客户端与服务器端通信,因为所有的代码都运行在同一服
务器的同一Java虚拟机。VM)上。
ZK并没有强迫开发人员使用MVC或其他设计模式。是否使用它们由开发人员选择。
ZK并不是旨在把XUL带入Web应用的框架。它的目标是把桌面编程模式引入Web应用。目前,它只支持XUL和
XHTML。将来它或许会支持XAML,Xquery及其它。
ZK将•AJAX嵌入到了现今的应用中(implementation),但它并没有止步于AJAX结束的地方。在ZKMobile中,您的应
用程序可以到达支持J2ME的任何设备,例如PDA,手机和游戏平台。此外,您根本不用修改您的应用程序[7]。
[7]根据萤幕大小有时需要做调整。
ZK:局限
ZK不适合在客户端运行多任务的应用程序,例如3D动作游戏,除非你写编写一个特殊的组件。ZK也不适合需要大量
使用客户端计算能力的应用程序。
第2章让我们开始吧
这•章的内容描述了如何写出你的第一个ZUML页面,如果你没时间的话建议你至少阅读这一章。此章使用ZUL来说
明ZK的功能,但是也适合于其他ZK支持的语言。
HelloWorld!
当ZK安装到你最喜爱的Web服务器[8]后,你就可以直接编写应用程序。仅需在合适的目录新建一个名为hello.zul的
文件[9]。
〈windowtitlc=nHcllo"bordcr="normar*>
HelloWorld!
</window>
然后输入正确的URL,例如:http://localhost/myapp/hello.zul,得到如下页面:
Hello
HelloWorld!
在ZUML页面中,一个XML元素描述了应该创建。在这个例子中,被创建的是window(org.zkoss.zul.Window
)»XML属性(attributes)用来指定window组件属性(properties)的值。在这个例子中,创建了window,并指定了title和
border属性的值分别为'Hello邪XormaLXML元素内的文本(即HelloWorld)也可以通过一个称为Label
(org.zkoss.zuLLabel)的标签来展示。所以上面的例子和下面的例子是等价的:
〈windowtitle-1140110"bordcr=Mnormar*>
<labelvalue=nHelloWorld!'7>
</window>
也等价于:
<windowtitle="Hello"border="normal”>
<labelvalue=HHelloWorld!n</label>
</window>
[8]参考QuickStartGuide。
[9]你也可以试试这些例子的在线示范。
互动性
让我们来添加一些互动元素:
<windowtitle="Hello"border=Mnormar'>
<buttonlabel=nSayHello**onClick=f'alert("HelloWorld!")7>
</window>
点击按钮,可以看到如下效果:
Hello
SayH
onClick是为组件添加事件监听器的一个特殊属性。这个属性的值可以是任何合法的Java代码。注意我们使用"
来匹配双引号以使其成为合法的XML文档。如果你不熟悉XML,可以在ZK用户接口标记语言(ZKUserInterfaceMarkup
Language)一章中查看有关XML的部分。
alert是一个显示消息对话框的全局函数。它是调用org.zkoss.zul.Messagebox类的一个捷径。
<buttonlabcl=nSayHello'*onClick=nMessagcbox.show("HclloWorld!")7>
[注]:
1.嵌入到ZUML页面的脚本可以用不同的语言编写,包括但不限于Java,JavaScript,RubyandGroovyo此外,它们是
运行在服务器上的。
2.在运行时刻,ZK使用BeanShell解释Java,所以你可以声明全局函数,例如alert。同样它为大部分的脚本语言提
供了•个简单的方式来定义全局函数,有时甚至是类。
3.在ZLJML页面嵌入脚本语言前,所有java.lang,java.util,org.zkoss.zk.ui,org.zkoss.zk.ui.event和org.zkoss.zul包中
的类都已经被引入。
zscript元素
zscript是一个用来定义代码的元素,当ZUML页面被提交时被赋值(evaluated)。典型的应用包括
初始化和申明全局变量与方法。
[注]:你不可以在zscript代码中使用EL表达式。
例如,下面的例子展示了每次按钮被按下时显示的不同信息。
<windowtitIe=',HelloMborder=nnormar'>
<buttonlabel=nSayHello',onClick-,sayHello()V>
<zscript>
intcount=0;
voidsayHello(){//declareaglobalfunction
alcrt(uHclloWorld!"+-H-count);
</zscript>
</window>
[注]:zscript仅当页面被加教时赋值(evaluated),次,通常被用于定义函数和初始变量。
脚本语言
Java是ZK默认的脚本语言,但是你可以通过指定language属性来选择不同的语言,就像下面的例子一样。language属性区
分大小写。
<zscriptlanguage=njavascriptH>
alert('SayHiinJavaScript*);
newLabel(nHi,JavaScript!M).setParent(win);
</zscript>
你可以像卜面的例子一样使用前缀javascript:来为事件处理器指定脚本语言。注意:不要在自己指定语言的前面或后面添加
空格。
<buttononClick-Javascript:do_something_in_js();M/>
你可以在同一页面中使用不同的脚本语言。
将脚本代码放在一个单独的文件中
为了分离代码和视图(views),开发人员可以将将脚本代码放在单独的文件中,例如sayHello.zs,然后使用sre属性指向此文
件。
〈windowtitle-,HelloMborder=Mnormal">
<buttonlabel="SayHello"onClick=HsayHelIo()M/>
<zscriptsrc=*,sayHello.zs,7>
</window>
假设sayHello.zs文件的内容如下:
intcount=0;
voidsayHello(){//declareaglobalfunction
alert(nHelloWorld!"+-H-count);
)
attribute元素
attribute元素是用来定义XML元素属性的元素。妥善使用,它可以使页面更具可读性。下面的例子和前面所述的hello.zul
是等价的。
<buttonlabel="SayHcllo">
<attributename=,,onClick,,>alert(,,HelloWorld!");</attribute>
</button>
你可以决定是否使用trim属性来省略属性值开头和末位的值,使用方法如下:
<button>
Ottributename=,,laber,trim=',true,'>
Theleadingandtrailingwhitespaceswillbeomitted.
</attributc>
</button>
EL表达式
就像JSP一样,你可以在ZUML页面的任何部分使用EL表达式,但除了属性的名字(namesofattributes),元素(elements)和
处理指令(processinginstruction)o
EL表达式的语•法格式为${cxpr},例如:
<elementattr1="${perty}../>
${map[entry]}
<another-element>${3+counter}isS{emptymap}<7another-element>
[提示]:empty是用来测试一个map,collection,array或者string是否为null或空的。
[提示]:map[entry]是读取m叩元素的一种方法,换句话说,就像Java中的map.get(entry)<.
当一个EL表达式作为一个属性值时,它可以返回任何类型的对象,对象的长度限制在组件可以接受的范围内。在下面的例
子中,表达式被赋予一个Boolean对象的值:
<windowif="${some>10}**>
H
[提示]:+在EL表达坏中是算数操作,并不能用于string类型。对于string可以使用"${exprl}isaddedwith${expr2}o
标准的隐含对象(implicitobjects),如param和requestScope,还有ZK的隐含对象,如self和page,可以很简单的使用。
<textboxvalue=*'${param.who}does${param.what}*'/>
为了引入一个方法,你可以按如卜方法使用xeLmethod处理指令(processinginstruction)。
<?xel-mcthodprefix="c"name="fbrNamc”
class-,java.lang.Classu
signaturc=,,java.lang.ClassforNamc(java.lang.String),,?>
<textboxvalue=,,${c:fbrNamc('java.util.List,)},7>
通过从TLD引入EL函数,你可以使用被称为tablib的指令,就像下面:
<?taglibu「i="http:〃/dsp/web/core”prefix=Mc"?>
Developer'sReference提供了更多关于EL表达式的细节。或者,你可以参考JSP2.0的指南或手册来来获得更多关于EL表
达式的信息。
id属性
为了读取Java代码或EL表达式中的组件,你可以使用id属性来标识它。在下面的例子中,我们为label设置了一个标识,
这样当一个按钮被按下时,我们就可以操纵label的值了。
〈windowtitle=,,Vote"border="normal">
DoyoulikeZK?<labelid="laber7>
<separator/>
<buttonlabel="YesHonClick=,,label.value=self.label'7>
<buttonlabel="NoMonClick="label.value=sel£labe17>
</window>
当按下Yes按钮时,可以看到如下效果:
likeZK?Yes
下面是一个EL表达式为组件赋值的例子:
<tcxtboxid=Msourccnvalue=,'ABC,7>
<labelvalue=M${source.value}'7>
if和unless属性
if和unless属性被用丁,控制是否创建一个组件,在下面的例子中,两个label只有在请求中含有一个为vote的属性时才被创
建:
<labelvalue=MVote1"iH'${param.vote}7>
<labelvalue=MVote2nunless-*${!param.vote}7>
如果两个属性都被指定,将不会创建组件,除非它们的值都被赋值为truco
forEach属性
forEach属性用来控制要创建多少组件,如果你为这个对象指定一个对象集合,ZK装载机亿Kloader)将为每个被指定的集
合项0创建一个组件。在下面的ZUML页面中,listitem元素将被赋值三次(分别为"Monday","Tuesday"和"Wednesday")然
后产生三个list项目。
<zscript>contacts=newString[]{"Monday","Tuesday","Wednesday"};v/zscript>
<listboxwidth=M100pxM>
Monday
<listitemlabel-*S{each}"fbrEach="${contacts}17>Tuesday
</listbox>Wednesday
当使用forEach属性赋值时,每个变量被一个接一个的赋予来自集合的对象,即像先前接触的例子一样。因上面的ZUML
页面和卜.面的是等价的:
<listbox>
<listitemlabel=',Monday'7>
<listitemlabcl=MTucsday'7>
<listitcmlabcl="Wcdncsday'7>
</listbox>
另外,你也可以为fbrEach属性指定一个项目列表,通过逗号来分隔各个项目。
<listbox>
<listitemlabel-*S{each}"fbrEach=MMonday,Tuesday,Wednesday17>
</listbox>
除了使用forEach,还可以通过fbrEachBegin和forEachEnd来控制迭代(iteration),可以参考ZK用户标记语言一章中ZK属
性一节获取详细信息.
use和apply属性
在页面中嵌入代码不当会增加维护的难度,有两种途径可以从视图中分离出代码。
一种途径是你可以监听所关心的事件,然后调用合适的方法进行处理。例如,可以调用onCreate四,onOK四,onCancel回事
件来完成初始化(initialize),处理(process)和取消(cancel)等工作。
<windowid=MmainnonCreate=MMyManager.init(main)*'
onOK=MMyMcess(iTiain)"onCancel=',MyManagcr.canccl(main),7>
另外,必须有一个名称为MyManager的Java类,内容像下面一样:
importorg.zkoss.zul.Window;
publicclassMyManager{
publicstaticvoidinit(Windowmain){//doesinitialization
)
publicstaticvoidsavc(Windowmain){//savestheresult
}
publicstaticvoidcancel(Windowmain){//cancelanychanges
但是,上面的方法需要你在ZUML页面内嵌入一些代码。在用户界面(UI)内嵌入代码的优点是可以很容易的动态改变行为(特
别是在原型阶段),但是这仍然会展现一些维护代码且性能会有一些降低
use属性
若不想在ZUML页面内使用Java代码,你可以继承一个组件的实现来处理事件,如卜"
importorg.zkoss.zul.Window;
publicclassMyWindowextendsWindow{
publicvoidonCreate(){//doesinitialization
}
publicvoidonOK.(){//savetheresult
}
publicvoidonCancel(){//cancelanychanges
)
|
然后,使用use属性指定类,如下。
<windowuse="MyWindown>
</window>
apply属性
若你喜欢使用MVC(模型-试图-控制者)方法,例如,你不想在window(视图)内嵌入处理代码,可以实现一个类来初始化
windowo这个类必须实现org.zkoss.zk.ui.util.Composer接口。
importorg.zkoss.zk.ui.util.Composer;
importorg.zkoss.zul.Window;
publicclassMyComposerimplementsComposer{
publicvoiddoAfterCompose(Componentcomp){
((Window)comp).setTitle(uMyTitle**);//dowhateverinitializationyouwant
//compisWindowsincewewillspecifyittoawindowlater
}
)
在这里我们假设你有三个监听器,MyCrcate,MyOK,和MyCanccL参考下面的事件章节获取事件监听器的解释。
然后,使用
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度个人股权转让与股权激励计划合同4篇
- 2025年在线娱乐服务合同
- 2025年借壳上市销售协议
- 2025年化工品供应协议
- 2025年办公用品采购合同
- 2025年仓库租赁业务保密协议
- 2025年度互联网数据中心(IDC)运营管理合同范本4篇
- 二零二五版智慧小区门禁系统采购与维护协议4篇
- 二零二五年度二手船舶购置协议材料船舶买卖3篇
- 2025版储罐租赁及物联网技术应用合同3篇
- 餐厨垃圾收运安全操作规范
- 皮肤内科过敏反应病例分析
- 电影《狮子王》的视听语言解析
- 妊娠合并低钾血症护理查房
- 煤矿反三违培训课件
- 向流程设计要效率
- 2024年中国航空发动机集团招聘笔试参考题库含答案解析
- 当代中外公司治理典型案例剖析(中科院研究生课件)
- 动力管道设计手册-第2版
- 2022年重庆市中考物理试卷A卷(附答案)
- Python绘图库Turtle详解(含丰富示例)
评论
0/150
提交评论