понедельник, 13 июня 2011 г.

Web-разработка на Clojure

После месяца экспериментов с web-разработкой на Clojure пришел к неутешительному выводу: на данный момент web-инфраструктура у Clojure очень бедная и, я бы сказал, недостаточная. Хотя, конечно, есть примеры разработки сайтов на Clojure, все это делается чересчур сложно. Практически все компоненты приложения приходится писать самостоятельно, вместо того, чтобы взять что-то готовое и просто использовать.
На мой взгляд, сейчас Clojure переживает тот же период развития, что и Ruby до 2004-го года, когда DHH опубликовал свой фреймворк Ruby on Rails. Т.е. все восхищаются языком, все пробуют на нем что-то делать (или даже делают), но все еще нету того классного инструмента, позволяющего разрабатывать веб-приложения на Clojure быстро и качественно.
Поскольку под веб на чистом Clojure разрабатывать пока-что не очень-то удобно, решил воспользоваться инфраструктурой J2EE.
Ниже -- пример простого веб-приложения под Tomcat 7.0 с использованием JSF 2.0:


Для тех, кто имел дело с JSF, объяснять исходник не придется: здесь показан обычный управляемый бин. Точно такой же я собираюсь сделать на Clojure, а использовать оба буду так:


Создайте новый leiningen-проект, назовите его j2ee. Код бина на Clojure с аннотацией @ManagedBean выглядит так:

(ns j2ee.core)
(import [javax.faces.bean ManagedBean])

(definterface MyGreeting
  (getGreeting []))

(deftype
    ^{ManagedBean true}
    MyClojureBean [] 
    MyGreeting 
    (getGreeting [this] "Hello from Clojure!")) 
 
Пример использования аннотаций взят отсюда (автор -- Рич Хики). 

Для того, чтобы сгенерить java-классы на основе типа MyClojureBean, необходимо скомпилировать проект ahead-of-time. Делается это добавлением опции :aot [j2ee.core] в файл проекта.
Для того, чтобы во время компиляции нашелся класс аннотации ManagedBean, необходимо добавить в папку j2ee/lib библиотеки jsf-api.jar и jsf-impl.jar из дирректории NetBeans7.0/enterprise/modules/ext/jsf-2_0/ . А чтобы leiningen не удалил эти библиотеки во время сборки, нужно добавить опцию :disable-implicit-clean true в файл проекта. Таким образом, мой файл проекта j2ee выглядит так:

(defproject j2ee "1.0.0-SNAPSHOT"
  :description "j2ee annotations usage example"
  :dependencies [[org.clojure/clojure "1.2.0"]
                 [org.clojure/clojure-contrib "1.2.0"]]
  :disable-implicit-clean true
  :aot [j2ee.core])
  

Теперь, чтобы скомпилировать проект, нужно выполнить команду lein compile.
Скомпилированный тип будет импортироваться в NetBeans как обычный java-класс с аннотацией ManagedBean:



Затем необходимо добавить папку classes в проект WebApplication1 в NetBeans, а также ссылку на clojure-1.2.0.jar. На скриншотах выше показано, как проект должен выглядеть окончательно.

После запуска, в броузере будет следующее:

Hello from Facelets 
Hello, World! 
Hello from Clojure!


Комментариев нет:

Отправить комментарий