1

我在java中设置了一些servlet。它们由路径名标识。但是,如果请求的不存在,我想调用我的“默认 servlet”。我试图以这种方式解决它(请参阅我的代码)。我成功测试了它,但我不确定它是否会变得不稳定(例如“servlet one”被转发到由某些线程管理或操作系统引起的其他东西引起的默认servlet......)

Server server = new Server(8080);
WebAppContext context = new WebAppContext();
context.setContextPath("/");
HandlerCollection handlers = new HandlerCollection();
handlers.addHandler(context);
RequestLogHandler requestLogHandler = new RequestLogHandler();
handlers.addHandler(requestLogHandler);
server.setHandler(handlers);

context.setResourceBase("WebContent");
context.addServlet(new ServletHolder(new MyFirstServlet()), "/servlet one/*");
context.addServlet(new ServletHolder(new MySecondServlet()), "/servlet two/*");
context.addServlet(new ServletHolder(new DefaultServlet()), "/*");
context.setInitParameter("dirAllowed", "true");

server.start();

我将 java 与码头库一起使用。

谢谢你的帮助。

4

1 回答 1

0

Servlet (3.0) 规范要求容器一致地匹配 URL 模式:

  1. 容器将尝试找到请求路径与 servlet 路径的完全匹配。成功的匹配选择 servlet。
  2. 容器将递归地尝试匹配最长的路径前缀。这是通过使用/字符作为路径分隔符一次将路径树下移一个目录来完成的。最长的匹配决定了选择的 servlet。
  3. 如果 URL 路径中的最后一段包含扩展(例如.jsp),则 servlet 容器将尝试匹配处理扩展请求的 servlet。.扩展被定义为最后一个字符之后的最后一段的一部分。
  4. 如果前三个规则都没有导致 servlet 匹配,则容器将尝试提供适合所请求资源的内容。如果为应用程序定义了一个“默认”servlet,它将被使用。许多容器为服务内容提供了一个隐式的默认 servlet。

容器必须使用区分大小写的字符串比较进行匹配。

因此,相同的 URL 每次都应该匹配相同的模式集。

于 2013-01-23T09:43:00.483 回答