在Web应用中,我们经常会发送类似如下格式的请求:

host:port/context/dir/


当然,上面到dir这一层的有时候会带,有时候则是直接请求根应用。这个时候,应用服务器就需要判断对应的请求以哪种形式 进行展现,例如对于一个目录的请求,这个时候,如果目录下包含特定的某个页面,那这个时候可能是要请求页面,也可能是 想进行目录的list操作。

这个时候,就需要用到Web应用中的 Welcome File

关于 Welcome File , Servlet规范中指明,它是在web描述文件中指定部分请求路径的一个有序的列表。主要用于 在请求指向一个directory entry,且没和任何的Web组件有关联的时候,进行append,从而决定具体请求的地址

 例如我们上面的请求形式,如果此时dir并没有对应到任何一个Servlet或Jsp上,此时有类似index.html这种welcomeFile的配置, 就会帮助请求进行定向。

如果上面的请求没有对应到的WelcomeFile,此时会根据应用服务器的配置,进行请求目录的列表(如果该操作是设为允许的话,可以查看之前关于List的文章Tomcat是如何响应静态资源的?),或者直接 返回404.

在应用中配置WelcomeFile也很简单,只需要在web.xml中直接指定即可,格式如下,来自规范中的描述:



假设我们在应用中指定了如下形式的welcomeFile

<welcome-file-list>    <welcome-file>index.html</welcome-file>    <welcome-file>default.jsp</welcome-file></welcome-file-list>

如果应用目录结构包含如下dir /test/index.html /test/a.jsp /hello/x.jsp /hello/default.jsp

此时,我们请求到应用的test目录时,就会被指向index.html。请求hello会被指向default.jsp

再来看下,在Tomcat中对应WelcomeFile的实现方式。

我们在web.xml这个描述文件中配置的内容,都会在应用部署时进行解析,配置应用。welcome-file-list也不例外。 在应用内指定的会是第一优先级。应用中没有显式的指定,就会使用应用服务器默认提供的conf/web.xml中的配置。

web.xml中的配置,会被保存到一个Set中

应用欢迎你-- WelcomeFile实现分析_java

在部署的时候,添加到StandardContext中

应用欢迎你-- WelcomeFile实现分析_java_02


后续,在接收到请求的时候,就需要判断具体的请求路径和welcomeFile的配置。

我们前面的文章里写过几次请求,也写过虚拟主机

如何不配置应用名访问应用?

Facade模式与请求处理

Tomcat多虚拟主机配置及原理


这其中都提到了一个叫Mapper的组件。人如其名,它就是为我们做指引的。在请求过程中,基本是按照这样一个流程:


EndPoint -> Processor -> CoyoteAdapter ->Mapper -> Pipeline -> Valve ...


这里Mapper在我们前面的文章中写过,会根据已经注册的虚拟主机,应用进行请求判断。对于本次文章提到的welcome,则是在判断后的流程中处理


判断中按照不同的匹配规则从前到后进行:


  • Exact Match

  • Prefix Match

  • Extension Match

  • Welcome resources processing for servlets

    • Welcome resources processing forexact macth

    • Welcome resources processing forprefix match

    • Welcome resources processing forphysical folder

  • Default servlet


以上我逻辑,基本都是根据请求的路径,进行不同的match,比较重要的一点是这里:

应用欢迎你-- WelcomeFile实现分析_java_03

如我们前面提到的,会在使用welcomeFile进行请求判断的时候,把它append到当前请求路径之后进行。