黑马程序员技术交流社区

标题: 原来如此!我到今天才明白。 [打印本页]

作者: 浮出一个美    时间: 2014-1-24 10:59
标题: 原来如此!我到今天才明白。
今天看老方的web视频,知道了一个一直迷惑我的东西:
对tomcat下web容器的访问都是Servlet。
相信不知道的同学和我有同样的疑惑:html那些静态资源也是通过Servlet来访问的?
是的,比如客户端访问1.html,tomcat首先会查找1.html这个Servlet,如果找不到,就会去找默认的Servlet,
默认的Servlet又在哪里配置的呢?在$CATALINA_BASE/conf/web.xml里,这个web.xml是所有web共享的
我们可以在这个web.xml里找到那个默认的Servlet
  1. <servlet>
  2.         <servlet-name>default</servlet-name>
  3.         <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
  4.         <init-param>
  5.             <param-name>debug</param-name>
  6.             <param-value>0</param-value>
  7.         </init-param>
  8.         <init-param>
  9.             <param-name>listings</param-name>
  10.             <param-value>false</param-value>
  11.         </init-param>
  12.         <load-on-startup>1</load-on-startup>
  13.     </servlet>
  14. <servlet-mapping>
  15.         <servlet-name>default</servlet-name>
  16.         <url-pattern>/</url-pattern>
  17.     </servlet-mapping>
复制代码

并且发现这个默认的Servlet是随tomcat启动就创建了实例。
这个Servlet就会去加载1.html资源并返回给客户端,找不到1.html就返回一个错误。
源码如下:
  1. protected void serveResource(HttpServletRequest request,
  2.                                  HttpServletResponse response,
  3.                                  boolean content)
  4.         throws IOException, ServletException {

  5.         // Identify the requested resource path
  6.         String path = getRelativePath(request);
  7.         if (debug > 0) {
  8.             if (content)
  9.                 log("DefaultServlet.serveResource:  Serving resource '" +
  10.                     path + "' headers and data");
  11.             else
  12.                 log("DefaultServlet.serveResource:  Serving resource '" +
  13.                     path + "' headers only");
  14.         }

  15.         CacheEntry cacheEntry = resources.lookupCache(path);

  16.         if (!cacheEntry.exists) {
  17.             // Check if we're included so we can return the appropriate
  18.             // missing resource name in the error
  19.             String requestUri = (String) request.getAttribute(
  20.                                             Globals.INCLUDE_REQUEST_URI_ATTR);
  21.             if (requestUri == null) {
  22.                 requestUri = request.getRequestURI();
  23.             } else {
  24.                 // We're included, and the response.sendError() below is going
  25.                 // to be ignored by the resource that is including us.
  26.                 // Therefore, the only way we can let the including resource
  27.                 // know is by including warning message in response
  28.                 response.getWriter().write(RequestUtil.filter(
  29.                     sm.getString("defaultServlet.missingResource",
  30.                     requestUri)));
  31.             }

  32.             response.sendError(HttpServletResponse.SC_NOT_FOUND,
  33.                                requestUri);
  34.             return;
  35.         }
复制代码

大家可以自己写一个Servlet然后在自己的web项目的web.xml里配置这个Servlet为默认的Servlet,那就访问不了静态页面了,而是去找你配置的那个Servlet
但jsp是个例外,因为jsp本身就是Servlet




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2