2013-01-23 10 views
1

我在java中設置了一些servlet。它們由路徑名稱標識。但如果請求的不存在,我想調用我的「默認servlet」。我試圖以這種方式解決它(請參閱我的代碼)。我測試了成功,但我不知道這是否會成爲不穩定(如「的servlet一個」被轉發到由某些線程管理或由OS別的默認的servlet ...)默認的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

是否有理由按代碼執行所有操作,而不是使用web.xml描述符編寫WAR文件? –

+0

這似乎碼頭具體?告訴你正在使用哪個servlet引擎。 – h22

+0

對不起,我忘了告訴你:我使用碼頭庫。 @David:目前我沒有任何web.xml。這是一個普通的Java項目。使用其他庫會更好嗎? – wassermine

回答

0

Servlet (3.0) specification要求容器始終如一地匹配URL模式:

  1. 容器將嘗試找到請求到Servlet的路徑的路徑的精確匹配。成功的匹配會選擇 servlet。
  2. 容器將遞歸地嘗試匹配最長的路徑前綴。這是通過逐步將目錄 逐步放在路徑樹上,使用/字符作爲路徑分隔符來完成的。匹配最長的 決定了所選的servlet。
  3. 如果URL路徑中的最後一個段包含擴展名(例如.jsp),那麼servlet容器將嘗試匹配 處理擴展請求的servlet。擴展名被定義爲在最後的.字符之後的最後一個段的 部分。
  4. 如果前三條規則都不會導致servlet匹配,那麼容器將嘗試提供適合請求的 資源的內容。如果爲「 」應用程序定義了「默認」servlet,它將被使用。許多容器提供默認的服務內容的默認servlet。

容器必須使用區分大小寫的字符串比較進行匹配。

因此,同一個URL應該每次匹配相同的一組模式。