2009-09-23 37 views
21

Vì vậy, gần đây tôi đã nhìn vào Clojure, và tôi yêu ngôn ngữ. Tôi muốn xem liệu tôi có thể tạo một ứng dụng web nhỏ trong đó, chỉ để thử thách bản thân mình. Tuy nhiên, tôi hoàn toàn không có kinh nghiệm thiết lập bất kỳ ứng dụng web liên quan đến Java nào. Trong thực tế, tôi không thực sự có nhiều kinh nghiệm với Java cả. Tôi bắt đầu từ đâu? Tôi có rất nhiều kinh nghiệm với Apache và LAMP stack, và tôi biết trên Apache tôi sẽ chỉ sử dụng Fast-CGI trong hầu hết các trường hợp, nhưng tôi không biết tương đương trong thế giới Java (nếu có).Ứng dụng web Clojure - tôi bắt đầu từ đâu?

Về cơ bản, tôi chỉ cần trợ giúp thiết lập máy chủ và bắt đầu. Tôi hiểu (phần nào) cách triển khai một ứng dụng Java thuần túy, nhưng về ứng dụng Clojure thuần túy thì sao? Nó hoạt động như thế nào? Tôi đoán, đến từ một thế giới mà tất cả các ứng dụng web được viết bằng ngôn ngữ kịch bản, điều này hoàn toàn mới đối với tôi.

Ồ, và nhân tiện, Tôi không muốn sử dụng khung công tác Clojure chẳng hạn như Compojure. Điều đó sẽ đánh bại phần học tập của điều này.

Xin cảm ơn trước.

Trả lời

17

Tôi khuyên bạn nên bắt đầu bằng cách tìm hiểu Servlet-API, nó hỗ trợ mọi thứ liên quan đến các yêu cầu và phản hồi HTTP trong thế giới Java. HttpServletRequestHttpServletResponse bao gồm nhiều mặt đất tại đây. Cầu cảng là một lựa chọn tốt đẹp ở đây; có một giới thiệu tốt về Clojure và Jetty tại http://robert.zubek.net/blog/2008/04/26/clojure-web-server/ (sử dụng Jetty 6).

Điều đó đang được nói, mô hình cơ bản của Compojure cũng khá thấp: nó chỉ bao bọc các yêu cầu và phản hồi trong Clojure-datastructures, nhưng bạn vẫn chịu trách nhiệm cho mọi định tuyến, tạo ra mã phản hồi phù hợp. tạo ra một số ETag v.v., đôi khi có nhiều thứ cấp thấp hơn so với một LAMP-stack.

+2

Hmm, được rồi, tôi sẽ xem mã nguồn của Compojure để biết ý tưởng về cách thức hoạt động của nó. Nếu tôi nghiêm túc viết một ứng dụng web toàn diện, tôi có thể sử dụng nó, nhưng tôi muốn tự mình viết lớp này để giới thiệu bản thân mình về cách các máy chủ Java hoạt động. +1 –

+3

Để có cái nhìn tổng quan tốt đẹp về ánh xạ giữa phản hồi HTTP và truy vấn đến cấu trúc dữ liệu của Clojure, vì nó được sử dụng trong Ring và Compojure, tôi khuyên bạn nên đọc http://github.com/mmcgrana/ring/blob/master/ SPEC – pmf

+0

Tôi chắc chắn sẽ nhìn vào Ring, vì nó cung cấp Clojure tương đương với Servlet và giúp khá nhiều với việc không cần biết nhiều Java hơn là cần thiết. Mỗi khung công tác web Clojure tôi đã thấy nằm trên nó, sử dụng nó như một lớp dịch thuật. – deterb

3

Nếu bạn không muốn sử dụng Compojure hoặc những người khác thì bạn sẽ cần phải tải máy chủ web và gọi JAR của bạn hoặc viết máy chủ web bằng cách sử dụng ổ cắm. Theo nghĩa đó, bạn có thể theo dõi bất kỳ số nào trong số nhiều guides trên web để thiết lập và compile a JAR

This trông giống như bạn đang làm sau.

+0

Aha, liên kết để biên dịch một JAR là những gì tôi đang tìm kiếm! Tôi không chắc Clojure phải chạy trên máy chủ web như thế nào. Như tôi đã nói, tôi đến từ một nền ngôn ngữ kịch bản, nơi bạn chỉ cần đặt các tập tin trong một thư mục cụ thể và bạn đã hoàn tất. +1 :) –

+0

Điều này có thể hữu ích: http://markmail.org/message/mipzbehperyyd67j –

-1

Bạn cũng có thể sử dụng đúng FastCGI trực tiếp từ clojure. FastCGI là một giao thức khá đơn giản nên không khó để viết một máy chủ trong clojure (tôi nghi ngờ có một thư viện để làm điều này cho clojure, nhưng cũng có thể là một cho Java).

1

Một điều cần lưu ý nếu bạn định sử dụng FastCGI là java không giống như các ngôn ngữ kịch bản khác có thời gian bắt đầu để khởi động JVM không giống như ruby ​​hoặc python. Và đó là một hoạt động nặng để bắt đầu JVM cho mỗi yêu cầu.

Nếu tôi hiểu bạn câu hỏi chính xác bạn đang tìm kiếm một cách java bản địa để tạo ứng dụng. Nếu vậy compojure thực hiện chính xác rằng nó tạo ra một servlet cho bạn đằng sau hậu trường để cuối cùng bạn có thể tạo một ứng dụng web clojure giống như ứng dụng web trong java và triển khai nó trên bất kỳ máy chủ ứng dụng nào.

+0

Có, bạn đã hiểu câu hỏi của tôi một cách chính xác. Tôi hiểu rằng đây là những gì Compojure làm, nhưng * làm thế nào * hiện nó làm điều đó? Tôi về cơ bản hỏi làm thế nào tất cả các công trình này. Tôi biết tôi chỉ có thể sử dụng Compojure, nhưng tôi đang cố gắng tìm ra cách các ứng dụng web dựa trên Java hoạt động như thế nào. –

14

Một cách thực sự đơn giản để bắt đầu là để thực hiện một servlet chạy trên Tomcat hoặc tương tự, ví dụ:

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

sau đó tạo ra một trang web.xml trong thư mục WEB-INF của bạn

<?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> 

biên dịch và gói này vào một cuộc chiến tranh, và nó sẽ cư xử giống như một servlet Java thông thường. Để triển khai trên Tomcat, chỉ cần thả chiến tranh trong thư mục webapps và bắt đầu tomcat.

Một ví dụ cụ thể có sẵn ở đây http://github.com/yogthos/clojure-maven-examples

Các vấn đề liên quan