Http请求到来时,Servlet容器如Tomcat需要分发请求到Servlet,然后由Servlet处理请求逻辑
显然,Servlet容器需要识别部署在其中的Servlet对象,Servlet的部署描述符正是起到此标识作用
一个Servlet Web应用程序部署到Tomcat时的目录结构为:
TOMCAT_DIR/webapps/+$app_name
+$=WEB-INF
+$=classes
+$=lib
=web.xml
+images +css +js +json +xml +txt +doc +excel +jsp +html +...
index.jsp index.html ...
+images +css +js +json +xml +txt +doc +excel +jsp +html +...
index.jsp index.html ...
+表示目录,$表示必需,=表示固定命名
app_name为应用程序名
WEB-INF下包括程序类文件目录classes、三方库目录lib、web配置文件web.xml以及所有只能通过应用程序间接访问的静态资源
WEB-INF外的静态资源可以直接通过url路径访问
Servlet的部署描述符可以配置在web.xml中,也可以直接注解在Servlet类头,Tomcat在启动时都能识别这些标记
项目的web.xml主要用以配置项目的Welcome_Pages欢迎页、Filter过滤器、Listener监听器、Servlet描述符、会话超时时间等
项目的web.xml并不是必需的,原因在于web.xml提供的功能不是每个项目都需要的,而且有其它更简单的办法来使用这些功能--xml文件太繁琐了
TOMCAT_DIR/conf目录下有作用于全局web应用web.xml文件,当一个web项目要启动时,Tomcat会首先加载全局web.xml文件,然后再加载项目的web.xml文件
Tomcat的启动和运行逻辑,不在本文讨论范围之内
一个Java Web项目完全可以不需要web.xml,尤其是使用Spring框架时
Spring对上述各项配置进行了默认实现,并通过各种各样的注解的方式开放给开发者定制自己的过滤器、监听器等功能,最样板的代码则奉行"约定大于配置"的统一思想
除了各种注解,Spring提供了org.springframework.web.WebApplicationInitializer接口以实现web.xml所提供的功能
实际使用中,无论是Spring还是SpringBoot,根本不会再使用这些古老的约定,开发者更多的还是使用注解来简单而又高效地完成所需的功能
一个前后端分离的Spring Web应用程序部署到Tomcat时的目录结构已经简化为:
TOMCAT_DIR/webapps/+$app_name
+$=WEB-INF
+$=classes
+$=lib
与此同时,应用程序中也不再需要用户定义各种各样的Servlet类,对比Servlet的历史,这是一个巨大的进步
回归正题,Servlet的部署描述符在web.xml中的配置格式为:
<servlet>
<servlet-name>XxxServlet</servlet-name>
<servlet-class>full-class-path-of-XxxServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>XxxServlet</servlet-name>
<url-pattern>/xxx</url-pattern>
</servlet-mapping>
...
<servlet>
<servlet-name>XyyServlet</servlet-name>
<servlet-class>full-class-path-of-XyyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>XyyServlet</servlet-name>
<url-pattern>/yyy</url-pattern>
</servlet-mapping>
在Servlet类头注解的格式为:
@WebServlet(name="XxxServlet",urlPatterns = {"/xxx"})
public class XxxServlet extends HttpServlet