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.pswp.cn/news/373872.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373872.shtml
英文地址,請注明出處:http://en.pswp.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;所以說跳蚤可以稱得上是動物界的跳高冠軍。     …