我有一个clojure / ring项目,它有两个不同的应用程序/处理程序在不同的端口上运行(一个用于api,一个用于web前端)。它们共享大量代码,但每个代码都有自己的命名空间,它可以完成该接口特有的所有工作。现在我想将它部署为在tomcat或类似的东西中运行的servlet(实际上它需要在任何servlet容器中工作)。我遇到了麻烦,因为似乎lein-ring假设servlet中只有一个处理程序。例如,在我的project.clj中,我有这一行:
:ring {:handler caribou.api/app
:servlet-name "caribou"
:init caribou.api/init}
这对api来说很棒,但现在前端呢?我是否需要创建另一个包含此项目的项目,以便它可以拥有自己的处理程序和servlet? servlet总是在一个端口上运行吗?
基本上我不确定有两件事:我不是来自java背景,所以我不确定servlet方法是怎么回事,它有什么限制,而且我不知道究竟是怎么回事clojure转换为servlet范例,足以以一般方式构建此项目。
感谢任何帮助,谢谢!
答案 0 :(得分:1)
同一个容器中的所有servlet都是从同一个服务器提供的,因此也是同一个端口。通常,您可以通过为其提供不同的URI前缀来识别不同的servlet,例如/servlet1
或/my/servlet
。
我不知道是否有什么东西阻止你用Ring创建单独的servlet,但一般来说,如果你的整个应用程序都是基于Clojure的,那似乎不是一个好主意。至少,正如您所指出的,lein-ring插件强制只有一个servlet用于Web应用程序。
您可以做的一件事是创建一个父处理程序,该处理程序根据URI委托给应用程序或API处理程序。这实际上为您提供了控制,无需将逻辑委托给Servlet API。