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
>
            
<
div
id
=
"menuDiv"
style
=
"background-color:#2777C3;"
height
=
"30px"
>
                
<
hbox
align
=
"center"
vflex
=
"true"
>
                    
<
separator
/>
                    
<
separator
/>
                    
<
a
label
=
"保全"
sclass
=
"menuItem"
>
                        
<
custom-attributes
url
=
"/zuls/bqShiwu/bqShiwu.zul"
/>
                    
</
a
>
                    
<
separator
/>
                    
<
label
value
=
"|"
style
=
"color:#ffffff"
/>
                    
<
separator
/>
                    
<
a
label
=
"交款"
sclass
=
"menuItem menuItemSelected"
>
                        
<
custom-attributes
url
=
"/zuls/shiwu.zul"
/>
                    
</
a
>
                    
<
separator
/>
                    
<
label
value
=
"|"
style
=
"color:#ffffff"
/>
                    
<
separator
/>
                    
<
a
label
=
"服务"
sclass
=
"menuItem"
>
                        
<
custom-attributes
url
=
"/zuls/ServiceNetWork/serviceNetWorkQuery.zul"
/>
                    
</
a
>
                    
<
separator
/>
                    
<
label
value
=
"|"
style
=
"color:#ffffff"
/>
                    
<
separator
/>
                    
<
a
label
=
"单证"
sclass
=
"menuItem"
>
                        
<
custom-attributes
url
=
"/zuls/resendDocument/resendDocumentQuery.zul"
/>
                    
</
a
>
                
</
hbox
>
            
</
div
>
            
<
div
id
=
"contentDiv"
>
                
<
include
id
=
"交款"
src
=
"/zuls/shiwu.zul"
hflex
=
"true"
/>
            
</
div
>
        
</
div
>


列表中超长文本自动换行
<
label
value
=
"${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 =
new
Configuration();
            
cfg.setLocalizedLookup(
false
);
            
cfg.setClassForTemplateLoading(CheckIdentityCtrl.
class
,
"/com/xx/ctrl/policyCancel/"
);
            
jsTemplate = cfg.getTemplate(
"checkIdentity.js"
,
"UTF-8"
);
        
}
catch
(Exception e) {
            
e.printStackTrace();
            
throw
new
RuntimeException(e);
        
}
    
}
 
HashMap map =
new
HashMap();
                
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

<
script
type
=
"text/javascript"
            
function sendShortMessage(id){
                
var telNum = top.spani;
                
zAu.send(new zk.Event(zk.Widget.$('$testButton'),'onSendMessage',{'':{documentId:id,tel:telNum}})); 
                
return; 
            
        
</
script
>
<
window
xmlns:w
=
"client"
…………>
…………
…………
<
a
label
=
"发送短信"
w:onClick
=
"sendShortMessage('${each.documentId}')"
style
=
"color:red"
></
a
>
…………
…………
<
button
id
=
"testButton"
label
=
"这个按钮用来被js作为zAu通知目标"
onSendMessage
=
"@command('sendMassage',e=event)"
visible
=
"false"
></
button
>

3.3、JS调用ZK服务

客户端JS调用ZK服务也非常简单——通过zAu对象像某个组件发送事件,然后组件声明该事件触发command或服务端listen该事件处理即可;

示例代码如下:

<
script
type
=
"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
>
<
window
xmlns:w
=
"client"
…………>
…………
   
<
a
label
=
"发送短信"
w:onClick
=
"sendShortMessage('${each.documentId}')"
style
=
"color:red"
></
a
>
…………
   
<
button
id
=
"testButton"
label
=
"这个按钮用来被js作为zAu通知目标"
onSendMessage
=
"@command('sendMassage',e=event)"
visible
=
"false"
></
button
>

@Command
    
public
void
sendMassage(
@BindingParam
(
"e"
) Event e)
throws
Exception{
        
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定制与客户端集成的更多相关文章

  1. Zookeeper系列五:Master选举、ZK高级特性:基本模型

    一.Master选举 1. master选举原理: 有多个master,每次只能有一个master负责主要的工作,其他的master作为备份,同时对负责工作的master进行监听,一旦负责工作的mas ...

  2. [置顶] ZK(The leading enterprise Ajax framework)入门指南

    1. Why ZK JavaEE领域从来就不缺少Framework尤其是Web Framework,光是比较流行的就有:SpringMVC.Struts2.JSF系列…… 其它不怎么流行的.小众的.非 ...

  3. [置顶] Android 高级开发 源码 UI 缓存 网络

    1.Android 源码剖析 性能优化  开源代码 2.Android UI效果源码 3.http://mzh3344258.blog.51cto.com/1823534/d-3 4.微信公众平台开发 ...

  4. java高级特性增强

    第4天 java高级特性增强 今天内容安排: 1.掌握多线程 2.掌握并发包下的队列 3.了解JMS 4.掌握JVM技术 5.掌握反射和动态代理 java多线程增强 .1. java多线程基本知识 . ...

  5. [置顶] IIS应用程序池多工作进程设置及Session共享

    [置顶] IIS应用程序池多工作进程设置及Session共享   在调优iis的时候,朋友分享给我一个特别棒的设置方法步骤,感谢好朋友的分享. IIS应用程序池多工作进程设置及Session共享 1  ...

  6. java_day06_java高级特性

    Advance Java Programming 第六章: java语言高级特性(part1) 1.static修饰符 1)static变量 在类中,使用static修饰的成员变量,就是静态变量,反之 ...

  7. 你应该知道的Vue高级特性

    本文使用的Vue版本:2.6.10 Vue为我们提供了很多高级特性,学习和掌握它们有助于提高你的代码水平. 一.watch进阶 从我们刚开始学习Vue的时候,对于侦听属性,都是简单地如下面一般使用: ...

  8. 在UWP中页面滑动导航栏置顶

    最近在研究掌上英雄联盟,主要是用来给自己看新闻,顺便copy个界面改一下段位装装逼,可是在我copy的时候发现这个东西 当你滑动到一定距离的时候导航栏会置顶不动,这个特性在微博和淘宝都有,我看了@ms ...

  9. 自定义置顶TOP按钮

    简述一下,分为三个步骤: 1. 添加Html代码 2. 调整Css样式 3. 添加Jquery代码 具体代码如下: <style type="text/css"> #G ...

随机推荐

  1. 如何删除Oracle数据库

    1>点击开始找Oracle的目录,-->点击[Universal Installer],打开点击[卸载产品] 2>除了oracle_home1 不点外,其他的都勾选. 3>再点 ...

  2. SecureCRT 绝佳配色方案, 保护你的眼睛(转发)

    SecureCRT 绝佳配色方案, 保护你的眼睛 关键词:SecureCRT配色, SecureCRT设置颜色, Linux终端配色,Linux终端颜色设置. 终端有一个好的配色,不仅能保护自己的眼睛 ...

  3. Mvc4.0 提取 Cookie 里的东西

    /// <summary> /// 提取Cookie /// </summary> /// <returns></returns> public sta ...

  4. 网站图片列表动态显示、根据屏幕宽度动态设置DIV的CSS样式

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. ABCpdf.NET中Rect,Bottom,Height的关系

    因为项目需要新功能,要在一个图片的上下加上固定高度的白边如下图.项目中一直使用ABCpdf.NET处理图片,但我一直没有做这方面的功能,所以找来API参考做. 这个简单需求做的过程中出现了一些曲折,主 ...

  6. JSON、XML 解析

    iOS开发--XML/JSON数据解析 不错的文章http://www.jianshu.com/p/a54d367adb2a

  7. 安全的PHP代码编写准则

    原文链接 绝不要信任外部数据或输入 关于 Web 应用程序安全性,必须认识到的第一件事是不应该信任外部数据.外部数据(outside data) 包括不是由程序员在 PHP 代码中直接输入的任何数据. ...

  8. Linux命令之ifconfig

    许多windows非常熟悉ipconfig命令行工具,它被用来获取网络接口配置信息并对此进行修改.Linux系统拥有一个类似的工具,也就是ifconfig(interfaces config).通常需 ...

  9. 幻世(OurDream)2D图形引擎大更新——炫丽粒子特效强势回归!

    本次更新终于让各位期待已久的绚丽粒子系统特效强势回归到幻世当中了.凭借新引擎强大而又高效的绘图,新的粒子系统将比旧有版本(原Ycnd 2D)在性能上有极大幅度的增强,增幅超过十倍! 更强的性能!更好的 ...

  10. JavaScript装逼指南

    如何写JavaScript才能逼格更高呢?怎样才能组织JavaScript才能让别人一眼看出你不简单呢?是否很期待别人在看完你的代码之后感叹一句“原来还可以这样写”呢?下面列出一些在JavaScrip ...