2009-09-23 12 views
21

Últimamente he estado investigando Clojure, y me encanta el idioma. Me gustaría ver si puedo hacer una pequeña aplicación web, solo para retarme a mí mismo. Sin embargo, no tengo absolutamente ninguna experiencia en la configuración de aplicaciones web relacionadas con Java. De hecho, realmente no tengo mucha experiencia con Java en absoluto. ¿Dónde empiezo? Tengo mucha experiencia con Apache y la pila LAMP, y sé que en Apache simplemente usaría Fast-CGI en la mayoría de los casos, pero no conozco el equivalente en el mundo Java (si hay uno).Aplicación web Clojure: ¿dónde empiezo?

Básicamente, solo necesito ayuda para configurar el servidor y comenzar. Entiendo (algo) cómo implementar una aplicación Java pura, pero ¿qué pasa con una aplicación Clojure pura? ¿Cómo funciona? Supongo que, viniendo de un mundo donde todas las aplicaciones web están escritas en lenguajes de scripting, esto es nuevo para mí.

Ah, y por cierto, No quiero usar un marco Clojure como Compojure. Eso vencería la parte de aprendizaje de esto.

Gracias de antemano.

Respuesta

17

Recomiendo que empiece por aprender el Servlet-API, que respalda todo lo relacionado con las solicitudes HTTP y las respuestas en el mundo de Java. HttpServletRequest y HttpServletResponse cubren mucho terreno aquí. Jetty es una buena opción aquí; hay una buena introducción sobre Clojure y Jetty en http://robert.zubek.net/blog/2008/04/26/clojure-web-server/ (usando Jetty 6).

Habiendo dicho esto, el modelo básico de Compojure también es de muy bajo nivel: simplemente envuelve las solicitudes y respuestas en Clojure-datastructures, pero usted sigue siendo responsable de todas las rutas, generando los códigos de respuesta correctos. generando un ETag etc., que a veces es más cosas de bajo nivel que con una pila LAMP.

+2

Hmm, está bien, voy a echar un vistazo al código fuente de Compojure para tener una idea de cómo funciona esto. Si estuviera escribiendo seriamente una aplicación web completa, probablemente la usaría, pero quiero escribir esta capa yo mismo para presentarme a la manera en que funcionan los servidores Java. +1 –

+3

Para una buena descripción de la correspondencia entre HTTP-response y -request a las estructuras de datos de Clojure, como se usa en Ring y Compojure, recomiendo leer http://github.com/mmcgrana/ring/blob/master/ SPEC – pmf

+0

Definitivamente buscaría en Ring, ya que proporciona el Clojure equivalente a un Servlet y ayuda bastante sin necesidad de saber más Java de lo necesario. Todos los frameworks web de Clojure que he visto se encuentran encima de él, usándolo como una capa de traducción. – deterb

3

Si no desea utilizar Compojure u otros, deberá cargar el servidor web y llamar a su JAR, o escribir un servidor web utilizando sockets. En ese sentido, puede seguir cualquiera de los muchos guides en la web para la configuración, y compile a JAR

This se parece a lo que está buscando.

+0

Aha, el enlace para la elaboración de un JAR es lo que estaba buscando! No estaba seguro de cómo se suponía que Clojure se ejecutara en un servidor web. Como dije, vengo de un fondo de lenguaje de scripting, donde simplemente colocas los archivos en un directorio específico y listo. +1 :) –

+0

Esto también podría ser útil: http://markmail.org/message/mipzbehperyyd67j –

-1

Bueno, puede utilizar FastCGI directamente desde clojure. FastCGI es un protocolo bastante simple, por lo que no debería ser tan difícil escribir un servidor en clojure usted mismo (dudo que haya una biblioteca para hacer esto para clojure, pero podría haber uno para Java).

1

Una cosa a tener en cuenta si vas a ir con FastCGI es java no es como otros lenguajes de scripting hay un tiempo de inicio para iniciar la JVM a diferencia de decir ruby ​​o python. Y es una operación pesada para iniciar JVM para cada solicitud.

Si entiendo correctamente su pregunta, está buscando una forma nativa de Java para crear aplicaciones. Si eso es exactamente lo que hace, crea un servlet detrás de escena, así que al final puedes crear una aplicación web clojure como las de Java y desplegarla en cualquier servidor de aplicaciones.

+0

Sí, entendiste mi pregunta correctamente. Entiendo que esto es lo que hace Compojure, pero * ¿cómo? ¿Lo hace? Básicamente, estoy preguntando cómo funciona todo esto. Sé que podría usar Compojure, pero estoy tratando de descubrir cómo funcionan las aplicaciones web basadas en Java. –

14

Una forma muy sencilla de empezar es hacer un servlet que se ejecuta en Tomcat o similares, por ejemplo:

(ns servlet 
((:gen-class :extends javax.servlet.http.HttpServlet)) 

(defn -doGet 
    [_ request response] 
    (.setContentType response "text/html") 
    (let w (.getWriter response)] 
     (.println w 
     (str "<html>" 
      "<head>" 
      "<title>Hello World!</title>" 
      "</head>" 
      "<body>" 
      "<h1>Hello " 
      (.getParameter request "Name") 
      "</h1>" 
      "</body>" 
      "</html>")))) 

(defn -doPost [_ request response] 
    (-doGet nil request response)) 

continuación, crear una web.XML en la carpeta WEB-INF

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
id="WebApp_ID" version="2.5"> 

<display-name>Clojure Servlet</display-name> 

<servlet> 
<servlet-name>hello</servlet-name> 
<servlet-class>servlet</servlet-class> 
</servlet> 
<servlet-mapping> 
<servlet-name>hello</servlet-name> 
<url-pattern>/hello</url-pattern> 
</servlet-mapping> 
<welcome-file-list> 
<welcome-file>index.html</welcome-file> 
</welcome-file-list> 
</web-app> 

de compilación y el paquete de esto en una guerra, y se comportarán como un servlet de Java regulares. Para implementar en Tomcat, simplemente suelte la guerra en la carpeta webapps e inicie tomcat.

Un ejemplo detallado está disponible aquí http://github.com/yogthos/clojure-maven-examples

Cuestiones relacionadas