zk框架_ZK Web框架思想

zk框架

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

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

“就是这样”

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个随机线程。

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

有很多文件

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

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

卡在Java 1.4上

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

对ZK内部代码的负面影响

  • ThreadLocals不能通过remove()移除( 调用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)

the ..不可思议的整数让我想起了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

zk框架

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

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

相关文章

一文教你用java实现出租车计价器设计(附下载源码)

导读&#xff1a;在我国&#xff0c;出租车行业是八十年代初兴起的一项新兴行业&#xff0c;随着出租车的产生&#xff0c;计价器也就应运而生。但当时在全国没有一家企业能够生产&#xff0c;因而那个时期的计价器是由台湾引进。台湾是计价器的主要生产场地&#xff0c;目前全…

写论文的思考

以下引自知乎的回答 需要的能力 1.资料检索的能力 2.资料筛选的能力 3.期刊论文的阅读能力&#xff0c;期刊论文和大学部的课本截然不同。大学部的课本是寻次渐进地从最基本的知识背景逐步交代出整套有系统的知识&#xff0c;中间没有任何的跳跃&#xff0c;只要你逐页读下去…

java mongo subtract_春数据MongoDB的聚合框架,例外

组访问计算值&#xff0c;我有旅行的集合&#xff0c;每行有一个的startDateTime和completionDateTime财产。春数据MongoDB的聚合框架&#xff0c;例外我试图使用聚合框架来找到用户的出行的平均持续时间。我的聚集看起来非常简单&#xff0c;但和它抛出一个异常。有以下3个步骤…

一键转发抢红包源码及搭建教程

导读:一键转发抢红包搭建教程如下:源码请在资源模块下载。 搭建教程 第一步注册bmob建立一个项目 项目包括这些表单(file表可以不建立) (应用ID在后台项目设置里面) 表DaSha这样建立 表Sha这样建立 找zi()方法第一步

Java性能教程– Java 8流有多快?

在此JAX Magazine的预览预览中&#xff0c;JAX伦敦发言人Angelika Langer为使用Java流的任何人回答了最重要的问题&#xff1a;它们真的更快吗&#xff1f; Java 8是JDK收集框架的主要新增功能&#xff0c;即流API。 与集合相似&#xff0c;流表示元素序列。 集合支持对单个元…

android 开发

初学者学习 Android 开发&#xff0c;有什么好网站推荐&#xff1f; 前段日子一直在看安卓巴士这个网站&#xff0c;但网站突然进行改版&#xff0c;很多内容都找不到了&#xff0c;一下子怅然若失起来1 条评论 分享按投票排序按时间排序50 个回答 yava&#xff0c;半瓶水fei …

java迭代器删除重复元素_Java中的List删除重复元素

List接口做为Java集合框架中的一员&#xff0c;对数据的操作和处理比数组方便许多。在数组中插入一个元素要从数组的最后一个元素到当前插入的位置依次向后移动一位&#xff0c;然后为插入的位置进行赋值。在数组删除一个元素要从删除元素的下一个元素位置到数组最后一个元素依…

2021Golang技术基础知识及学习路线图

导读:Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。 Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发…

SDWebImage的使用说明

1. 在需要的地方导入头文件 #import "UIImageViewWebCache.h" webCache:网络缓存&#xff0c;几乎目前所有的浏览器都有一个内置的缓存&#xff0c;它们通常利用客户端本地的内存和硬盘来完成缓存工作&#xff0c; 同时允许用户对缓存的内容大小作控制。 这个方法默认…

深入了解区块链技术及其常见误区

导读:区块链是一个信息技术领域的术语。从本质上讲,它是一个共享数据库,存储于其中的数据或信息,具有“不可伪造”“全程留痕”“可以追溯”“公开透明”“集体维护”等特征。基于这些特征,区块链技术奠定了坚实的“信任”基础,创造了可靠的“合作”机制,具有广阔的运用…

ztree java 增删改_Ztree实现增删改查

1.和另一篇文章--[TreeGrid 实现增删改查]前面的内容一致&#xff0c;只需要创建一个html页面&#xff0c;命名为ztree-01.html&#xff0c;粘贴如下网址的代码进入ztree-01.html。访问http://www.treejs.cn/v3/faq.php#_206复制这些代码html> ZTREE DEMO TITLE>HEAD>…

gwt api_使用RequestFactory API进行Spring GWT集成

gwt api从GWT 2.4开始&#xff0c;将RequestFactory API与后端的Spring服务集成很容易&#xff0c;您需要做的就是在服务器上创建一个自定义ServiceLocator&#xff0c;GWT将使用它来正确定位被调用的服务&#xff1a; public class SpringServiceLocator implements ServiceLo…

Android Studio导入项目非常慢的解决办法

问题 Android Studio目前已经更新到2.0 Preview 6了&#xff0c;作为Google大力推崇的开发工具&#xff0c;相对于Eclipse ADT有着不可比拟的优势。然而在实际使用时&#xff0c;依然有不少不爽的地方。Android Studio原生支持使用Gradle来构建项目本是个不错的想法&#xff0c…

AI时代——人工智能技术图谱,它来啦(机器学习+深度学习学习路线)

导读:人工智能是一门极富挑战性的科学,从事这项工作的人必须懂得计算机知识,心理学和哲学。人工智能是包括十分广泛的科学,它由不同的领域组成,如机器学习,计算机视觉等等,总的说来,人工智能研究的一个主要目标是使机器能够胜任一些通常需要人类智能才能完成的复杂工作…

java线程代码实现_Java 实现线程的2种方法的具体代码实例

实现线程的众所周知的方法具体有如下2种&#xff1a;(1)继承Thread类&#xff0c;重写run方法(2)实现Runnable接口&#xff0c;重写run方法然后我做如下具体实例来测试。package com.lxk.threadTest;/*** 线程测试* * Created by lxk on 2016/11/12*/public class ThreadTest {…

编写下载服务器。 第五部分:油门下载速度

在僵尸网络时代&#xff0c;您可以租用几百美元来运行自己的分布式拒绝服务攻击&#xff0c;拥有紧急开关有选择地关闭昂贵的功能或极大地降低性能是一个巨大的胜利。 在缓解问题的同时&#xff0c;您的应用程序仍可运行。 当然&#xff0c;这种安全措施在高峰或工作时间也很有…

高内聚,低耦合——8大核心中间件,微服务基础技术栈技术图谱

什么是微服务? 维基上对其定义为:一种软件开发技术- 面向服务的体系结构(SOA)架构样式的一种变体,将应用程序构造为一组松散耦合的服务。在微服务体系结构中,服务是细粒度的,协议是轻量级的。 微服务(或微服务架构)是一种云原生架构方法,其中单个应用程序由许多松散耦…

java光标移动函数_文件内光标的移动 函数基础 定义函数的三种形式 函数的返回值 调用方式...

# with open(ra.txt, r, encodingutf-8)as f:# data1f.read()# print(>1>:,data1)# print(f.tell()) # 44 只有一种情况下&#xff0c;光标的意思是字符# data2f.read()# print(>2>:,data2) # 第一次有结果&#xff0c;第二次没有&#xff0c;第一次读取数据后光标…

JQuery学习笔记——JQuery基础

#&#xff0c;JQuery避免名称冲突的方法var jq jQuery.noConfilct();jq.ready( function(){jq("p").hidden();});就是为了避免和其他库中$冲突&#xff1b;#&#xff0c;在引用jquery的时候&#xff0c;可以考虑使用google或者微软的cdn的jquery链接&#xff1a;<…

DBA 技能图谱——数据库管理员不在迷茫

导读:DBA一般指数据库管理员。数据库管理员(Database Administrator,简称DBA),是从事管理和维护数据库管理系统(DBMS)的相关工作人员的统称,属于运维工程师的一个分支,主要负责业务数据库从设计、测试到部署交付的全生命周期管理。 目录 DBA 技能图谱 下载地址 DBA 技能…