使用web.xml的Servlet映射

我对servlet映射的web.xml的结构有困惑,我没有执行任何问题,但我想知道为什么我们在部署描述符中有这样的模式。

<web-app> <servlet> <servlet-name>Servlet1</servlet-name> <servlet-path>foo.Servlet</servlet-path> </servlet> <servlet-mapping> <servlet-name>Servlet1</servlet-name> <url-pattern>/enroll</url-pattern> </servlet-mapping> </web-app> 

现在就我的理解而言,每当有一个请求时,url-pattern“/ enroll”,servlet容器就会把servlet-name和url-pattern相匹配,并且会尝试find相应的servlet-path,并将控制到foo.Servlet。 所以基本上会有两个传递一个查找servlet名称和另一个servletpath,我的问题是,如果容器devise工作在以下方式

 <web-app> <servlet> <servlet-name>foo.Servlet</servlet-path> <url-pattern>/enroll</url-pattern> </servlet> </web-app> 

如果我们使用下面的方法会有什么缺点? 这不是更有效率,响应时间会很快。

它允许servlet拥有多个servlet映射:

 <servlet> <servlet-name>Servlet1</servlet-name> <servlet-path>foo.Servlet</servlet-path> </servlet> <servlet-mapping> <servlet-name>Servlet1</servlet-name> <url-pattern>/enroll</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>Servlet1</servlet-name> <url-pattern>/pay</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>Servlet1</servlet-name> <url-pattern>/bill</url-pattern> </servlet-mapping> 

它允许filter映射到特定的servlet上:

 <filter-mapping> <filter-name>Filter1</filter-name> <servlet-name>Servlet1</servlet-name> </filter-mapping> 

你的build议不会支持他们。 请注意,在应用程序启动期间, web.xml被读取和parsing一次,而不是像您所想的那样在每个HTTP请求上进行parsing。

从Servlet 3.0开始,有一个最小化这个样板的@WebServlet注解:

 @WebServlet("/enroll") public class Servlet1 extends HttpServlet { 

也可以看看:

  • servlets如何工作? 实例化,会话,共享variables和multithreading
  • servlet的每个实例与servlet中每个servlet的线程之间的区别?
  • 我们的Servlets wiki页面