使用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页面