Tomcat架构解析之DefaultServlet和JspServlet

一、前言

    Tomcat在$ CATALINA_BASE/conf/web.xml中默认定义了两个Servlet:DefaultServlet和JspServlet,而且由于$ CATALINA_BASE/conf/web.xml为Web应用的默认部署描述文件,因此这两个Servlet会默认存在所有Web应用容器中。

二、DefaultServlet

    DefaultServlet为默认的Servlet,当客户端请求不能匹配其他所有Servlet时,将由Servlet处理。

    DefaultServlet主要用于处理静态资源,如HTML、图片、CSS、JS文件等,而且为了提升服务器性能,Tomcat对访问文件进行缓存。按照默认配置,客户端请求路径与资源的物理路径是一致的。

    当然,如果我们希望DefaultServlet只加载static目录下的资源,只需要将url-pattern改为“/static/*”即可(此时,DefaultServlet将不再是默认Servlet)。但是,这不会改变我们的请求路径,也就是说资源指向的仍旧是其物理路径,这是因为DefaultServlet根据完整的请求地址获取文件而非基于Servlet的相对路径。

    如果我们希望Web应用覆盖Tomcat的DefaultServlet配置,只需将“ / ”添加到自定义Servlet的url-pattern中即可(此时,自定义Servlet将成为默认Servlet)。

    DefaultServlet除了支持访问静态资源,还支持查看目录列表,只需要将名“listings”的init-param设置为true。此时如果我们输入http://127.0.0.1:8080/myapp/static/,且该目录下没有任何欢迎文件(welcome-file-list配置),Tomcat将返回对应物理目录下的文件目录列表。

    默认情况下,Tomcat以HTML的形式输出文件目录列表(包括文件名、大小
最后修改时间)。此外,可以通过参数localXsltFile、contextXsltFile或者globalXsltFile指定一个XSL或者XSLT文件。此时,Tomcat将以XML形式输出文件目录,并使用指定的XSL或者XSLT文件将其转换为响应输出。通过这种方式,我们可以根据需要定制文件目录输出界面。

DefaultServlet支持的初始化参数如下图所示:
Tomcat架构解析之DefaultServlet和JspServlet_第1张图片

三、JspServlet

    默认情况下,JspServlet的url-pattern为*.jsp和*.jspx,因此他负责处理所有JSP文件的请求。

    JspServlet主要完成以下工作:

  • 根据JSP文件生成对应Servlet的Java代码(JSP文件生成类的父类我org.apache.jasper.runtime.HttpJspBase——实现了Servlet接口)。
  • 将Java代码编译为Java类。Tomcat支持Ant和JDT(Eclipse提供的编译器)两种编译JSP类,默认采用JDT。
  • 构造Servlet类实例并且执行请求。

    J单文件的Servlet示例如下所示:
Tomcat架构解析之DefaultServlet和JspServlet_第2张图片
    并没有指定servlet-class,而是增加了jsp-file,使其指向一个JSP文件。该Servlet处理所有扩展名为“*.x”的请求。

    Tomcat如果指定了jsp-file,会自动将servlet-class设置为JspServlet,并且将默认JspServlet中设置的初始化参数添加到当前Servlet。

你可能感兴趣的:(Tomcat)