在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中
在部署的时候,添加到StandardContext中
后续,在接收到请求的时候,就需要判断具体的请求路径和welcomeFile的配置。
我们前面的文章里写过几次请求,也写过虚拟主机
这其中都提到了一个叫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进行请求判断的时候,把它append到当前请求路径之后进行。