【问题标题】:Can I add multiple servlets to a WebAppContext?我可以将多个 servlet 添加到 WebAppContext 吗?
【发布时间】:2012-11-15 11:43:49
【问题描述】:

我有以下 Scala 代码来使用 Scalatra 设置 Jetty 服务器。

val server = new Server(8080)
val context = new WebAppContext()
context.setResourceBase("visualization")
context.addServlet(new ServletHolder(new CallTreeServlet(dataProvider)), "/*")
context.addServlet(new ServletHolder(new DataLoadingServlet(dataProvider)), "/*")
server.setHandler(context)

我的问题是它似乎只有在我注册一个 servlet 时才有效。

如果我注册了多个,就像我在发布的代码中所做的那样,它只会加载其中一个。

是否可以加载多个 servlet?我猜是这样,但我不知道怎么做。

如果我尝试从第一个 servlet 加载页面,我收到此错误消息,仅引用属于第二个 servlet 的页面:

Requesting "GET /callTrees" on servlet "" but only have:
GET /components
POST /load
POST /searchCallTrees
POST /selectPlugIn

【问题讨论】:

  • 是什么让你说它没有加载?此外,您已经将它们都映射到所有请求,因此如果一个收到请求并处理了它,我不确定另一个将能够做什么。
  • 我认为它们没有加载,因为如果我尝试从第一个 servlet 加载页面,我会收到此响应消息,我会收到我添加到问题中的消息。
  • 你是说看起来只有第二个 servlet 收到了请求?
  • 是的,这似乎正在发生。是不是因为我将两者都映射到了所有请求?

标签: scala servlets jetty scalatra


【解决方案1】:

要解决此问题,您应该验证 servlet 生命周期。一种方便的方法是仔细阅读 servlet 容器的日志,以查看它在启动 Web 应用程序时报告的内容。它应该告诉您每个 Web 应用程序(servlet 上下文)和每个 servlet。 . .

但是,我想我明白您的问题所在。您的 servlet 路径映射有点时髦。在我看来,您正在映射两个 servlet 以接收所有请求。从实际的角度来看,这是行不通的,并且在 servlet 规则方面可能行不通。来自 servlet 规范:

SRV.11.2
Specification of Mappings
In the Web application deployment descriptor, the following syntax is used to define
mappings:
• A string beginning with a ‘/’ character and ending with a ‘/*’ suffix is used
for path mapping.
• A string beginning with a ‘*.’ prefix is used as an extension mapping.
• A string containing only the ’/’ character indicates the "default" servlet of
the application. In this case the servlet path is the request URI minus the con-
text path and the path info is null.
• All other strings are used for exact matches only.

我建议你让它们都独一无二。现在看起来,它们都位于“/*”,有点像“默认 servlet”,但不是 . . .

为什么不尝试“/first/”和“/second/”作为健全性检查。然后从那里开始获取您喜欢的配置。

【讨论】: