我对clojure和compojure还不熟悉,并且尝试了compojure和ring,以创建一个基本的web应用程序。
这是我的handler.clj
(ns gitrepos.handler
(:require [compojure.core :refer :all]
[compojure.route :as route]
[ring.util.response :as resp]
[ring.middleware.defaults :refer [wrap-defaults site-defaults]]))
(defroutes app-routes
(GET "/" [] (resp/file-response "index.html" {:root "public"}))
(route/not-found "Not Found"))
(def app
(wrap-defaults app-routes site-defaults))我在/resources/public下有这个index.html文件,但是应用程序没有呈现这个html文件。相反,让找不到
我搜索了很多它,甚至这个在Compojure中在/默认情况下向index.html提供服务似乎也解决不了这个问题。
不知道我在这里错过了什么。
发布于 2016-03-08 16:52:22
也许您想尝试使用一些模板库,比如塞尔默。所以你可以这样做:
(defroutes myapp
(GET "/hello/" []
(render-string (read-template "templates/hello.html"))))或者传递一些价值:
(defroutes myapp
(GET "/hello/" [name]
(render-string (read-template "templates/hello.html") {name: "Jhon"})))正如@piotrek所说:
(GET "/" [] (resource-response "index.html" {:root "public"}))发布于 2016-03-06 16:15:01
纳文
这里有一个我自己的片段,似乎很有用。与您的相比,您在defroutes中没有资源路径。
(defroutes default-routes
(route/resources "public")
(route/not-found
"<h1>Resource you are looking for is not found</h1>"))
(defroutes app
(wrap-defaults in-site-routes site-defaults)
(wrap-defaults test-site-routes site-defaults)
(wrap-restful-format api-routes)
(wrap-defaults default-routes site-defaults))发布于 2016-03-06 17:00:05
您不需要指定使用resoures/public在此目录下使用file-response服务文件的路由,这要归功于site-defaults。您所缺少的唯一部分是将/路径映射到/index.html,这可以用您从另一个问题中提到的代码来完成。因此,解决办法是:
(defn wrap-dir-index [handler]
(fn [req]
(handler
(update
req
:uri
#(if (= "/" %) "/index.html" %)))))
(defroutes app-routes
(route/not-found "Not Found"))
(def app
(-> app-routes
(wrap-defaults site-defaults)
(wrap-dir-index)另外,您应该更喜欢使用ring.util.response/resource-response,因为它服务于类路径中的文件,并且当您将应用程序打包到jar文件中时,它也会工作。file-response使用文件系统来定位文件,并且无法从jar文件内部工作。
https://stackoverflow.com/questions/35828884
复制相似问题