В этом посте я хотел бы рассказать об очень интересной разработке фреймверке ZK.
ZK это UI фреймверк, который позволяет создавать удивительные веб- и мобильные приложения без необходимости изучать JavaScript или AJAX.
Это перевод, оригинал статьи — http://books.zkoss.org/wiki/ZK_Getting_Started/Learn_ZK_in_10_Minutes
Создание пользовательского интерфейса с ZK достаточно легкий и удобный процес, достаточно комбинировать и смешивать из сотен компонентов, которые у вас всегда “под рукой”. Вы можете быстро создать собственный пользовательский интерфейс с различными компонентами ZK. Стиль каждого компонента, поведение и функции могут быть настроены в соответствии с вашими желаниями.
ZUL, легко читаемый язык в формате XML, используемый для описанной выше формы регистрации.
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 | <window border="normal" width="400px" style="padding-top:20px;padding-left:20px;" title="Welcome! New User"> <grid hflex="1"> <auxhead> <auxheader colspan="2" label="Registration Form" style="font-size:16px" image="../images/picture.png"/> </auxhead> <columns/> <rows> <row> User Name <textbox id="nameBox" hflex="1" constraint="no empty"/> </row> <row> Gender: <radiogroup id="genderRadio"> <radio label="Male" value="male" image="../images/male.png" checked="true"/> <radio label="Female" value="female" image="../images/female.png"/> </radiogroup> </row> <row > Birthday <datebox id="birthdayBox" hflex="1" constraint="no empty, no today, no future"/> </row> <row spans="2" align="center" > <hlayout> <checkbox id="acceptTermBox"/> Accept Term of Use </hlayout> </row> <row spans="2" align="right"> <hlayout> <button id="resetButton" label="Reset" /> <button id="submitButton" label="Submit" disabled="true"/> </hlayout> </row> </rows> </grid> </window> |
ZK также позволяет создавать пользовательский интерфейс программно также, как вы можете использует Java Swing в Richlet [8].
ZK компоненты пользовательского интерфейса, как строительные блоки, можно комбинировать, смешивать или наследовать и вносить их в новые компоненты для выполнения различных задач. Эта универсальность увеличивает повторное использование кода и модульность приложения [9].
ZK является компонентно-базовым фреймверком такой модель программирования, как управление событиями. Поэтому разработчики добавляют новые функции для ответа на события компонентов, которые вызваны взаимодействием пользоватей.
Для управления пользовательским интерфейсом, во-первых, вам нужно реализовать класс контроллера, который наследует SelectorComposer ZK[1] для ZUL. Затем, вы можете получить UI компоненты Java объекта путем аннотирования @Wire к переменным элементам контроллера. После этого, вы можете контролировать и управлять пользовательским интерфейсом, путем доступа к этим аннотированный переменным элементам.
1 2 3 4 5 6 7 8 9 10 11 12 | package foo; // some import statements are omitted for brevity. public class RegistrationComposer extends SelectorComposer { @Wire private Button submitButton; @Wire private Checkbox acceptTermBox; } |
Мы можем использовать контроллер, чтобы контролировать наши компоненты пользовательского интерфейса, указав атрибут «apply» в ZUL.
1 2 3 4 | <window border="normal" width="400px" style="padding-top:20px;padding-left:20px;" title="Welcome! New User" apply="foo.RegistrationComposer"> <!-- omit other components for brevity --> </window> |
Примечание:
Одной из особенностей применения регистрационной формы выше, является то, что «Submit» кликабельна только тогда, когда пользователь включил чекбокс «Term of use».
Сначала кнопка «Submit» не активна, когда чекбокс «Term of use» не включен.
После включения чекбокса «Term of use», кнопка «Submit» включена с соответствующей иконкой.
ZK является компонентно-базовым фреймверком действий пользователя, следовательно, постоянно проверяются события компонента. ZK предоставляет аннотирует @Listen, которые могут быть использованы как метод “прослушивания” события компонента, который вы укажете. Для достижения этой особенности, вы можете аннотировать метод, чтобы слушать событие «onCheck» чекбокса «Term of use». Всякий раз, когда пользователь включает/выключает чекбокс, вызывается событие «onCheck», ZK вызывает аннотированный методов. Описанный выше UI эффект мы реализуем путем изменения свойств компонента (Java объекта) в аннотированном методе
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public class RegistrationComposer extends SelectorComposer { @Wire private Button submitButton; @Wire private Checkbox acceptTermBox; @Listen("onCheck = #acceptTermBox") public void changeSubmitStatus(){ if (acceptTermBox.isChecked()){ submitButton.setDisabled(false); submitButton.setImage("/images/submit.png"); }else{ submitButton.setDisabled(true); submitButton.setImage(""); } } } |
С помощью ZK, вы можете легко добавлять модные эффекты пользовательского интерфейса, такие как подсказки, drag & drop, горячие клавиши и т.д. [8] в ваше приложение.
ZK позволяет контролировать UI с помощью контроллера на стороне сервера, поэтому контроллер основная точка для интеграции любой Java библиотеки или фреймверка. Для интеграции ZK с другими фреймверками, напишите свой код контроллера, используя классы back-end системы, которые составляют ваш бизнес- или персистентный слой.
С помощью интерфейса контроллера ZK — SelectorComposer, легко интегрировать вашу существующие классы, объект домена и любые сторонние библиотеки, такие как Log4j.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public class RegistrationIntegrateComposer extends SelectorComposer { //omit other variables for brevity private static Logger logger = Logger.getLogger(RegistrationIntegrateComposer.class.getName()); private LegacyRegister legacyRegister = new LegacyRegister(); private User newUser = new User(); @Listen("onClick = #submitButton") public void register(){ //save user input into newUser object legacyRegister.add(newUser); logger.debug("a user was added."); //... } } |
Это очень важно, что основа пользовательского интерфейса может сотрудничать с другими бизнес-слоями или персистентными слоями при создании многоуровневых веб-приложений. ZK легко интегрируемых с бизнес-фреймворкми, как Spring.
Предположим, вы разработали и внедрили некоторые классы в соответствии с Data Access Object (DAO) шаблонам, как и персистентный слой вашего приложение с Hibernate, JPA или другие персистентные фоеймверки. Это есть в вашем контроллере, в котором вы должны использовать классы для реализации функций приложения.
1 2 3 4 5 6 7 8 9 10 11 12 | @VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class) public class RegistrationSpringComposer extends SelectorComposer { @WireVariable private RegistrationDao registrationDao; @Listen("onClick = #submitButton") public void submit(){ // omit irrelevant code for brevity registrationDao.add(newUser); } } |
Оригинал статьи http://books.zkoss.org/wiki/ZK_Getting_Started/Learn_ZK_in_10_Minutes