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

Привет читатель.
Хочу рассказать про инструмент для 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 мне показался достаточно хорошим и находить в нем что мне надо было легко.

Похожие публикации

Средняя зарплата в IT

120 000 ₽/мес.
Средняя зарплата по всем IT-специализациям на основании 3 843 анкет, за 1-ое пол. 2021 года Узнать свою зарплату
Реклама
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее

Комментарии 7

    –1
    Вы попробуйте MyTaskHelper.ru, идея та же, но исполнение разное. Демо у них классное, хоть бери и копируй в МТХ :)
      0
      Мне кажется что эти инструменты предназначены для разных людей.
      Metawidget предназначен только для программистов. MyTaskHelper хорошо использовать когда навыков программирования нет.
      И насколько я знаю Salesforces предоставляет что-то подобное.
      Но вполне вероятно что за такими системами будущее.
        0
        Salesforce предоставляет, но что-то очень далеко напоминающее. А со всем остальным полностью согласен, спасибо.
      –1
      В NetBeans есть встроенные инструменты редактирования интерфейса. Мне и их как-то всегда хватало. Или это больше для тех, кто использует другую IDE без аналогичных возможностей?
        0
        В общем то я вижу несколько «за» использование этой библиотеки вместо IDE («против» конечно тоже есть):
        1. это библиотека и она никого не привязывает ни к какой IDE.
        2. Преимущества, которые дает обработка realtime по сравнению с генерацией исходников:
            Так как работа с библиотекой это процесс, а не исходники классов, то его можно связать с любым другим процессом (например вытягивание соотв. данных из БД)
            В большинстве случаев нельзя трогать сгенерированные исходники т.к. вполне вероятно что IDE при следующем редактировании это все перетрет.
            Так как MW скорее инструмент для rapid девелопмента, то приятно что меньше кода.
        3. Я пользуюсь Intellij Idea и я там не знаю возможности нарисовать JSF форму.

        А для создания SWING форм я рисую в JFormDesignerэе :) Это конечно наглядней.
          0
          1. Да, это может оказаться полезным
          2. По поводу перетирания исходников — NetBeans не позволит изменить исходники самих форм (в редакторе собственно исходного кода), однако при редактировании формы можно поправить код соответствующего компонента вручную. Хотя почти все можно настроить и так.
          3. Я не пользуюсь Intellij Idea, поэтому не знаю, что сказать по этому поводу. Может, существует какое-то расширение или что-то в этом духе.
            0
            Но ведь в NetBeans тоже нельзя просто нарисовать JSF форму или форму не в тулките Swing.

      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

      Самое читаемое