2009-09-23 16 views
21

Quindi ultimamente ho cercato su Clojure e amo la lingua. Mi piacerebbe vedere se riesco a creare una piccola applicazione web, solo per mettermi alla prova. Tuttavia, non ho assolutamente esperienza nella creazione di applicazioni web relative a Java. In realtà, non ho davvero molta esperienza con Java. Da dove comincio? Ho molta esperienza con Apache e lo stack LAMP, e so che su Apache userei semplicemente Fast-CGI nella maggior parte dei casi, ma non conosco l'equivalente nel mondo Java (se ce n'è uno).Applicazione web Clojure: da dove iniziare?

Fondamentalmente, ho solo bisogno di aiuto con la configurazione del server e il suo avvio. Capisco (in qualche modo) come distribuire un'applicazione Java pura, ma che dire di un'applicazione Clojure pura? Come funziona? Immagino, proveniente da un mondo in cui tutte le applicazioni web sono scritte in linguaggi di scripting, questo è tutto nuovo per me.

Oh, e comunque, Non voglio usare un framework Clojure come Compojure. Quello sconfiggerebbe la parte imparante di questo.

Grazie in anticipo.

risposta

17

Si consiglia di iniziare imparando l'API Servlet, che supporta tutte le operazioni relative alle richieste e alle risposte HTTP nel mondo Java. HttpServletRequest e HttpServletResponse coprono molto terreno qui. Il molo è una buona scelta qui; c'è una buona introduzione su Clojure e Jetty al http://robert.zubek.net/blog/2008/04/26/clojure-web-server/ (usando Jetty 6).

Detto questo, il modello base di Compojure è piuttosto di basso livello: racchiude solo le richieste e le risposte in Clojure-datastructures, ma tu sei ancora responsabile di tutto il routing, generando i giusti codici di risposta. generando un ETag ecc., che a volte è più roba di basso livello che con un LAMP-stack.

+2

Hmm, ok, darò un'occhiata al codice sorgente di Compojure per avere un'idea di come funziona. Se stavo seriamente scrivendo un'applicazione web in piena regola, probabilmente lo userei, ma voglio scrivere questo strato io stesso per presentarmi al modo in cui i server Java funzionano. +1 –

+3

Per una buona panoramica della mappatura tra le strutture di risposta HTTP-response e -request a Clojure, come è usato in Ring e Compojure, consiglio di leggere http://github.com/mmcgrana/ring/blob/master/ SPEC – pmf

+0

Definirei senza problemi Ring, poiché fornisce l'equivalente Clojure a un Servlet e aiuta parecchio a non aver bisogno di conoscere più Java del necessario. Ogni framework web Clojure che ho visto si trova sopra di esso, utilizzandolo come un livello di traduzione. – deterb

3

Se non si desidera utilizzare Compojure o altri, è necessario caricare il server Web e chiamare il JAR o scrivere un server Web utilizzando i socket. In questo senso puoi seguire uno qualsiasi dei molti guides sul Web per la configurazione e compile a JAR

This sembra quello che stai cercando.

+0

Aha, il link per la compilazione di un JAR è quello che stavo cercando! Non ero sicuro di come Clojure avrebbe dovuto girare su un server web. Come ho detto, provengo da uno sfondo del linguaggio di scripting, in cui metti i file in una directory specifica e il gioco è fatto. +1 :) –

+0

Questo potrebbe essere utile anche: http://markmail.org/message/mipzbehperyyd67j –

-1

Bene, è possibile utilizzare correttamente FastCGI direttamente da Clojure. FastCGI è un protocollo piuttosto semplice, quindi non dovrebbe essere così difficile scrivere da solo un server in clojure (dubito che ci sia una libreria per fare ciò per il clojure, ma potrebbe esserlo per Java).

1

Una cosa da notare se avete intenzione di andare con FastCGI è java non è come altri linguaggi di scripting c'è un tempo di avvio per l'avvio della JVM a differenza di Ruby o Python. Ed è un'operazione pesante avviare JVM per ogni richiesta.

Se ho capito bene la tua domanda, stai cercando un modo java nativo per creare applicazioni. Se così compojure fa esattamente ciò crea un servlet per te dietro le quinte, così alla fine puoi creare un'applicazione web clojure come quelle di java e distribuirla su qualsiasi server di applicazioni.

+0

Sì, hai capito bene la mia domanda. Capisco che questo è ciò che Compojure fa, ma * come * lo fa? In sostanza sto chiedendo come funziona tutto questo. So che potrei semplicemente usare Compojure, ma sto cercando di capire come funzionano le applicazioni web basate su Java. –

14

Un modo molto semplice per iniziare è quello di fare una servlet che gira su Tomcat o simili, per esempio:

(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)) 

quindi creare una rete.xml nella cartella 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> 

compilazione e pacchetto presente in una guerra, e ti si comportano proprio come un normale servlet Java. Per eseguire l'implementazione su Tomcat, è sufficiente rilasciare la war nella cartella webapps e avviare tomcat.

un esempio dettagliato è disponibile qui http://github.com/yogthos/clojure-maven-examples