我在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和jetty库。
感谢您的帮助。
答案 0 :(得分:0)
Servlet (3.0) specification要求容器始终如一地匹配网址格式:
- 容器将尝试查找请求路径与servlet路径的完全匹配。成功的比赛选择 的servlet。
- 容器将递归尝试匹配最长的路径前缀。这是通过逐步降低路径树的目录来完成的 一次使用
/
字符作为路径分隔符。最长的 match确定所选的servlet。- 如果URL路径中的最后一个段包含扩展名(例如
.jsp
),则servlet容器将尝试匹配一个servlet 处理扩展请求。扩展名定义为 最后一个.
字符后的最后一段的一部分。- 如果前三个规则都没有导致servlet匹配,则容器将尝试提供适合的内容 资源要求。如果为此定义了“默认”servlet 应用程序,它将被使用。许多容器提供隐含的 用于提供内容的默认servlet。
醇>容器必须使用区分大小写的字符串比较进行匹配。
因此,每次相同的URL都应匹配相同的模式集。