编辑:这已经进入 Scalatra 并且应该很快就会可用,请参阅 https://github.com/scalatra/scalatra/pull/356
是的,默认情况下,Tomcat 在向它发出第一个 HTTP 请求之前不会加载 Servlet。不过,您可以使用load-on-startup 告诉Tomcat 加载Servlet。这是一种使用LifeCycle 以编程方式执行此操作的方法:
def mountServlet(sc: ServletContext, servlet: HttpServlet, urlPattern: String, loadOnStartup: Int = 1) {
val name = servlet.getClass.getName
val reg = Option(sc.getServletRegistration(name)) getOrElse {
val r = sc.addServlet(name, servlet)
servlet match {
case s: HasMultipartConfig =>
r.setMultipartConfig(s.multipartConfig.toMultipartConfigElement)
case _ =>
}
if (servlet.isInstanceOf[ScalatraAsyncSupport])
r.setAsyncSupported(true)
r.setLoadOnStartup(loadOnStartup)
r
}
reg.addMapping(urlPattern)
}
这定义了RichServletContext 中mount 方法的替代方法。重要的部分是r.setLoadOnStartup(loadOnStartup)。
你可以这样使用它:
override def init(context: ServletContext) {
val comments = CommentsRepository(mongoColl)
// mount the api + swagger docs
mountServlet(context, new CommentsApi(comments), "/api/*", 1)
mountServlet(context, new CommentsApiDoc(), "/api-docs/*", 2)
mountServlet(context, new CommentsFrontend(comments), "/*")
}
示例代码取自https://github.com/scalatra/scalatra-in-action/blob/d325c85feaf10706951c8edb88a3d82d0488faf3/comments-collector/src/main/scala/ScalatraBootstrap.scala。