使用创建的项目lein new compojure project-name并让服务器引用(wrap-defaults project-name site-defaults).
在我的处理程序中,我正在调用控制器并将参数传递给这些控制器。项目结构:
handler.clj ;; ring accesses def app
controllers/app.clj ;; where route params are sent
example: (GET "/signup" {params :params} (controller-app/signup params))
Run Code Online (Sandbox Code Playgroud)
所以我遇到的问题是我无法弄清楚如何从控制器文件中获取或设置 cookie。我尝试过的事情:
任何帮助将非常感激。没有太多关于此的文档,因此不幸的是,该问题花费了相当长的时间。
我创建了Compojure 入门页面上给出的示例WAR,并将其部署到Apache Tomcat 6.0.2 wepapps文件夹中。我使用的Web.xml如下所示:
<web-app>
<servlet>
<servlet-name>myservlet</servlet-name>
<servlet-class>myapp.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>myservlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
Run Code Online (Sandbox Code Playgroud)
访问URL会引发以下错误
java.lang.NullPointerException: Handler returned nil (maybe no routes matched URI)
compojure.http.servlet$request_handler__72.invoke(servlet.clj:110)
myapp.MyServlet$_service__108.invoke(MyServlet.clj:11)
myapp.MyServlet.service(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
我已经将Clojure,Clojure contrib jars包含在WEB-INF / lib文件夹中。
是否有人在Apache Tomcat上遇到Clojure WAR的类似问题?
我尝试运行的Servlet是:
;; src/myapp/MyServlet.clj
(ns myapp.MyServlet
(:use compojure)
(:gen-class
:extends javax.servlet.http.HttpServlet))
(defroutes greeter
(GET "/"
(html [:h1 "Hello World"])))
(defservice greeter)
Run Code Online (Sandbox Code Playgroud)
当我更换了(defservice greeter)与
(run-server {:port 8080}
"/*" (servlet greeter))
Run Code Online (Sandbox Code Playgroud)
我可以运行它并从浏览器访问URL。
但是,当我从Apache Tomcat运行此程序时,仍然会遇到相同的问题。
我开始尝试使用compojure,我想用几个组件示例中的语法创建HTML输出:
(html [:html
[:head
[:title "Page title"]]
...
Run Code Online (Sandbox Code Playgroud)
但我正在使用compojure 0.6.2,似乎这个语法不包含在compojure核心中.
如何将其包含在我的项目中?
我正在执行lein uberwar我的测试webapp,我收到以下奇怪的错误:
Exception in thread "main" java.lang.ClassCastException: java.lang.Boolean cannot be cast to clojure.lang.Symbol (servlet.clj:1)
Run Code Online (Sandbox Code Playgroud)
servlet.clj包含以下内容:
(ns test.servlet
(:use ring.util.servlet)
(:require test.routes :as routes)
(:gen-class :extends javax.servlet.http.HttpServlet))
(defservice routes/app-routes)
Run Code Online (Sandbox Code Playgroud)
test.routes文件包含:
(ns test.routes
(:use compojure.core)
(:require [compojure.route :as route]
[compojure.handler :as handler]))
(defroutes app-routes
(GET "/" [] {:status 200
:headers {"Content-Type" "text/html"}
:body "<h1>Hello World</h1>"})
(route/files "/" {:root "static"})
(ANY "/:s" [s] (str "page-not-found" s)
;; For lein ring-server
;(def test-handler
; (handler/site app-routes))
Run Code Online (Sandbox Code Playgroud)
奇怪的是,如果我替换线
(:require test.routes :as routes)
Run Code Online (Sandbox Code Playgroud)
附: …
从uberjar运行时,Ring的文件响应对我不起作用.我试过了两个
(response/file-response "index.html" {:root "resources/public"})
Run Code Online (Sandbox Code Playgroud)
和
(response/response (clojure.java.io/as-file (clojure.java.io/resource "public/index.html")))
Run Code Online (Sandbox Code Playgroud)
你如何在uberjar里面的"/"服务index.html?
我正在Clojure和Compojure写一个小网站.我想根据找到或未找到的数据为每个请求设置HTTP响应状态.
最后一个调用是html5宏,它将需要发送回浏览器的html返回给处理程序.是否可以在某种程度上设置HTTP响应状态?
(ns myapp.views.layout
(:require
[hiccup.page :refer (html5 include-css include-js)]))
(defn layout [title & content]
(html5
(head title)
(body content)))
Run Code Online (Sandbox Code Playgroud) 在我的Web处理程序中,我定义了以下内容:
(:require ...
[ring.middleware.cookies :refer [wrap-cookies]]
[ring.middleware.multipart-params :refer [wrap-multipart-params]]
[ring.middleware.params :refer [wrap-params]]
[ring.middleware.keyword-params :refer [wrap-keyword-params]]
[ring.middleware.content-type :refer [wrap-content-type]]
[ring.middleware.format-response :refer [wrap-restful-response]
...)
(def app
(-> (routes home/my-routes)
(wrap-cookies)
(wrap-params)
(wrap-multipart-params)
(wrap-keyword-params))))
Run Code Online (Sandbox Code Playgroud)
一切正常.使用看起来像"../test?foo=123"的URL测试卷曲给我一个看起来像{:foo 123}的参数图.但是,显示为关键字的实际上是一个字符串:( keyword?:foo)返回false.
我已经尝试重新安排处理程序并一次删除它们,但无济于事.是否有关于compojure的东西将关键字转换回字符串?谢谢
我使用了一个新的Compojure Leiningen项目lein new compojure test.Web服务器由lein repl然后运行
user=> (use 'ring.adapter.jetty)
user=> (run-jetty test.handler/app {:port 3000})
Run Code Online (Sandbox Code Playgroud)
路由和应用程序处理程序规范是微不足道的:
(defroutes app-routes
(GET "/*.do" [] "Dynamic page")
(route/not-found "Not Found"))
(def app
(wrap-defaults app-routes site-defaults))
Run Code Online (Sandbox Code Playgroud)
现在,在更改app-routes定义中的任何内容后(例如,将"动态页面"文本更改为其他任何内容,或修改URI匹配字符串),我不会在浏览器中获得更新的文本/路由.但是,当app-routes稍微改变定义时
(defn dynfn [] "Dynamic page fn")
(defroutes app-routes
(GET "/*.do" [] (dynfn))
(route/not-found "Not Found"))
Run Code Online (Sandbox Code Playgroud)
我在更改返回值时会获得动态更新dynfn.另外,遵循本文的建议并将app定义修改为
(def app
(wrap-defaults #'app-routes site-defaults))
Run Code Online (Sandbox Code Playgroud)
(注意#'透明地创建一个var app-routes)也有帮助!
为什么会这样?有没有其他方式可以获得真正的动态行为defroutes?
谢谢!
有没有办法在运行http-kit服务器时注册多个处理程序:
(defroutes rest-main-app
(GET "/" "Welcome"))
(defroutes rest-events-app
(GET "/events" "Event API"))
(defn -main []
(run-server rest-main-app {:port 5000}))
Run Code Online (Sandbox Code Playgroud)
如何将两个路由都传递给运行服务器,例如rest-main-app和rest-events-app?
我有这个小程序设置 - 期望/ hello-world端点返回JSON,但HTTP主体是空的...
知道为什么它不返回任何东西?
(ns easycharge.core
(:use ring.util.response)
(:require [compojure.core :refer :all]
[compojure.route :as route]
[easycharge.routes.payments :as payments]
[easycharge.db.conn :as db]
[ring.middleware.defaults :refer :all]
[ring.middleware.json :as middleware]
[ring.middleware.cors :refer [wrap-cors]]
)
(:gen-class))
(defn std-redirect [] (redirect "https://www.hi.com/404/"))
(defroutes app-routes
(GET "/payments/:env/:id" [env id] {:hi "there"})
(GET "/hello-world" [] {:msg "hello-world"})
;; (payments/get-payment env id)
;; serves anything in resources/public
(route/resources "/")
(route/not-found (std-redirect)))
(def app (->
app-routes
(wrap-cors :access-control-allow-origin [#".*"]
:access-control-allow-methods [:get :put :post :delete])
(middleware/wrap-json-body {:keywords? true :bigdecimals? …Run Code Online (Sandbox Code Playgroud)