使用web.xml进行Servlet映射

36

我对web.xml中servlet mapping的结构感到困惑,虽然我能够执行它,但我正在尝试弄清楚为什么部署描述符中会有这样的模式。

<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>

就我所理解的来看,每当一个请求到达 "/enroll" 的 url-pattern 时,servlet 容器会将 servlet-name 与 url-pattern 进行匹配,并尝试找到相应的 servlet-path,然后将控制权转发给 foo.Servlet。因此基本上会有两个阶段,一个是查找 servlet-name,另一个是查找 servlet-path。我的问题是,如果容器被设计成以下方式

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

如果我们采用以下方法,会有什么缺点?这样做不是更有效率,响应时间也更快吗?


你认为为什么使用不同的XML模式会影响运行时性能? - Matt Ball
我只是担心需要多少次通过才能获取实际值。 - Mike
6
通常,Servlet容器只会读取web.xml文件并在内存中创建它的表示形式。这比每次请求到来时都读取web.xml要快得多。 - Piotr Nowicki
创建Servlet并在web.xml中映射Servlet的教程。 - Joby Wilson Mathews
1个回答

56

它允许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>

它允许将过滤器映射到特定的servlet:

<filter-mapping>
    <filter-name>Filter1</filter-name>
    <servlet-name>Servlet1</servlet-name>
</filter-mapping>
你的建议两个都不支持。请注意,web.xml 文件只在应用程序启动时读取和解析一次,而不是像你所想的那样在每个 HTTP 请求时都要读取。
自 Servlet 3.0 起,有 @WebServlet 注释可以最小化这个样板代码:
@WebServlet("/enroll")
public class Servlet1 extends HttpServlet {

另请参阅:


2
感谢BalusC...但在我的方法中,您可以定义多个servlet,如<web-app> <servlet> <servlet-name>foo.Servlet</servlet-path> <url-pattern>/enroll</url-pattern> <servlet-name>foo.Servlet2</servlet-path> <url-pattern>/work</url-pattern><servlet-name>foo.Servlet3</servlet-path> <url-pattern>/read</url-pattern> </servlet> </web-app>,并且我们也可以使用过滤器映射来实现相同的功能。 - Mike
你基本上创建了3个servlet实例而不是1个。请阅读“参见”链接以更好地理解servlet的工作原理。 - BalusC
1
太棒了!解释得非常清楚! :) 非常感谢! - Fisher Coder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接