默认servlet - 这是否正常工作?

时间:2013-01-23 08:41:11

标签: java servlets

我在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库。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

Servlet (3.0) specification要求容器始终如一地匹配网址格式:

  
      
  1. 容器将尝试查找请求路径与servlet路径的完全匹配。成功的比赛选择   的servlet。
  2.   
  3. 容器将递归尝试匹配最长的路径前缀。这是通过逐步降低路径树的目录来完成的   一次使用/字符作为路径分隔符。最长的   match确定所选的servlet。
  4.   
  5. 如果URL路径中的最后一个段包含扩展名(例如.jsp),则servlet容器将尝试匹配一个servlet   处理扩展请求。扩展名定义为   最后一个.字符后的最后一段的一部分。
  6.   
  7. 如果前三个规则都没有导致servlet匹配,则容器将尝试提供适合的内容   资源要求。如果为此定义了“默认”servlet   应用程序,它将被使用。许多容器提供隐含的   用于提供内容的默认servlet。
  8.         

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

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