frameworks clojure web-frameworks

frameworks - ¿Marcos webs de Clojure maduros?



web-frameworks (5)

¿Cuáles son las opciones actuales de los marcos web de Clojure maduros? Estoy buscando algún tipo de matriz de características que me diga qué admiten los marcos populares y en qué medida, incluyendo:

  • Plantilla de respuesta (respuesta escrita en Clojure o en algún otro marcado, por ejemplo, como JSP con Tiles)
  • Sesiones HTTP
  • REST con mapeo automático de URLs en funciones de acción y parámetros
  • Formularios HTML (parámetros disponibles como mapa, manejo de errores, validación)
  • Flujo de aplicaciones (conocido de los marcos de Java: los controladores de solicitudes devuelven identificadores de acción que finalmente son manejados por los renderizadores)

Desde que esta pregunta fue formulada / contestada originalmente, el marco web de Noir se ha convertido en una solución prometedora.

Utiliza el hipo para la parte de las plantillas, pero ofrece un marco más completo alrededor de eso.

Ejemplo de código básico de la página principal de Noir:

(ns my-app (:use noir.core) (:require [noir.server :as server])) (defpage "/welcome" [] "Welcome to Noir!") (server/start 8080)


Quizás mi respuesta a ¿Cuál es el buen punto de partida para desarrollar el servicio web RESTful en Clojure? La pregunta sobre SO podría ser de ayuda para usted. Menciona algunas bibliotecas web importantes para Clojure (con enlaces y resúmenes breves). El punto clave que me gustaría reiterar aquí se encuentra en el primer párrafo de esa respuesta:

En primer lugar, creo que es poco probable que encuentre una sola solución envuelta en plástico para hacer todo esto en Clojure (excepto en la forma de una biblioteca de Java que se utilizará a través de interoperabilidad). Lo que se está convirtiendo en la pila web estándar de Clojure comprende una serie de bibliotecas que las personas mezclan y combinan en todo tipo de formas (ya que tienden a ser perfectamente compatibles).

A eso le agrego que probablemente no espere manejar las cosas con el tipo de "flujo de aplicaciones" que podría saber de Java (o si cree que realmente lo necesita, probablemente tenga que lanzar su propia biblioteca para admitirlo). !). Sin embargo, está bien, ya que la gente parece estar muy contenta con el enfoque del manejador de Ring-is-a-function, amigable al middleware.

Para abordar sus balas:

  • Plantilla de respuesta:
    Hay una serie de soluciones específicas de Clojure, que incluyen Enlive y Hiccup (Enlive es un motor muy potente de raspado / modelado / transformación de HTML; Hiccup es un DSL para escribir HTML en Clojure con la buena propiedad que representa). Además, este es probablemente un lugar donde tiene mucho sentido el desplegarse en Java y usar algo como, por ejemplo, StringTemplate . Esto incluso tiene el lado positivo de desalentar la mezcla de plantillas y lógica. (Creo que Stuart Halloway ha mencionado que Relevance, su compañía, está usando esta estrategia en su trabajo y que está teniendo mucho éxito con ella).

  • Sesiones HTTP
    Eso sería Sandbar , supongo. El autor ha iniciado una serie de artículos sobre el blog que parecen muy prometedores.

  • REST con mapeo automático de URLs en funciones de acción y parámetros
    Eso es Ring y Compojure y / o Moustache . Vea abajo.

  • Formularios HTML (parámetros disponibles como mapa, manejo de errores, validación)
    Como anteriormente.

  • Flujo de aplicaciones (conocido de los marcos de Java: los controladores de solicitudes devuelven identificadores de acción que finalmente son manejados por los renderizadores)
    Como se mencionó anteriormente, no es realmente algo que la gente tiende a hacer en Clojure.

Como punto de partida para aprender sobre la pila web de Clojure, este tutorial de Ring por el autor de Ring Mark McGranaghan es muy útil. El autor de Compojure , James Reeves, tiene algo de documentación sobre Compojure. Tal vez mi respuesta reciente a ¿Cuál es la "gran idea" detrás de las rutas de trabajo? La pregunta puede ser de ayuda también. Las fuentes de Ring también incluyen un gran documento SPEC.


Te recomendaré que uses Luminus , no por su nombre asombroso, sino también por su función.

Y como Noir ya no se mantiene, no te recomendaré que lo uses. También es una buena opción comenzar desde ring & Compojure desde el principio para crear su propio marco.


Usted puede estar haciendo la pregunta incorrecta. Lo que veo en su pregunta es "¿qué marco de Clojure se parece más a los marcos orientados a objetos de Java a los que estoy acostumbrado?". No hay una buena respuesta para eso; Si solo te sientes cómodo con un enfoque de servidor del estado (como Grails o Tapestry), quizás deberías quedarte allí y encontrar una manera de implementar algunos de tus back-end en Clojure.

Por otro lado, si quieres construir algo más fiel a Clojure, es posible que desees encontrar tu propia mezcla. He tenido algunos éxitos al usar AngularJS y CoffeeScript en el cliente, y Clojure (usando Ring y Bishop) en el servidor (aunque nos estamos mudando de Bishop a Liberator). En cualquier caso, una vez que adopta el enfoque de la aplicación web de "una sola página" y comienza a tratar el lado del servidor como fuente y sumidero de datos, encontrará que Clojure funciona excepcionalmente bien.


intente el marco de ruta para el desarrollo web rápido https://github.com/zhujinxian/road

(defn render-test [ret tmt] (-> (resp/response "------render----test------") (#(resp/content-type %1 "text/plain")))) (defn foo "I don''t do a whole lot." [x] (str "来自源码目录的参数:" x)) (defn handler [^Integer x] {:$r render-test :text (str "hello world, road goes sucess!" (foo x))}) (defn home [req content ^Integer num] {:hiccup "home.clj" :content (str "home" content) :num num}) (defroad road (GET "/web-test-0.1.0-SNAPSHOT-standalone/main" handler) (GET "/web-test-0.1.0-SNAPSHOT-standalone/home/:num{//d+}" home)) (defn -main [& args] (log/info "---------log4j test-------") (jetty/run-jetty road {:port 3000}))