我一直在尝试用Clojure编写Web应用程序,直到现在还很容易。我遵循了查斯·埃默里克(Chas Emerick)出色的截屏视频,开始了clojure,并很快启动并运行了一个URL缩短器。接下来,我希望能够部署它,这就是麻烦开始的时候。
当我在开发中运行它或将其作为根 Web 应用程序部署到 Jetty 时,一切都很好,但是当我使用上下文路径部署它时,它不会。或者,更确切地说,它几乎有效。我所有的 Compojure 路由仍然有效,但 HTML 文件中FORM
操作链接已损坏并给了我 404。
这是 Compojure 路由设置:
(defroutes app*
(rt/resources "/")
(GET "/" request (homepage request))
(POST "/shorten" request
(let [id (shorten (-> request :params :url))]
(response/redirect "/")))
(GET "/:id" [id] (redirect id)))
(def app (compojure.handler/site app*))
这是主页模板的 HTML:
<!DOCTYPE html>
<html>
<head>
<title>Insert title here</title>
<link type="text/css" rel="stylesheet" href="site.css" />
</head>
<body>
<form method="POST" action="shorten">
<input type="text" name="url" />
<input type="submit" value="Shorten!" />
</form>
</body>
</html>
问题是action="shorten"
URL。当部署到 Jetty 时,上下文路径为 /example
一切正常,直到我触发表单提交。然后Jetty抱怨它找不到localhost:8080/shorten
这意味着(我认为)它没有被视为相对路径,而是绝对路径。
所以,我的问题是:如何解决这个问题?我想我可以只在操作链接中指定完整路径,但这会不灵活,并且更难在开发中运行 servlet。有没有办法配置我的出路?或者一些神奇的URL前缀(如Razor中的~/
)只会做正确的事情?
我遇到了同样的问题。更改行:
(POST "/shorten" request
自
(POST "shorten" request
它应该有效(嗯,它为我做到了)