详解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的配置。

也就是说:当自定义Servlet和系统默认defaultServlet的拦截路径< url-pattern >/</ url-pattern >相同时,自定义Servlet优先级高于defaultServlet。对于相同路径先由自定义Servlet处理;当自定义Servlet无法处理时再交由系统默认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 的请求进行筛查,小结如下:

  • 1、DispatcherServlet优先级高于默认处理器handler。
  • 2、假若请求是经过映射的,则由DispatcherServlet处理。
  • 3、假若请求与静态资源相关则将该请求转交默认处理器handler处理。

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服务器帮我们进行相关配置。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谷哥的小弟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值