使用 web.xml 的 Servlet 映射

Posted

技术标签:

【中文标题】使用 web.xml 的 Servlet 映射【英文标题】:Servlet Mapping using web.xml 【发布时间】:2012-01-02 03:43:19 【问题描述】:

我对 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 匹配,并尝试找到相应的 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 架构会影响运行时性能? 好吧,我只是关心获取实际值所需的通过次数 通常,servlet 容器只读取web.xml 并在内存中创建它的表示。它比每次请求到来时读取web.xml 快数倍。 A tutorial to create servlets and map servlets in web.xml 【参考方案1】:

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

另见:

How do servlets work? Instantiation, sessions, shared variables and multithreading Difference between each instance of servlet and each thread of servlet in servlets? Our Servlets wiki page

【讨论】:

感谢 BalusC ...但在我的方法中,您可以定义多个 servlet,例如 foo.Servlet /enrollfoo.Servlet2 /workfoo.Servlet3 /read 与过滤器映射相同 您基本上是在创建 3 个 servlet 实例而不是 1 个。请阅读“另见”链接以更好地了解 servlet 的工作原理。 很棒的答案!很好解释! :) 非常感谢!

以上是关于使用 web.xml 的 Servlet 映射的主要内容,如果未能解决你的问题,请参考以下文章

使用WebServlet注解和web.xml配置servlet映射路径的区别及注意事项

如何设置 web.xml 和 dispatcher-servlet.xml 进行映射?

GWT RPC 警告:servlet 有映射,但 web.xml 没有对应的映射

6jsp和servlet在xml得映射和web.xml介绍

web.xml中的url-pattern映射规则

web.xml中的url-pattern映射规则