[置顶] ZK高级特性:Style定制与客户端集成
1、ZK与传统MVC框架的集成
由于ZK应用本质上也是基于标准Web技术Servlet框架,因此与其它MVC框架的集成没有什么特别的,
以一个典型场景为例——为一个现有的Web项目(前端采用WebWork+Freemarker+prototype)引入ZK技术开发新的页面和模块,主要集成工作包括:
- 页面集成方式1:在freemarker中嵌入iframe指向zul页面;
- 页面集成方式2:prototype打开新页签时url参数指向zul页面;
- 参数传递方式1:url后面跟参数;
- 参数传递方式2:WebWork的action中request.setAttribute,然后服务端forward转到zul页面;
- 参数传递方式3:WebWork的action中session.setAttribute,然后返回页面中iframe指向zul页面;
2、CSS样式定制
2.1、概述
ZK应用对于浏览器来说就是标准的Web页面,我们在ZUL页面或java代码中创建的每一个ZK组件在运行时都会被ZK引擎渲染生成标准的HTML+CSS+JavaScript代码,
并且ZK允许我们对所有组件的样式进行定制,例如如下代码就可以将button按钮组件的样式从灰色背景图圆角改变成蓝底白字直角的样子:
/* 覆盖默认按钮样式,实现蓝底白字按钮 */.blue-button .z-button-tl,.blue-button .z-button-tr,.blue-button .z-button-bl,.blue-button .z-button-br,.blue-button .z-button-tm,.blue-button .z-button-bm,.blue-button .z-button-cl,.blue-button .z-button-cr,.blue-button .z-button-cm { background-image : none ; background-color : #2777C3 ; color : #ffffff ;}<button label= "查询" onClick= "@command('query')" sclass= "blue-button" width= "65px" /><button label= "重置" onClick= "@command('reset')" sclass= "blue-button" width= "65px" /> |
通过Firebug等工具查看ZK页面的Dom可以方便的获得某个页面元素对应的样式是被那个zclass定义的,然后就可以有针对性的精确修改其样式;
2.2、三种定制方式
具体的有三种方式:
- 覆盖zclass:在页面<style>区域添加与ZK组件zclass同名的class,然后覆盖某些样式属性,这样就可以对该页面范围内的所有该组件样式进行修改;
- 定义sclass:像上面代码示例中那样定义自己的class,然后在需要应用的组件中指定sclass属性即可;
直接在组件的style字段中指定样式,例如
<
label
value
=
"红色粗体字"
style
=
"color:red;font-weight:bold"
/>
2.3、更多示例
|
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
|
/* 菜单样式 */
.menuItem{ text-decoration:none;color:#a9ccf4; }
.menuItem:hover{ text-decoration:underline;color:#ffffff; }
.menuItem:visited{ text-decoration:none;}
.menuItemSelected{ text-decoration:none; color:#ffffff;font-weight:bold;}
<div>
<divid="menuDiv"style="background-color:#2777C3;"height="30px">
<hboxalign="center"vflex="true">
<separator/>
<separator/>
<alabel="保全"sclass="menuItem">
<custom-attributesurl="/zuls/bqShiwu/bqShiwu.zul"/>
</a>
<separator/>
<labelvalue="|"style="color:#ffffff"/>
<separator/>
<alabel="交款"sclass="menuItem menuItemSelected">
<custom-attributesurl="/zuls/shiwu.zul"/>
</a>
<separator/>
<labelvalue="|"style="color:#ffffff"/>
<separator/>
<alabel="服务"sclass="menuItem">
<custom-attributesurl="/zuls/ServiceNetWork/serviceNetWorkQuery.zul"/>
</a>
<separator/>
<labelvalue="|"style="color:#ffffff"/>
<separator/>
<alabel="单证"sclass="menuItem">
<custom-attributesurl="/zuls/resendDocument/resendDocumentQuery.zul"/>
</a>
</hbox>
</div>
<divid="contentDiv">
<includeid="交款"src="/zuls/shiwu.zul"hflex="true"/>
</div>
</div>
|
列表中超长文本自动换行
<labelvalue="${each.cityName}"style="word-wrap: break-word;"/>
|
紧凑表格:去掉padding
<style>tr.z-row .z-detail-outer {padding:0 0 0 0}</style>
|
更多见官方文档 《ZK Style Customization Guide》、 http://books.zkoss.org/wiki/ZK%20Style%20Customization%20Guide/Upgrade%20Customized%20Style%20From%20other%20ZK%20Version/Upgrade%20From%20ZK%206.5
3、ZK与客户端JS的双向调用
3.1、服务端Java调用客户端JS
ZK支持在服务端Java代码中直接执行js,如:Clients.evalJavaScript("top.bodyIframe.main.tabsDetail.setActiveTab('010402')");//选中保单查询页签
如果要执行的JS很长,就不方便直接这样拼字符串了,可以:
- 在Zul页面中引入js文件:<script type="text/javascript" src="/js/life/telGPS/preserveDoc.js"></script>
或在<script>标签中直接写js:
<
script
type
=
"text/javascript"
>
function sendMessage(id){ var telNum = top.spani; zAu.send(new
zk.Event(zk.Widget.$('$preserveDisDocumentPopup'),'onSendMessage',{'':{documentId:id,tel:telNum}})); return;
}
</
script
>
如果要执行的js不仅长而且里面有很多变量,可借助freemarker渲染js文件,例如:
static {
try{
cfg =newConfiguration();
cfg.setLocalizedLookup(false);
cfg.setClassForTemplateLoading(CheckIdentityCtrl.class,"/com/xx/ctrl/policyCancel/");
jsTemplate = cfg.getTemplate("checkIdentity.js","UTF-8");
}catch(Exception e) {
e.printStackTrace();
thrownewRuntimeException(e);
}
}
HashMap map = newHashMap();
map.put("customerName", selectedPolicy.getsPname());
map.put("policyNo", selectedPolicy.getPolicyno());
String js = FreeMarkerTemplateUtils.processTemplateIntoString(jsTemplate, map);
logger.debug(js);
Clients.evalJavaScript(js);
|
3.2、在ZUL页面中直接调用JS
<scripttype="text/javascript">
function sendShortMessage(id){
var telNum = top.spani;
zAu.send(new zk.Event(zk.Widget.$('$testButton'),'onSendMessage',{'':{documentId:id,tel:telNum}}));
return;
}
</script>
<windowxmlns:w="client"…………>
…………
…………
<alabel="发送短信"w:onClick="sendShortMessage('${each.documentId}')"style="color:red"></a>
…………
…………
<buttonid="testButton"label="这个按钮用来被js作为zAu通知目标"onSendMessage="@command('sendMassage',e=event)"visible="false"></button>
|
3.3、JS调用ZK服务
客户端JS调用ZK服务也非常简单——通过zAu对象像某个组件发送事件,然后组件声明该事件触发command或服务端listen该事件处理即可;
示例代码如下:
<scripttype="text/javascript">
function sendShortMessage(id){
var telNum = top.spani;
zAu.send(new zk.Event(zk.Widget.$('$testButton'),'onSendMessage',{'':{documentId:id,tel:telNum}}));//发送json对象调用ZK服务
return;
}
</script>
<windowxmlns:w="client"…………>
…………
<alabel="发送短信"w:onClick="sendShortMessage('${each.documentId}')"style="color:red"></a>
…………
<buttonid="testButton"label="这个按钮用来被js作为zAu通知目标"onSendMessage="@command('sendMassage',e=event)"visible="false"></button>
|
@Command
publicvoidsendMassage(@BindingParam("e") Event e)throwsException{
JSONObject json = (JSONObject) e.getData();
String documentId = (String)json.get("documentId");
String tel = (String)json.get("tel");
|
参考资料:http://marsvaadin.iteye.com/blog/1391559
[置顶] ZK高级特性:Style定制与客户端集成的更多相关文章
- Zookeeper系列五:Master选举、ZK高级特性:基本模型
一.Master选举 1. master选举原理: 有多个master,每次只能有一个master负责主要的工作,其他的master作为备份,同时对负责工作的master进行监听,一旦负责工作的mas ...
- [置顶] ZK(The leading enterprise Ajax framework)入门指南
1. Why ZK JavaEE领域从来就不缺少Framework尤其是Web Framework,光是比较流行的就有:SpringMVC.Struts2.JSF系列…… 其它不怎么流行的.小众的.非 ...
- [置顶] Android 高级开发 源码 UI 缓存 网络
1.Android 源码剖析 性能优化 开源代码 2.Android UI效果源码 3.http://mzh3344258.blog.51cto.com/1823534/d-3 4.微信公众平台开发 ...
- java高级特性增强
第4天 java高级特性增强 今天内容安排: 1.掌握多线程 2.掌握并发包下的队列 3.了解JMS 4.掌握JVM技术 5.掌握反射和动态代理 java多线程增强 .1. java多线程基本知识 . ...
- [置顶] IIS应用程序池多工作进程设置及Session共享
[置顶] IIS应用程序池多工作进程设置及Session共享 在调优iis的时候,朋友分享给我一个特别棒的设置方法步骤,感谢好朋友的分享. IIS应用程序池多工作进程设置及Session共享 1 ...
- java_day06_java高级特性
Advance Java Programming 第六章: java语言高级特性(part1) 1.static修饰符 1)static变量 在类中,使用static修饰的成员变量,就是静态变量,反之 ...
- 你应该知道的Vue高级特性
本文使用的Vue版本:2.6.10 Vue为我们提供了很多高级特性,学习和掌握它们有助于提高你的代码水平. 一.watch进阶 从我们刚开始学习Vue的时候,对于侦听属性,都是简单地如下面一般使用: ...
- 在UWP中页面滑动导航栏置顶
最近在研究掌上英雄联盟,主要是用来给自己看新闻,顺便copy个界面改一下段位装装逼,可是在我copy的时候发现这个东西 当你滑动到一定距离的时候导航栏会置顶不动,这个特性在微博和淘宝都有,我看了@ms ...
- 自定义置顶TOP按钮
简述一下,分为三个步骤: 1. 添加Html代码 2. 调整Css样式 3. 添加Jquery代码 具体代码如下: <style type="text/css"> #G ...
随机推荐
- android httpClient 支持HTTPS的访问方式
项目中Android https请求地址遇到了这个异常,javax.net.ssl.SSLPeerUnverifiedException: No peer certificate,是SSL协议中没有终 ...
- 配置Nutch模拟浏览器以绕过反爬虫限制
原文链接:http://yangshangchuan.iteye.com/blog/2030741 当我们配置Nutch抓取 http://yangshangchuan.iteye.com 的时候,抓 ...
- workspace & subProject & target
workspace & subProject & target http://blog.itpub.net/12231606/viewspace-1079867/ 最近新入一个项目组, ...
- Linux命令学习之shift命令
位置参数可以用shift命令左移.比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1.$2.$3丢弃,$0不移动.不带参数的shift命令相当于shift ...
- MyEclipse数据库反向生成实体类
MyEclipse数据库反向生成实体类 “计应134(实验班) 凌豪” 当我们在开发项目涉及到的表太多时,一个一个的写JAVA实体类很是费事.然而强大的MyEclipse为我们提供简便的方法:数据库反 ...
- 【Chromium中文文档】跨进程通信 (IPC)
跨进程通信 (IPC) 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/I ...
- Linux中的网络
在windows 中表示一张网卡用本地连接1,本地连接2这种方式来表示:而在linux 中用的是etho,eth1 等等这样的东西来表示的.
- 製程能力介紹(SPC introduction) ─ 製程能力的三種表示法
製程能力的三種表示法 Ck: 準度指標 (accuracy) Ck=(M-X)/(T/2) Cp: 精度指標 (precision) Cp=T/(6σp) 規格為單邊時:Cp=(Tu-X)/3 ...
- 解密电子书之二:EPD控制芯片
EPD控制芯片大致上相当于计算机的显卡,没了它,所有电子书都变白板.类似显卡中的ATI与NVIDIA,EPD控制芯片中也是两家:Surf(泰信科)和EPSON(爱普生),其中爱普生是最早推出电子纸显示 ...
- Android updater-scripts(Edify Script)各函数详细说明(转)
这是Android系统来运行updater-scripts的Edify语言的基本介绍. 大部分的Edify命名都是函数,当调用这些函数结束的时候,会返回数据给脚本.当然,你也可以使用这些函数的返回值来 ...