使用 web.xml 进行 Servlet 映射

问题描述 投票:0回答:1

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

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

java web-applications servlets java-ee-5
1个回答
57
投票

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

另请参阅:

© www.soinside.com 2019 - 2024. All rights reserved.