Web容器中DefaultServlet详解

一、前言

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

二、什么是DefaultServlet

  我们以最熟悉的Tomcat服务器为例,我们都知道Jsp和Servlet都需要web容器才能运行。但实际上,我们的web应用中可以没有任何Servlet或者jsp(至少表面上是这样的)只需要一个web.xml,甚至在Servlet 3.0中,这个也可以省略。但是我们同样可以通过链接来访问应用内的资源文件,例如.jpg、.html、.js这类的静态文件,这就是DefaultServlet的作用了。

  DefaultServlet为默认的Servlet,当客户端请求不能匹配其他所有Servlet时,将由DefaultServlet处理。DefaultServlet主要用于处理静态资源,如HTML、图片、CSS、JS文件等。它在Tomat的安装目录下的conf/web.xml中有定义该web.xml是作用于部署到Tomcat中的所有web application,会和application配置的web.xml进行合并

如果我们希望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文件将其转换为响应输出。通过这种方式,我们可以根据需要定制文件目录输出界面。

<!--在conf/web.xml中的DefaultServlet的定义-->
<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>

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

三、DefaultServlet在实际开发中的应用

1. JSP/Servlet架构的web项目

 这类架构的项目无需显示配置DefaultSerlvet,一般来说,静态资源请求图片等会交给DefaultServlet处理,jsp后缀请求会交给JspServlet。

2. SSM中DispatcherServlet的url-pattern配置

 ● 当url-pattern配置为“*.do、*.action等”这类带指定后缀的时候,静态资源文件依旧可以交给DefaultServlet处理。这里,DispatcherServlet只会拦截“.do、.action”这类带指定后缀的请求,不会拦截类似.jsp、*.jpg的请求。

<!-- SpringMVC -->
  <servlet>
      <servlet-name>SpringMVC</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <init-param>
          <description>SpringMVC</description>
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath:SpringMVC.xml<</param-value>
      </init-param>
      <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
      <servlet-name>SpringMVC</servlet-name>
      <url-pattern>*.do</url-pattern>
  </servlet-mapping>
      <servlet-mapping>
      <servlet-name>SpringMVC</servlet-name>
      <url-pattern>*.action</url-pattern>
  </servlet-mapping>

 ● 当DispatcherServlet的servlet-mapping配置为“/”的时候,这时候会覆盖DefaultServlet的配置(DispathcerServlet会更先匹配到),那么对于后缀为.jpg、.png等类似这种静态资源的请求就不会交给DefaultServlet来处理,而是由DispathcerServlet进行处理(之前是DefaultServlet会处理),所以请求这类资源就会得到404错误,所以我们需要有额外的配置来解决这个问题。

  ● 想要继续通过DefaultServlet来处理,我们需要在应用的web.xml中将常用的静态资源URL映射到DefaultServlet上。

 <!--通过DefaultServlet来处理jpg-->
  <servlet-mapping>
      <servlet-name>default</servlet-name>
      <url-pattern>*.jpg</url-pattern>
  </servlet-mapping>
  <!--通过DefaultServlet来处理png-->
  <servlet-mapping>
      <servlet-name>default</servlet-name>
      <url-pattern>*.png</url-pattern>
  </servlet-mapping>
  <!--通过DefaultServlet来处理.js文件-->
  <servlet-mapping>
      <servlet-name>default</servlet-name>
      <url-pattern>*.js</url-pattern>
  </servlet-mapping>
  <!--通过DefaultServlet来处理.css文件-->
  <servlet-mapping>
      <servlet-name>default</servlet-name>
      <url-pattern>*.css</url-pattern>
  </servlet-mapping>

  ● 通过Spring的mvc:resource来配置资源映射,将静态资源的映射进行放行。

<!-- 放行静态资源 -->
<!--放行js文件-->
<mvc:resources location="/js/" mapping="/js/**"/> 
<!--放行css文件-->
<mvc:resources location="/css/" mapping="/css/**"/>
<!--放行img类的资源文件-->
<mvc:resources location="/images/" mapping="/images/**"/>

  ● 通过Spring MVC的<mvc:default-handler/>:通过这个标签可以启动SpringMVC定义的一个类似于Tomcat的DefaultServlet的DefaultServletHttpRequestHandler类

<mvc:default-servlet-handler />

四、JspServlet的作用

  在Tomcat Server中运行的web application,对于类似于.jsp的java动态服务页同样不需要我们自己处理。我们可以直接通过一个后缀为.jsp的URL,例如:http:localhost:8080/index.jsp来访问到该页面,这是因为在conf/web.xml中有一个JspServlet来处理这类请求。

<!--在conf/web.xml中有定义-->
 <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>

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值