使用web.xml进行Servlet映射

Mik*_*ike 29 java servlets web-applications java-ee-5

我对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>
Run Code Online (Sandbox Code Playgroud)

现在只要我理解url-pattern"/ enroll"的请求,servlet容器就会将servlet-name与url-pattern匹配,并尝试查找相应的servlet-path并转发控件to foo.Servlet.所以基本上会有两个传递一个用于查找servlet-name而另一个用于servlet-path,我的问题是如果容器设计为以下列方式工作

<web-app>
        <servlet>
             <servlet-name>foo.Servlet</servlet-path>
             <url-pattern>/enroll</url-pattern>
        </servlet>
</web-app>
Run Code Online (Sandbox Code Playgroud)

如果我们使用以下方法会有什么缺点.这不会更有效,响应时间也会很快.

Bal*_*usC 48

它允许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>
Run Code Online (Sandbox Code Playgroud)

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

<filter-mapping>
    <filter-name>Filter1</filter-name>
    <servlet-name>Servlet1</servlet-name>
</filter-mapping>
Run Code Online (Sandbox Code Playgroud)

你的提议不会支持他们.请注意,web.xml在应用程序启动期间只读取和解析一次,而不是像您想象的那样在每个HTTP请求上读取和解析.

从Servlet 3.0开始,有一个@WebServlet注释可以最小化这个样板:

@WebServlet("/enroll")
public class Servlet1 extends HttpServlet {
Run Code Online (Sandbox Code Playgroud)

也可以看看:

  • 感谢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>和我们一样可以使用过滤器映射 (2认同)