Clojure веб-приложение - с чего начать?
Так что в последнее время я смотрел в Clojure, и мне нравится этот язык. Я хотел бы посмотреть, могу ли я сделать небольшое веб-приложение в нем, просто чтобы бросить вызов самому себе. Однако у меня нет абсолютно никакого опыта в настройке любых веб-приложений, связанных с Java. На самом деле, у меня действительно нет большого опыта работы с Java. С чего начать? У меня большой опыт работы с Apache и стекю LAMP, и я знаю, что в Apache я бы просто использовал Fast-CGI в большинстве случаев, но я не знаю эквивалента в мире Java (если есть).
В принципе, мне просто нужна помощь в настройке сервера и его запуске. Я понимаю (несколько), как развернуть чистую Java-приложение, но как насчет чистого приложения Clojure? Как это работает? Я предполагаю, что из мира, где все веб-приложения написаны на языках сценариев, это для меня все ново.
О, и, кстати, я не хочу использовать Clojure framework, например Compojure. Это победит учебную часть этого.
Спасибо заранее.
Ответы
Ответ 1
Я бы посоветовал вам начать с изучения Servlet-API, который поддерживает все, что связано с HTTP-запросами и ответами в мире Java. HttpServletRequest
и HttpServletResponse
покрывают много земли здесь. Причал - отличный выбор здесь; есть хорошее представление о Clojure и Jetty в http://robert.zubek.net/blog/2008/04/26/clojure-web-server/ (используя Jetty 6).
При этом базовая модель Compojure также довольно низкоуровневая: она просто переносит запросы и ответы в Clojure -datastructures, но вы по-прежнему несете ответственность за всю маршрутизацию, генерируя правильные коды ответов. генерируя ETag
и т.д., что иногда является более низкоуровневым, чем с LAMP-стеком.
Ответ 2
На самом деле простой способ начать делать сервлет, который работает на Tomcat или аналогичный, например:
(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.xml в папке 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>
скомпилируйте и упакуйте это в войну, и он будет вести себя как обычный Java-сервлет. Чтобы развернуть на Tomcat, просто оставьте войну в папке webapps и запустите tomcat.
Подробный пример доступен здесь http://github.com/yogthos/clojure-maven-examples
Ответ 3
Если вы не хотите использовать Compojure или другие, вам нужно либо загрузить веб-сервер, либо вызвать JAR, либо написать веб-сервер, используя сокеты. В этом смысле вы можете следить за любым из многочисленных руководств в Интернете для настройки и скомпилировать JAR
Это выглядит так, как вы.
Ответ 4
Одна вещь, которую следует отметить, если вы собираетесь использовать FastCGI, - это не то, что java не похож на другие языки сценариев, есть время запуска для запуска JVM, в отличие от рубинов или питонов.
И тяжелая операция запуска JVM для каждого запроса.
Если я правильно понимаю ваш вопрос, вы ищете собственный способ Java для создания приложений. Если так compojure делает именно то, что он создает сервлет для вас за кулисами, поэтому в конце вы можете создать веб-приложение clojure, как и в Java, и развернуть его на любом сервере приложений.
Ответ 5
Хорошо, вы можете правильно использовать FastCGI непосредственно из clojure. FastCGI - довольно простой протокол, поэтому не должно быть так сложно писать сервер в clojure самостоятельно (я сомневаюсь, что есть библиотека для этого для clojure, но для Java это может быть одно).