Pull to refresh

Metawidget — инструмент, генерирующий Java формы

Reading time 3 min
Views 2.9K
Привет читатель.
Хочу рассказать про инструмент для Java на который я недавно наткнулся и не нашел на хабре ни одного упоминания о нем. Называется он Metawidget и его предназначение — генерировать формы в Java.

Лично мне больше всего понравилось то что он делает это в realtime. Я работал с как-то с одним проектом, который генерировал Java бины на этапе компиляции и могу сказать что мне это совсем не понравилось. Во первых сгенерированные классы трогать нельзя т.к. они могут быть в любое время перегенерированны. Исходный материал выглядит странно т.к. не является чистой Java. IDE эти «прибамбасы» тоже не распознает. Ну и появляется дополнительное время при компиляции/генерации, то ли чтоб кофе попить, то ли чтоб зубами проскрипеть от негодования.

Следующие особенности сего инструмента не менее важны:
Metawidget генерирует очень много каких форм. Я имею ввиду что это могут быть SWING, JSF, JSP и еще всякие другие View технологии Java'ы (полный список есть на сайте). Правда не все он генерирует так как хотелось бы мне, но об этом попозже.
Этот инструмент может работать с любыми POJO объектами и умеет грамотно использовать аннотации JPA/Hibernate если такие есть в объекте. То есть например, если создается выпадающий список (HTML select) и есть JPA аннотация @Column( nullable = true ), то тогда первой опцией списка будет null, если же nullable = false — пустой опции не будет.

Приведу краткий пример использования Metawidget для генерации JSF форм.
Вначале опишем наш ManagedBean:
@ManagedBean
public class MetawidgetBB {
@EJB
private FlexibleDAO flexibleDAO;

public UIMetawidget getMetawidget() {
HtmlMetawidget metawidget = new HtmlMetawidget();
initMetawidget(metawidget);
return metawidget;
}

public void setMetawidget(UIMetawidget metawidget) {
initMetawidget(metawidget);
}

private void initMetawidget(UIMetawidget metawidget) {
metawidget.setValue(Musician.class);
}
}

В строке «metawidget.setValue(Musician.class);» указываем, какой класс использовать как бин.

Затем JSF шаблон:
....
xmlns:m="http://metawidget.org/faces"
....
<h:form>
<m:metawidget binding="#{metawidgetBB.metawidget}"/>
<h:form>
....


Бин приводить не буду, но в общем это может быть любой класс с публичными свойствами или с геттерами/сеттерами. В моем случае еще были отношения (relationship) ManyToMany.

Так. Все готово. Компилируем, запускаем.
image
Voila!
Только что-то не совсем в порядке.
Там где связи ManyToMany никаких редактируемых полей нету. Просто текст.
Вот это то и расстраивает. Я конечно понимаю что инструмент в данном случае поставить текстовое поле не имеет права, а предложить варианты тоже не может т.к. не знает какие они есть.
Разработчики нашли своеобразные решения этой проблемы. Это специальные Ui*Lookup аннотации. Например вы можете перечислить элементы таким образом:
@UiLookup( { "Riga", "Moscow", "Kukuyevo" } )
public String getCity()

Но в общем-то проблемы это не решает так как все значения захардкожены. Для JSF существует expression аннотация и выглядит она примерно так:@UiFacesLookup("#{myManagedBean.cities}")
Metawidget, при необходимости начертать input элемент с перечнем городов, будет обращаться к ManagedBean'у «myManagedBean», методу «getCities()», и подставлять полученный оттуда список. А уж в ManagedBean'е мы подсунем все что захотим. Подобные решения есть не только для JFS.

В конце же хочу написать мое личное впечатление от инструмента.
В общем он отлично соответствует своей цели и своей парадигме, если не считать связей (relationship). К тому же я недавно попробовал Python/Django и мне уж очень там понравилась возможность делать админку из ORM бинов. И так бы мне хотелось увидеть это на Java… Конечно я понимаю что если сайт достаточно серьезен, то там может быть столько нюансов, что правильнее будет не пользоваться автоматикой, а делать все как и сейчас, но вот при старте проекта это бы очень помогло Java разработчику.
Дабы приблизить свою мечту к реальности я хотел бы сделать свою библиотеку-прослойку между JPA данным и Metawidgets. Чтобы автоматически все подтягивалось и сохранялось. Сегодня сделал сою аннотацию и ее обработку так, что теперь у меня связанные элементы сами подтягиваются посредством JPA.
Я не могу сказать что я большой специалист, но код Metawidgets мне показался достаточно хорошим и находить в нем что мне надо было легко.
Tags:
Hubs:
+12
Comments 7
Comments Comments 7

Articles