详解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关于静态资源的过滤(详解)(或者叫做拦截器)