我对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>
如果我们使用以下方法会有什么缺点。这不会更有效率,响应时间也会很快。
答案 0 :(得分: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>
它允许在特定的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 {