Clojure Web应用程序-我该从哪里开始?

23
最近我一直在研究Clojure语言,我非常喜欢这门语言。我想看看能否用它做一个小的Web应用程序来挑战自己,但是我没有任何Java相关Web应用程序的设置经验,实际上我对Java也不是很了解。我从事过Apache和LAMP堆栈方面的工作,我知道在Apache上我通常会使用Fast-CGI,但我不知道在Java世界中是否有类似的东西。
基本上,我只需要帮助设置服务器并启动它。我(有点)理解如何部署纯Java应用程序,但纯Clojure应用程序怎么办?它是怎么工作的?我想,来自所有Web应用程序都是用脚本语言编写的世界,这对我来说都是新的。
顺便说一下,我不想使用像Compojure这样的Clojure框架,因为那会影响我的学习过程。
提前感谢您的帮助。
5个回答

17

我建议您首先学习Servlet-API,它是与Java世界中所有与HTTP请求和响应相关的事物相对应的。在这里,HttpServletRequestHttpServletResponse涵盖了很多内容。Jetty是一个不错的选择; 在http://robert.zubek.net/blog/2008/04/26/clojure-web-server/中有一个关于Clojure和Jetty的良好介绍(使用Jetty 6)。

话虽如此,Compojure的基本模型也相当低级:它只是将请求和响应封装在Clojure数据结构中,但您仍然需要负责所有路由、生成正确的响应代码、生成ETag等操作,这有时比使用LAMP堆栈更具低层次。


2
嗯,好的,我会查看Compojure的源代码,以了解其工作原理。如果我真的要写一个完整的Web应用程序,我可能会使用它,但我想自己编写这个层来介绍一下Java服务器的工作方式。+1 - Sasha Chedygov
3
推荐阅读http://github.com/mmcgrana/ring/blob/master/SPEC,了解HTTP响应和请求与Clojure数据结构之间的映射关系,这在Ring和Compojure中得到了应用。 - pmf
我一定会研究Ring,因为它提供了Clojure对Servlet的等效替代,并帮助我们不需要了解超过必要的Java知识。我见过的每个Clojure Web框架都以它为基础,将其用作翻译层。 - deterb

14

一个非常简单的入门方法是创建一个在Tomcat或类似服务器上运行的Servlet,例如:

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

然后在你的WEB-INF文件夹中创建一个web.xml文件

<?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>
编译并将它打包成war文件,这样它就像一个普通的Java servlet一样运行。要在Tomcat上部署,只需将war文件放入webapps文件夹中并启动Tomcat即可。
详细示例请参见http://github.com/yogthos/clojure-maven-examples

3
如果您不想使用Compojure或其他框架,则需要让Web服务器加载并调用您的JAR文件,或者使用套接字编写一个Web服务器。在这个意义上,您可以遵循网络上的任何指南进行设置,并编译JAR文件看起来就是您想要的。

啊哈,编译JAR的链接正是我在寻找的!我不确定Clojure应该如何在Web服务器上运行。就像我说的,我来自脚本语言背景,你只需要将文件放在特定目录中,然后完成了。+1 :) - Sasha Chedygov

1

如果你要使用FastCGI,需要注意的一点是Java不像其他脚本语言,启动JVM有一个启动时间,这与Ruby或Python不同。而且为每个请求启动JVM是一个繁重的操作。

如果我正确理解了你的问题,你正在寻找一种创建应用程序的本地Java方法。如果是这样,Compojure正是如此,它在幕后为您创建一个Servlet,因此最终您可以创建类似于Java中的Clojure Web应用程序,并将其部署到任何应用程序服务器上。


是的,你正确理解了我的问题。我知道这就是Compojure的作用,但是它是如何实现的呢?我基本上是在问所有这些是如何工作的。我知道我可以使用Compojure,但我更想弄清楚基于Java的Web应用程序是如何工作的。 - Sasha Chedygov

-1

你可以直接从Clojure中正确使用FastCGI。FastCGI是一个相当简单的协议,因此自己在Clojure中编写服务器不应该太困难(我怀疑是否有适用于Clojure的库,但Java可能有一个)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接