详解DefaultServlet与JspServlet 妖狐艹你老母 2022-10-06 15:56 174阅读 0赞 -------------------- # 版权声明 # * 本文原创作者:谷哥的小弟 * 作者博客地址:http://blog.csdn.net/lfdfhl -------------------- # 概述 # 平常我们在开发中编写完Servlet之后都会在web.xml配置文件对其进行配置以便响应相关请求。可是,在客户端对html、jsp、css的访问算请求么?或者通过链接访问应用内的资源文件算请求么?或者对于jsp文件的访问算是请求么?算!可是,对于类似的请求为什么我们什么配置都没做却可以正常访问呢? # DefaultServlet详解 # 我们打开Tomcat服务器的web.xml文件。 ![在这里插入图片描述][20210614221422109.png] ## 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服务器帮我们进行相关配置。 [20210614221422109.png]: /images/20221005/b136f4bebd07443394593616aac3c124.png
还没有评论,来说两句吧...