一、前言
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>