ZK Web框架思想

我曾多次被要求提出一些有关ZK的意见。 因此,根据我作为ZK用户4年的经验,以下是一些想法:

总体开发人员经验,社区和文档

“就是这样”

ZK提供的大多数东西都能很好地工作,并且如果您以前开发过任何桌面Java应用程序,则使用该功能通常非常直观。 在2007年,我对RIA技术进行了比较,其中包括Echo2,ZK,GWT,OpenLaszlo和Flex。 Echo2和OpenLaszlo感觉不完整且有故障,并且似乎在任何地方都没有适当的Maven工件。 GWT似乎更多是一项技术实验,而不是一个很好的平台。 之所以放弃Flex,是因为缺少了一些重要的Maven工件,并且Flash对应用程序来说是不切实际的要求。 另一方面,ZK感觉到了最“自然”的感觉,因此我很快就收获了很多。 在ZK的4年漫长旅程中,我获得了很多“惊喜”时刻,当我越来越了解ZK并提高了我对框架的架构理解时。

如今,我对ZK中的哪些功能,哪些无效,什么有问题,什么没有有一个很好的了解。 但是,在获得了所有这些好与坏的见解之后,我认为ZK是开箱即用的非常令人印象深刻的产品。 当然,这样做的缺点是该框架对新手来说隐藏了很多东西,以便易于使用,并且其中有些东西以后会咬住您 ,尤其是在您的应用程序具有大量用户的情况下。

非常非常非常灵活

ZK非常灵活,具有很多集成。 您是否要使用声明性标记来构建组件树? 使用ZUL文件。 您要坚持纯Java吗? 使用richlets。 您还可以集成JSP,JSF,Spring,并在zscript中使用多种语言。 核心框架也非常灵活,如果遇到问题,您可以覆盖很多东西。

不利的一面是,有很多正确的做事方法,甚至还有更多的搞砸方法。 灵活性本身并不是负面因素,但是我认为ZK文档并不能指导用户充分了解ZK的最佳实践。 最佳实践是什么? 许多教程都使用zscript,但是由于性能原因,文档也建议避免使用zscript。

论坛非常活跃

我认为ZK论坛是了解ZK的最佳场所之一。 它非常活跃,并且线程从初学者到深层次的技术内容都各不相同。 我几乎每天都会阅读论坛,有时还会帮助人们解决问题。 有一件事情让我有些烦恼:论坛中的英语通常不太好,人们经常问的问题太广泛。 我知道,批评非英语母语人士的作品是不公平的,尤其是当我自己不是母语人士的时候。 无论如何,我认为存在这样的障碍。 例如,从ZK论坛和Spring Web论坛中抽取5个随机线程。

在ZK论坛中看到的主题通常比Spring论坛中的主题更加详细和集中,而不是“ 我是新手,我需要创建具有大量功能的应用程序x,请告诉我如何做所有事情 ”。人们显然会花一些时间来提出良好而详细的问题。 您会看到,您必须在ZK论坛上花费更多时间才能理解这些线程。 这不是任何人的错,也不是坏事,这只是一个观察。 对我来说不幸的是,这意味着我在ZK社区中度过的有限时光只是用来理解人们在说什么。 通常,仅当我立即知道答案或线程涉及一些深层次的技术知识时,才回答线程。

有很多文件

过去,ZK文档分散,过时,并且一些更重要的内容完全丢失。 近年来,文档已经有了很大的改进,并且现在有针对ZK配置 , 客户端ZK和样式的单独综合参考。 我认为今天的文档非常好,通过阅读文档可以轻松回答大多数基本问题。

正如我上面提到的,ZK倾向于“公正地工作”。 总体技术质量令人印象深刻,可与大多数Java Web框架相提并论,但我相信ZK的某些部分不太令人印象深刻。

卡在Java 1.4上

ZK是使用Java 1.4构建的,这极大地限制了其API的灵活性和内部代码质量

对ZK内部代码的负面影响

  • 不能使用remove()删除ThreadLocals (调用set(null)可以防止泄漏所包含的对象,但不能正确删除ThreadLocal)!
  • 许多简单的java.util.concurrent数据结构或对象将在其中运行的自定义同步代码(ConcurrentHashMap,Semaphore,Atomic *等)
  • 在StringBuilder适用的地方使用StringBuffer

没有注解

我个人不喜欢大量使用注释的框架,因为注释是一种语言外的功能,通常您最终会得到基于注释的,基于字符串的,没有类型安全性的值。 但是,我知道有些人会为基于他们的API而高兴。

没有枚举

ZK API中有很多地方,适当的枚举比当前使用的hacks要好得多。 最严重的违规者是Messagebox。 看看这个签名:

public static int show(String message,String title,int buttons,java.lang.String icon,int focus)

嗯..神奇的整数让我想起了SWT(这是一个很棒的API糟糕的库)。 让我们想象一下带有枚举和泛型的替代版本:

public static Messagebox.Button show(String message,String title,Set<Messagebox.Button> buttons,Messagebox.Icon icon,Messagebox.Button focus)

更好,更类型安全。 没有更多的按位或魔术。 如果使用Java 1.5,我可以在10分钟内将其编码到ZK中。

没有泛型

这是卡在Java 1.4上最糟糕的部分。

我只列出一些我想看到泛型的地方:

API签名中的集合值

org.zkoss.zk.ui.util.Initiator中的示例:

void doInit(Page page, Map args);

void doInit(Page page, Map<String, Object> args);

org.zkoss.zk.ui.Component中的示例:

List getChildren();

List<Component> getChildren();

类集合类

ListModel中的示例:

public interface ListModel {...Object getElementAt(int index);...
}

public interface ListModel<T> {...T getElementAt(int index);...
}

所有ListModel *类也应该是通用的(大多数扩展java.util.Collection)。
org.zkoss.zk.ui.event.EventListener

public interface EventListener {public void onEvent(Event event);
}

public interface EventListener<T extends Event> {public void onEvent(T event);
}

org.zkoss.zk.ui.util.GenericAutowireComposer

public class GenericAutowireComposer {protected Component self;...
}

public class GenericAutowireComposer<T extends Component> {protected T self;...
}

所有* Renderer类
org.zkoss.zul.RowRenderer中的示例:

public interface RowRenderer {void render(Row row, Object data);
}

public interface RowRenderer<T> {void render(Row row, T data);
}

令人印象深刻的服务器推送实现

默认的PollingServerPush具有延迟,如果有许多活动用户,它将绝对杀死您的应用程序服务器。 CometServerPush更好,但是它不使用非阻塞IO,并且会阻塞servlet容器中的servlet线程。 让我们对此进行透视:

Tomcat 7.0的默认配置将连接器的最大线程数设置为200。这意味着,如果您有200个启用了彗星的桌面,则Tomcat将停止响应其他请求,因为彗星正在使用所有线程。 如果该实现使用的是Servlet 3.0或特定于容器的异步API,则即使只有一个线程,您也可以运行Tomcat。 这当然会很慢,但不会停止工作!
同样,CometServerPush需要ZK EE,因此普通用户会陷入PollingServerPush的困境。 考虑到服务器推送的营销方式,这是一个很大的限制。 但是,这并不奇怪:正确的非阻塞彗星很难实现,并且在从浏览器到servlet代码的所有过程中都需要非阻塞组件。

脚本

我不喜欢zscript。 许多年前它可能是一个不错的功能,但我认为今天完全不应该使用它。 为什么,为什么有人要用混合了ZUL模板的未经类型检查的zscript替换类型安全的已编译Java代码?

  • “我可以使用Python / Ruby /…”。 对于某些人来说,这可能是一个正确的观点,但是您最终将在ZUL模板中处理无法维护的代码
  • “保存文件时更改可见”。 是的,但是我永远不会为此功能付出太多。 此外,使用JRebel可以获得类似的效果。

因此,如果在zscript中放置“ Java代码”(= BeanShell代码),则可能需要重新考虑。

依靠反思

许多有用的功能都依赖于反射,这限制了编译器可以为您检查的内容。 在许多Java库/框架中,这是非常典型的事情,因此,它并不是ZK特定的事情。 作为一个Scala用户,我可以看到Java的局限性如何将大多数框架引导到反射/注释的路径。 反射总是不能避免的,但是我认为如果大多数有用的功能都依赖反射,这是一个不好的信号。 这是ZK中使用反射的一些功能:

  • 任何不使用component.addEventListener的事件侦听。 这包括扩展GenericEventListener的所有类(例如,除MultiComposer之外,所有ZK提供的Composer类)
  • 数据绑定
  • ZUL模板中的EL表达式

参考: 关于ZK Web框架的 想法 :总体经验和关于ZK Web框架的想法: Jawsy Solutions技术博客上 JCG合作伙伴 Joonas Javanainen的技术资料

相关文章 :

  • SmartGWT入门,提供出色的GWT界面
  • 高级SmartGWT教程,第1部分
  • 使用Spring Security保护GWT应用程序
  • GWT EJB3 Maven JBoss 5.1集成教程
  • Spring MVC3 Hibernate CRUD示例应用程序
  • Spring MVC开发–快速教程

翻译自: https://www.javacodegeeks.com/2012/01/zk-web-framework-thoughts.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373872.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OC第一讲:类和对象

今天终于开始进行OC的学习了 一.首先讲了NSLog NSLog是oc里面的输出语句&#xff0c;其用法和printf差不多&#xff0c;但是还是有差别的 1&#xff0c;NSLog是自动换行的&#xff0c;不用像printf那样还需要加\n&#xff1b; 2&#xff0c;NSLog在引号面前需要添加符号&#x…

【转载】关于 Google Chrome 中的全屏模式和 APP 模式

【来源于】新浪微博&#xff1a;阿博 http://www.cnblogs.com/abel/p/3235839.html 全屏模式&#xff1a;kiosk 默认全屏打开一个网页呢&#xff0c;只需要在快捷方式中加上 --kiosk [url] 就可以了。 关于全屏模式&#xff1a; 1、全屏模式下&#xff0c;广告插件&#xff08;…

PL/SQL Developer跑在Oracle 64位数据库上初始化错误

安装完Oracle(64位)、PL/SQL Developer后运行PL/SQL出现如下的错误&#xff1a; 网上查资料说&#xff0c;我的PL/SQL Developer与ORACLE不兼容&#xff0c;即PL/SQL不支持64位的ORACLE&#xff0c;因此得下一个32位的ORCALE客户端并配置相应的参数&#xff1a; 解决步骤小记&a…

gis 联合 融合_GIS技术进化 | 我们为何需要跨平台GIS技术体系?

10月30日&#xff0c;超图在2019 GIS 软件技术大会上发布了SuperMap GIS 10i系列产品。SuperMap GIS 10i全面融入人工智能(AI)技术&#xff0c;创新并构建了GIS基础软件“BitCC”五大技术体系&#xff0c;即大数据GIS、人工智能GIS、新一代三维GIS、云原生GIS和跨平台GIS&#…

Spring陷阱:代理

作为Spring框架的用户和发烧友多年&#xff0c;我遇到了一些关于此堆栈的误解和问题。 另外&#xff0c;在某些地方抽象非常可怕地泄漏&#xff0c;以便有效&#xff0c;安全地利用开发人员需要意识到的所有功能。 这就是为什么我开始Spring陷阱系列的原因。 在第一部分中&…

UVa11925 Generating Premutations

留坑(p.254) 1 #include<cstdio>2 #include<cstring>3 #include<cstdlib>4 #include<algorithm>5 #include<iostream>6 7 using namespace std;8 9 void setIO(const string& s) { 10 freopen((s ".in").c_str(), "r&qu…

xamarin UWP中MessageDialog与ContentDialog的区别

MessageDialog与ContentDialog的异同点解析&#xff1a; 相同点一&#xff1a;都是uwp应用上的一个弹窗控件。都能做为弹出应用。 相异点一&#xff1a;所在命名空间不同&#xff0c;MessageDialog在Windows.UI.Popups.MessageDialog下&#xff0c;而ContentDialog在Windows.UI…

python筛选大量数据_python(数据筛选)

在Python3中&#xff1a;(1)xrange的功能合并到range里面&#xff0c;xrange已经不存在 -> range和xrange用法(2)filter已经不能返回一个list&#xff0c;而是只能返回一个迭代对象&#xff0c;需要套在一个list()里面&#xff0c;且&#xff0c;需要注意的是&#xff0c;fi…

ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务

不指定数据库可以正常连接&#xff1a; 指定数据库和使用PL/SQL Developer都出现错误&#xff1a; 在此说明一下我的环境&#xff1a;Oralce装的是64位的在使用PL/SQL Developer时曾出现过初始化错误&#xff0c;解决办法就是下载oracle 32位客户端并相应的配置。 解决方案一&a…

Devoxx 2011印象

Devoxx 2011结束了&#xff0c;它很棒。 最终&#xff0c;在不得不与妻子和孩子度过周末之后&#xff08;上个星期我很少见过&#xff09;&#xff0c;我找到了写下一些东西的时间。 对我来说&#xff0c;这是第六个Devoxx&#xff0c;我的第一个是2006年-那时我还是一个学生&a…

Ubuntu14.04.3,apt-get出现dpkg: error processing package xxx (--configure)和cups-daemon错误的解决方案...

Ubuntu14.04.3&#xff0c;使用apt-get安装软件的时候&#xff0c;报个莫名其妙的错误&#xff1a; dpkg: error processing package xxx (--configure): balabala...Errors were encountered while processing: cups-daemon cups-core-drivers cups E: Sub-process /usr/bin/d…

实验三 类的继承和多态性

实验三 类的继承和多态性 1.(1)编写一个接口ShapePara&#xff0c;要求&#xff1a; 接口中的方法&#xff1a; int getArea()&#xff1a;获得图形的面积。int getCircumference()&#xff1a;获得图形的周长 (2)编写一个圆类Circle&#xff0c;要求&#xff1a;圆类Circle实现…

ORA-01843:无效的月份

Oracle数据库默认情况下&#xff0c;会以DD-MON-YY的形式显示日期&#xff0c;其中DD是天数&#xff0c;MON是月份的前三个字母&#xff08;大写&#xff09;&#xff0c;而YY是年份的最后两位。数据库实际上会为年份存储4位数字&#xff0c;但是默认情况下只会显示最后两位。 …

贪心策略取得最优解的条件_什么是贪心算法?

一、什么是贪心算法贪心算法是指&#xff0c;在对问题求解时&#xff0c;总是做出在当前看来是最好的选择。(局部最优解&#xff0c;而不是整体最优解)贪心算法没有固定的算法框架&#xff0c;算法设计的关键是贪心策略的选择。必须注意的是&#xff0c;贪心算法不是对所有问题…

Devoxx第1天

参加Devoxx给我带来了足够的动力来发布我的第一篇博客文章。 我是第一次来这里&#xff0c;它的组织方式给我留下了深刻的印象。 目前有记录的最高发言人。 对我来说&#xff0c;选择演示文稿来参加是一个问题。 但是感谢组织者&#xff0c;所有活动都将在12月下旬在parleys.co…

Oracle 事务的开始与结束

事务是用来分割数据库活动的逻辑工作单元&#xff0c;事务即有起点&#xff0c;也有终点&#xff1b; 事物的处理就是保证数据操作的完整性&#xff0c;所有的操作要么成功要么同时失败。当下列事件之一发生时&#xff0c;事务就开始了&#xff1a;连接到数据库上&#xff0c;并…

http tcp联系区别

术语TCP/IP代表传输控制协议/网际协议&#xff0c;指的是一系列协议。“IP”代表网际协议&#xff0c;TCP和UDP使用该协议从一个网络传送数据包到另一个网络。把IP想像成一种高速公路&#xff0c;它允许其它协议在上面行驶并找到到其它电脑的出口。TCP和UDP是高速公路上的“卡车…

python控件随窗口变化而适配_Tkinter窗口/控件比例调整

我目前正在为一个编程类开发一个pythongui版本的Reversi。我已经对游戏逻辑进行了编程&#xff0c;目前我正在尝试使用Tkinter实现GUI。我有一些问题&#xff0c;调整游戏板(根窗口)和它的一切(画布和形状)成比例。这款游戏目前还不错&#xff0c;但我试图让棋盘正确调整大小的…

Java递归基础

对于那些不知道递归是什么的人&#xff08;并且像个笑声一样&#xff09;&#xff0c;请单击以下链接&#xff1a;Google搜索&#xff1a;递归&#xff0c;然后单击“您的意思是……”项。 希望您终于弄清楚了递归是指其自身的任何内容&#xff08;如果不是&#xff0c;那么您可…

我是最棒的,我一定会成功!

有人曾经做过这样一个实验&#xff1a;他往一个玻璃杯里放进一只跳蚤&#xff0c;发现跳蚤立即轻易地跳了出来。再重复几遍&#xff0c;结果还是一样。根据测试&#xff0c;跳蚤跳的高度一般可达它身体的400倍左右&#xff0c;所以说跳蚤可以称得上是动物界的跳高冠军。     …