Version 3.7版一ZK开发手册_第1页
Version 3.7版一ZK开发手册_第2页
Version 3.7版一ZK开发手册_第3页
Version 3.7版一ZK开发手册_第4页
Version 3.7版一ZK开发手册_第5页
已阅读5页,还剩219页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论