ZK 3.0

Released on November 6, 2007.

Download Now

Getting Simpler and Richer

New Feature Highlight

  • The performance of ZK is much improved - four ~ five times faster than ever!
  • Server push is enabled which allows you to update client’s information actively and the usage is simple and intuitive.
  • The ZK layout component which simplifies the job of UI designer.
  • Customize layout of ZK components using CSS definitions.
  • Add forward and apply properties to realize MVC approach more easily.
  • SimpleListModelSharer - integrates server push and ListModel allows you to update data of clients based on the same data automatically.
  • New expression of annotation is ease of use, and easy-to-read.
  • TreeModel is introduced which simplifies the job of Tree rendering.
  • Flash components allow you to play audio and video files. (including youtube clip)
  • Native namespace is implemented to speed up the performance while integration with HTML.
  • To speed up the performance of ZK, EL evaluator is pluggable, and a new way to render ZK components is introduced.
  • More integration with other frameworks, ZK has integrated with JSF, JSP, and Ext-JS.
  • See also New Features of ZK 3.0.

Feature Updates

  • 87 XUL and 83 HTML off-the-shelf components.
    • Tabbox, grid, listbox, tree, menu, combobox, bandbox, datebox, chart, hbox, vbox, window, slider, paging, audio, image, timer, include, iframe...
    • Drag-and-drop supported by all components, such that users can drag components and drop them to any other or particular set of components.
    • Context menus and customizable tooltips supported by all components, such that a menu or any popup appears when user click, right-click or move the mouse over a component.
    • Customizable sorting of listbox, grid and children of any component with 100% Java codes (java.lang.Comparator).
    • Auto-completion for combobox.
    • Load on demand with writing Java codes.
    • Live data for listbox.
    • Grids, listboxes and trees with sizable columns.
    • All components are cloneable and serializable.
    • Validation and formatting for any input components, such as regular expression and $#,##0.
    • 100% Java API of Google Maps, FCKeditor, DOJO, and Timeline components.
  • Event-driven, server-centric model
    • More than 20 events are supported: onChange, onChanging, onScroll, onSelect, onShow, onZIndex...
    • All events are processed at the server. No hurdle to communicate between clients and servers.
    • All events are synchronized. No racing condition to worry about.
  • ZK User-interface Markup Language (ZUML).
    • Rich user interface could be designed in ZUML as simple as authoring HTML pages.
    • Powerful yet intuitive control flow by the if, unless and forEach attribute.
    • Scripting in EL expressions and your favorite scripting languages, include but not limited to Java, JavaScript, Ruby and Groovy.
    • Hot changes and updates without restarting your Web applications.
    • Annotations that allow a page to acess database with zero Java codes.
  • Browser history management.
    • Add states to browser's back button history. Then, users can bookmark and use the back and forward button to navigate different states of the same ZK desktop.
  • Simple yet boundless component model.
    • Macro components. Developing a full-feature new component by using another ZUML pages.
    • Inheritable customization. Developing a new component by extending existent components.
    • Seamlessly and easily to encapsulate pure-client components as ZK components with 100% Java API.
    • Customizing components with pre-compiled Java classes, or by scripting in your favorite scripting languages, include but not limited to Java, JavaScript, Ruby and Groovy. The choice is yours.
  • Simple yet flexible threading model.
    • Thread-safe component handling.
    • True server-side Modal dialog.
    • Suspend and resume event listeners freely.
  • 100% Customizable User-Interface factory.
    • Loading ZUML pages not only from Web contents but also any repository such as database.
    • Customizing the features of sessions, desktops and pages.

What's New

  • New Features:
    • 1819982: Support the apply attribute to seperate view and controller
    • 1820406: Support the xel-method directive to load method dynamically
    • 1820771: Make ZK independent of JSP
    • 1817685: A way to use CSS to customize tree's icons
    • 1823850: A way to use CSS to customize focused listitem/treeitem
    • 1824507: A way to customize the slider's look with CSS
    • 1823856: A way to change theme uri dynamically
    • 1823965: A better way to do disable-default-theme
    • 1732886: Scroll Listbox on Selection
    • 1817456: Full Support ZK layout Theme
    • 1765212: Annoying sellection during drag-drop
    • 1755433: Complex column heading
    • 1707513: Provide Complex Header in Grid/Listbox/Tree
    • 1819879: Windows allows developers to change the style class
    • 1823553: Groupbox allows developers to change the style class
    • 1820434: A way to use CSS to customize splitter's icons
    • 1820463: A way to ignore exception in Initiator's doCatch
    • 1820519: A way to stop the processing an event in EventThreadInit
    • 1739579: Tabbox supports disabled tabs
    • 1823206: Menuitem's checked icon/separator customizable by CSS
    • 1822158: Add getParentItem to replace deprecated getTreeitem
    • 1823959: Grid failed to re-sync model (Opera/IE/IE7)
    • 1824402: A way to close popup manually
    • 1787513: Translate messages to Hungarian. Thank Andreas Klein (andiklein@idatso.com) for his contribution.
    • 1579332: Server Push
    • 1776116: A way to forward event to another component w/o programming
    • 1774559: Introduce the native namespace to speed up the handling of HTML
    • 1780018: A way to specify the namespace of native components
    • 1780020: Support to generate XML output directly
    • 1765987: Add timebox (by merge timebox from zkforge to zul)
    • 1758837: ZK Flash Component
    • 1537229: Treemodel for Tree
    • 1786163: A way to make EL evaluator pluggable
    • 1786165: Provide MVEL plug-in
    • 1788194: A way to specify a class mold for rendering a component
    • 1787604: A way to import classes for EL evaluator, such as MVEL, OGNL
    • 1760212: A simpler way to annotation a component
    • 1760689: Data Binding using new simpler annotation to component
    • 1760691: DataBinder support validation phase
    • 1776269: Comboitem supports description in HTML raw content
    • 1638395: Timer component and Session timeout
    • 1771412: DSP TLD shall support tag uri
    • 1780301: Performance measurement of ZK applications
    • 1765119: Authentication & AU Http Status Code Handling
    • 1753222: A way to assign text to a property instead of child component
    • 1758761: A way to attach a root component before another one
    • 1751674: WebApp retrieves the major/minor version from getVersion
    • 1752559: The script component shall support the content property
    • 1752569: The style component shall support the content property
    • 1752431: Change the modifier of addMoved in AbstractComponent
    • 1753168: nextComponentUuid shall be called as late as possible
    • 1759278: A way to get the request path of desktop
    • 1766020: Icon of datebox shall be configurable (like combobox)
    • 1760850: DHtmllayoutServlet.process() as protected
    • 1766667: DataBinder support multiple save-when events
    • 1769025: Move isAsapRequired from HtmlBasedComponent to AbstractComponent
    • 1769792: Component add onPageAttached and onPageDetached
    • 1767347: DesktopCleanup shall called before UiEngine.desktopDestroyed
    • 1770594: Tab: use class instead of hardcode background in style
    • 1770613: Groupbox: use class instead of hardcode background in style
    • 1770614: Slider: use class instead of hardcode background in style
    • 1771384: a way to add xmlns on generated tag
    • 1772915: Desktop supports getPageIfAny
    • 1775445: DSP Loader supports the compress option (like ZK Loader)
    • 1760203: expiration time of events execution in UiEngineImpl
    • 1776006: Slider supports value submitting in form
    • 1776007: Calendar supports value submitting in form
    • 1780078: A way to map an extension to a language
    • 1780128: shall support contentType
    • 1780111: A way to specify DOCTYPE that will be generated to the client
    • 1780804: A way to allow the client to cache the output
    • 1782250: Performance improve: don't go thru Web container if incl ~./
    • 1765212: Avoid annoying selection during drag-drop
    • 1789258: A way to configure the cache of the event methods
    • 1789830: A way to decouple Caption assumes LEGENG if default mold
    • 1791353: Tabbox adds a simpler look
    • 1441351: zebra colors for listbox
    • 1792877: Tab and gbox's default height shall be configurable with CSS
    • 1777430: Add getNextSibling/getPreviousSibling to Component Interface
    • 1678806: Allow comboitems to carry a value payload
    • 1800058: Provide align property for Box component
    • 1802860: New improved translation to the the Catalan language
    • 1803181: Change the modifier of org.zkoss.zul.Utils
    • 1803253: Provide a simply layout component for ZK
    • 1803964: Label's hyphen shall apply maxlength to each line
    • 1806058: Listbox.selectedIndex should be setup default databinding
    • 1811241: A way to access Execution in DesktopInit
    • 1811274: A way to access Execution in IdGenerate.newDesktopId
    • 1811281: A way to access Execution in IdGenerator.newPage
    • 1811700: XUL box model: align and pack
    • 1796284: MVEL easy way to access Resource Labels
    • 1813503: A way to acess component being created in doAfterCompose
    • 1803419: Providing schema definitions of 3rd-party components
    • 1794409: Treerow need add onMouseover event
    • 1487212: A way to intercept events
    • 1773607: Provide pluggable OGNL expression evaluator
    • 1733589: get uploaded Media as InputStream regardless of its MIMEtype
    • 1815594: A way to plugin a class to determine the encoding of upload
    • 1815523: A way to show Popup manually
    • 1779346: Messagebox : change default focus
  • Bug fixes:
    • 1814702: ZK layout Fails to Resize
    • 1816970: Splitter bar shall extends when size change
    • 1816982: IE6 only. Splitter in 3d groupbox. Close then Open.
    • 1816976: The contents shall resize when splitter collapse
    • 1536301: Combobox bugged when in position:fixed container in IE
    • 1817636: hbox overlaps the adjacent cells
    • 1817627: Pageable sortable Listbox hides content when sorted
    • 1818331: No zebra color in paging mold.
    • 1818382: Vbox and Hbox isn't padding between its neighbor.
    • 1818500: IE Cache Problem.
    • 1818804: FF Only. ZK layout OnMouseOver Efect
    • 1819037: Grid & Tree columns in ZK RC2
    • 1819174: Listceel no more consider style
    • 1820433: The selection is disabled wrongly.
    • 1821912: Close Btn of Tab doesn't highlight when mouse over it
    • 1819220: IE 6 SP 2 Only. ZK layout
    • 1822517: FF only. Listbox syncModel not working correctly
    • 1818985: Treerow doesn't fire onDoubleClick
    • 1821517: Nested components and children setVisible method
    • 1822720: Menu highlight doesn't disappear after clikc (IE only)
    • 1823190: The zebra color of listbox show up very show in IE
    • 1822564: Column can not resize by drag correctly
    • 1822566: Column set Width doesn't work correctly
    • 1822585: Grid:onColSize event.getColIndex() alwyas return 1
    • 1823240: Location of tree's paging icons is wrong (RC2 only)
    • 1822643: Tree setPageSize causes wrong active page of treechildren
    • 1819318: ListModelSet not work when use SortedSet as its inner Set
    • 1823207: ListModelMap not works when use SortedMap as its inner map
    • 1727873: Grids with width="100%" inside a vbox have artifacts
    • 1822727: Listbox/tree selection bug when toggle multiple
    • 1822655: Gird: column and row doesn't align when set spans
    • 1823510: If loading a page when the server starts, it sometime NPE
    • 1823229: Splitter- The image of bar isn't updated
    • 1823226: Splitter- The bar can be dragged over hbox
    • 1823213: Listbox in hbox
    • 1823832: Mask show up slowly when doModel in FF Linux
    • 1823354: Listbox's content is fixed while vflex = true
    • 1823802: Scroll-bar show up when click the last item in Listboxes
    • 1823805: Button in a info window is incomplete.(IE7)
    • 1823218: Tree with vflex, body grows over boarder.
    • 1823858: Splitter- hbox in vbox
    • 1823815: Can't add items in Mixed with HTML elements(Safari)
    • 1823814: Listbox cannot display normally (Safari)
    • 1823812: Side-menu will always jump to the top(Safari)
    • 1823810: Borderlayout: "25%" areas are not displayed in Safari
    • 1823809: Splittered areas are not normally displayed (Safari)
    • 1823807: File Download doesn't work in Safari.
    • 1823278: Listbox selection upper bound index is -1
    • 1823213: Listbox in hbox right side bound is gone
    • 1823236: Listhead gone when add Listitem via ListModel
    • 1823946: Listbox update make IE6 freezed
    • 1823921: Listbox crashed with complex Header
    • 1823357: auxHeader(IE)- Can not change rowspan dynamically
    • 1824832: Errors in zul.xsd
    • 1825812: Tab of Tabbox is shrunk after operations, FF only
    • 1825821: layoutRegion.setOpen(boolean); is failed on ZK layout
    • 1718572: Popup windows alignment problems with table inside
    • 1822575: Change window's height, component won't resize
    • 1824580: Listbox flickers when sorting with paging mold
    • 1820180: problem with resizing
    • 1826517: A wrong calculation width when listhead is invisible
    • 1826606: A wrong calculation width when listheader is invisible
    • 1826101: Listbox size problem with paging mold
    • 1797527: malformed zul.xsd
    • 1801028: Failed to include ZUL located in classpath
    • 1798123: DHtmllayoutPortlet.handleError throws exception in Pluto
    • 1802187: zcommons-el 3.0.0-RC missing from Maven repo
    • 1802487: Custom error page not loaded if failed to load classpath URL
    • 1804356: NullPointerException in databinder using access load
    • 1806741: Log does not work correctly
    • 1806831: Resizing header is wrong for Gird, Tree, and Listbox
    • 1487289: Menubar in a grid is covered by another grid (FF only)
    • 1676365: Drag'n'Drop Problem on Opera
    • 1577997: tabbox overflow error
    • 1807361: Problem with slider in a scrolled grid
    • 1806152: listbox fail to update when model's size is zero (IE only)
    • 1808433: ZK layout with center always loads twice on FF
    • 1799602: The popup of combox/datebox out of position in IE
    • 1810142: Component.containsVariable failed if used in nest windows
    • 1808035: ZK layout vs Modal Windows
    • 1794296: fckeditor: onchange event issue
    • 1804858: Toolbarbuttons in window caption without separating space
    • 1811352: slider/calendar/tree doesn't post value if form.submit()
    • 1812001: A scrollbar shows wrong in IE6&7
    • 1692556: IE6 &7 drag performance becomes slower with Tree&ListBox
    • 1807414: listbox/grid: setModel shall clean the current content
    • 1797140: OnClick+OnDoubleClick on the same comp onDoubleClick ignored
    • 1664661: Popups rendering behind portlet windows in IE
    • 1812154: A wrong drag-position when the cursor moves on the header
    • 1813055: Multiple listboxes with same selectedItem causes NPE
    • 1813060: AbstractTag.clone() causes NPE
    • 1813271: Data binding generates duplicate ids in grids/listboxes
    • 1813278: Annotations do not work with xhtml tags
    • 1814259: Failed to include a classpath-based resource with param
    • 1814298: Memory Leak in EventThread
    • 1814819: Variable instance doesn't be gc in first zscript(bean shell)
    • 1814838: The last desktop of a zul,with EL in it, will not be gc.
    • 1815074: Server Push stoped after reload by F5 twice in IE6
    • 1814931: Media get wrong result when uploaded a big text file.
    • 1815480: Session timeout with server push causing NPE
    • 1815513: Paging should not post a onPaging event when setPageSize
    • 1656101: Resizing listview columns doesn't work properly with opera
    • 1711480: resizable columns causes grid/listbox display error
    • 1712708: Grid column size
    • 1726038: Grid sizable bug
    • 1813722: Wrong grid column width
    • 1815482: Problem With Hidden Listbox and Rows
    • 1815633: Desktop doesn't be expunged when # of desktop > max desktop per session.
    • 1755342: Defining Meta Tags with keywords
    • 1815882: Tree vflex is broken without treecol
    • 1605061: alert freeze only half page
    • 1816205: setVParent bug in modal window
    • 1816372: Messagebox depends on BeanShell
    • 1816666: ZK layout splitter disappears in its nightbor width
    • 1816451: In ZK Popup window demo, popuped window cann't move outside
    • 1816436: The scroll bar is disappear in ZK demo, IE 6
    • 1816892: If popup the same menu twice, the second time's offset wrong
    • 1751603: zk.renType in common.js not handling sessionid
    • 1752477: combobox in groupbox and vbox failed to pos button (IE only)
    • 1753712: Detaching component in DesktopCleanup causing IllegalStateException
    • 1753216: ZUL Tree onOpen vs Page Size
    • 1753269: Inproper deleting rows from grid with live data
    • 1755235: zkplus doesn't work with Java 1.4
    • 1755843: if/unless not working for onClick events
    • 1757607: Failed to open two or more treeitem of the same tree
    • 1759419: Path.getRequestPath returns "" if generated by zkFilter
    • 1761686: Failed to reposition grid foot
    • 1769047: Fail to data binding listbox with nested attributes
    • 1765819: Combobox.setReadonly(boolean) doesn't work
    • 1766244: IE only (6.0, 7.0): Combobox arrows render outside grid
    • 1773652: Error message for non-existent zs fie is wrong
    • 1773575: button href attribute with "#" character leads to js-loop
    • 1768343: zk-2.4.1 - annotations not available at constructor
    • 1773902: OpenSessionInViewListener not properly close Hibern. Session
    • 1774432: Bug in adding treeitem to tree's first-level treechildren
    • 1775339: getWriter() has already been called while use forward
    • 1775051: Listbox multiple select and databinding issue
    • 1778258: EL cause nullpoint when createComponent or fulfill
    • 1778320: Grid/listbox/tree don't support scrollTop well
    • 1777696: Richlet served error page fails
    • 1770144: Memory Leak in AImage
    • 1783363: Unable to drag a listitem out of the box (IE only)
    • 1786348: Failed to include two ZUL files
    • 1789211: French translation errors
    • 1786154: forEachStatus.previous.index fail to set inner forEachBegin
    • 1786082: tab - onClick not fired
    • 1780044: Dynamically created tab box not shown properly in Firefox
    • 1785457: SpringTransactionSynchronizationListener requires Hibernate3
    • 1771810: Incorret display of a datebox calendar inside a popup
    • 1760140: Comboitem error in overlapped windows
    • 1789428: ON_DROP event not fired on imagemap (FF and Safari only)
    • 1757257: Bandbox dtid is null in Firefox with Liferay
    • 1791498: Visual effect of tab's width incorrect if select large panel
    • 1758638: Trunked filename when Filedownload
    • 1792403: Listbox/combobox use class instead of style to style onmouseove
    • 1756589: Updated Listitem cannot be select in IE after a few seconds
    • 1719826: Listbox componet disapear
    • 1760929: Overlapped windows can't be created in not visible container
    • 1793044: Returns wrong value from Utils.intsToString()
    • 1775014: Grid Size Growing After SetModel
    • 1755847: Overlapped window owned by popup closes both when closed
    • 1756559: Listbox ("select" mold) mouseless selection (FF only)
    • 1731646: error-popup not visible
    • 1694095: Combobox list vertical position
    • 1765047: tabbox not rendering well with percent width

Upgrade Notes

  • The pageContext variable in EL expressions becomes an instance of org.zkoss.web.servlet.xel.PageContext
  • Initiator's doCatch() now returns a boolean to indicate whether to ignore the exception.
    Note: it is backward compatible that you don't need to re-compile your codes
  • In zk.xml, disable-default-theme is replaced with disable-theme-uri.
  • EventThreadInit's init() now returns a boolean to indicate whether to continue the processing of the event.
  • Throws an exception in EventThreadResume's afterResume() will stop the execution.
  • The look of a tree is now customizable by use of CSS. Refer to Java API.
    The icon-uri, icon-width and icon-height attributes are no longer used
  • The way to customize the zebra color (striping) of grid is changed. ZK 3.0 uses dual class names, grid and odd, to provide the style instead of renaming the class name to grid-od. Note: odd is the default value returned by getOddRowSclass(), which is customizable. Example,
    
    tr.odd td.gc {
      background: yellow;
    }
    
  • The way to customize a grid not to stripe rows is changed:
    
    <grid oddRowSclass="none">
        
  • el-config (of zk.xml) is replaced with xel-config, and the class must implement org.zkoss.xel.ExpressionFactory instead of javax.servlet.jsp.el.ExpressionEvaluator.
  • org.zkoss.zk.scripting.VariableResolver is removed. Use org.zkoss.xel.VariableResolver instead.
  • EL expressions specified in lang.xml and lang-addon.xml need to specify self to access a property.
  • org.zkoss.zk.scripting.Method is deprecated Use org.zkoss.xel.Function instead.
  • Page.getZScriptMethod() is deprecated. Use Page.getZScriptFunction() instead.
  • The onTimer event won't keep the session alive. To make it behave the same way as old versions, you can specify
    
    <session-config>
      <timer-keep-alive>false</timer-keep-alive>
    </sesion-config>
     
  • The signature of PageCtrl's init method is changed.
  • The signagure of ComponentInfo's applyProperties is changed
  • Utilities of JSP, such as JspLoaderServlet, are removed, since they are nothing to do with ZK
  • The signature of LanguageDefinition's contructor is changed.
  • About directives: New name are introduced though it is backward compatible with old versions: The component directive mold-name is renamed to moldName mold-uri is renamed to moldURI macro-uri is renamed to macroURI The page directive: script-language is renamed to scriptLanguage
  • About zk.xml: The disable-behind-modal, keep-across-visits, processing-prompt-delay and tooltip-delay elements are moved to the client-config element, though you still can specify them under the desktop-config element (because of the backward compatibility)
  • Device is shared by all desktops. The init method is changed. It is better to derive from org.zkoss.zk.device.GenericDevice.
  • If the hyphen property of label is true, it means the maximal allowed length of each line, rather than each word.