详解DefaultServlet与JspServlet

Posted 谷哥的小弟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了详解DefaultServlet与JspServlet相关的知识,希望对你有一定的参考价值。


版权声明

  • 本文原创作者:谷哥的小弟
  • 作者博客地址:http://blog.csdn.net/lfdfhl

概述

平常我们在开发中编写完Servlet之后都会在web.xml配置文件对其进行配置以便响应相关请求。可是,在客户端对html、jsp、css的访问算请求么?或者通过链接访问应用内的资源文件算请求么?或者对于jsp文件的访问算是请求么?算!可是,对于类似的请求为什么我们什么配置都没做却可以正常访问呢?

DefaultServlet详解

我们打开Tomcat服务器的web.xml文件。
在这里插入图片描述

DefaultServlet配置分析

在该文件中,我们可找到一个类型为org.apache.catalina.servlets.DefaultServlet名为default的Servlet;详情如下:

    <servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

在以上配置中通过 < load-on-startup >1</ load-on-startup >指定当应用启动时立即加载该Servlet。这一点与普通的Servlet有所差异;默认情况下,只有当用户第一次发起请求访问普通Servlet时才会实例化并加载该Servlet。所以,DefaultServlet与普通的Servlet加载时机是明显不同的。

接下来,继续看映射配置。

    <!-- The mapping for the default servlet -->
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

在以上配置中通过< url-pattern >/</ url-pattern >表示该Servlet可以处理所有的请求。所以,当自定义Servlet无法处理的请求都会转交至该DefaultServlet处理。

一般而言,只有defaultServlet会将url-pattern配置为/。假若,自定义的Servlet也将< url-pattern ></ url-pattern >配置为/则将覆盖defaultServlet的配置。

DefaultServlet小结

当服务端收到关于Servlet的请求之后交由自定义Servlet处理。

当服务端收到关于静态资源的请求时交由DefaultServlet处理。

当自定义Servlet的< url-pattern ></ url-pattern >与Tomcat自带Servlet的< url-pattern ></ url-pattern >配置相同时,优先采用自定义Servlet中的相关配置。假若,自定义Servlet无法处理时再交由Tomcat自带Servlet处理。

DefaultServlet应用场景

在Spring MVC框架中采用RESTFul风格进行API设计。此时,在web.xml中对DispatcherServlet做如下配置:

	<!-- 配置DispatcherServlet -->
	<servlet>
		<servlet-name>springmvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<!-- 指定SpringMVC配置文件路径和名称 -->
			<param-value>classpath:springmvc.xml</param-value>
		</init-param>
		<!-- 指定Tomcat启动时加载该Servlet,值越小优先级越高 -->
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>springmvc</servlet-name>
		<!-- 拦截所有请求 -->
		<url-pattern>/</url-pattern>
	</servlet-mapping>

在该配置中通过< url-pattern >/</ url-pattern >拦截包括了静态资源在内的所有请求!故,此时需要在web.xml开启类似于DefaultServlet的配置用于处理静态资源,代码如下:

<mvc:default-servlet-handler/>  

在此配置下在Spring MVC关于Servlet的请求交由DispatcherServlet处理,关于静态资源的请求DispatcherServlet无法处理则交由< mvc:default-servlet-handler/> 处理。

< mvc:default-servlet-handler/> 将在SpringMVC上下文中定义一个类型为DefaultServletHttpRequestHandler的Handler。该Handler会对进入 DispatcherServlet 的请求进行筛查,如果是没有经过映射的请求则将该请求交由Web应用服务器默认的Servlet 处理,如果不是静态资源的请求则交由DispatcherServlet处理。

JspServlet详解

类似地,在Tomcat服务器的web.xml文件中存在一个类型为org.apache.jasper.servlet.JspServlet名为jsp的Servlet。默认情况下,该Servlet用于处理jsp相关请求。

    <servlet>
        <servlet-name>jsp</servlet-name>
        <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
        <init-param>
            <param-name>fork</param-name>
            <param-value>false</param-value>
        </init-param>
        <init-param>
            <param-name>xpoweredBy</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>3</load-on-startup>
    </servlet>
    <!-- The mappings for the JSP servlet -->
    <servlet-mapping>
        <servlet-name>jsp</servlet-name>
        <url-pattern>*.jsp</url-pattern>
        <url-pattern>*.jspx</url-pattern>
    </servlet-mapping>

所以,我们平常看到的关于静态资源的请求和jsp的请求之所以有响应是因为Tomcat服务器帮我们进行相关配置。

以上是关于详解DefaultServlet与JspServlet的主要内容,如果未能解决你的问题,请参考以下文章

Tomcat如何快速响应静态资源(DefaultServlet+浏览器缓存)

Tomcat如何快速响应静态资源(DefaultServlet+浏览器缓存)

conf/web.xml-------------org.apache.catalina.servlets.DefaultServlet

Spring MVC关于静态资源的过滤(详解)(或者叫做拦截器)

Spring MVC关于静态资源的过滤(详解)(或者叫做拦截器)

Spring MVC关于静态资源的过滤(详解)(或者叫做拦截器)