JavaWeb中缺省的Servlet的奥秘

时间:2022-02-03 13:10:38

 

一、JavaWeb中的资源

我们都知道,web服务器的作用是对外提供Web资源服务。比如浏览器中看到的一个网页,或者网页中展现的一张图片等,这些都是Web资源。对于Web资源来说,又分为静态资源和动态资源。

1.静态资源

所谓的静态资源,就是固定的Web资源,该资源已经被生成,可以直接拿来存放在服务器上,比如当前服务器的某个Web应用下存放着如下这些静态资源:

JavaWeb中缺省的Servlet的奥秘

2.动态资源

由服务器上的java程序动态生成的资源,也就是说,在没有执行java程序时,该资源是不存在的,当程序运行时,由程序动态生成该资源。比如,以下java程序实现了动态生成一个html页面资源。

java public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().write("<html>"); response.getWriter().write("<head>"); response.getWriter().write("<meta charset='utf-8'>"); response.getWriter().write("<title>动态资源</title>"); response.getWriter().write("</head>"); response.getWriter().write("<body>"); response.getWriter().write("这是一个动态生成的Html页面"); response.getWriter().write("</body>"); response.getWriter().write("</html>"); }

3.静态资源和动态资源的区别

从上述对静态资源和动态资源的分析可以看出,静态资源是已经成型的资源,而动态资源是由程序动态生成的,在程序执行前不存在。

二、缺省的Servlet

在JavaWeb知识中,Servlet指的是服务器上的一个小程序,也就是说可以把java程序写在服务器上,供用户访问,而该java程序的载体就是Servlet。那么什么是缺省的servlet呢

1.什么是缺省的Servlet

我们知道当我们在浏览器地址栏中输入url,实际上是在请求某个资源。该资源到底是静态资源还是动态资源呢?要想获得这个问题的答案,我们得先知道web.xml的作用。

xml <servlet> <description></description> <display-name>Demo1</display-name> <servlet-name>Demo1</servlet-name> <servlet-class>com.qf.web.Demo1</servlet-class> </servlet> <servlet-mapping> <servlet-name>Demo1</servlet-name> <url-pattern>/demo1</url-pattern> </servlet-mapping>

当浏览器地址栏中输入任何的url,都会被web.xml中的servlet-mapping中的url-pattern匹配,当匹配成功后寻找相应的servlet,再通过反射获得该Servlet对象,最后执行该Servlet。详细过程如下图所示:

JavaWeb中缺省的Servlet的奥秘

也就是说,浏览器中访问的任何资源,都是要经过web.xml匹配的,那么如果浏览器中访问的资源没有在web.xml的url-pattern中匹配,那么就会去寻找缺省的servlet。

xml <servlet> <servlet-name>DefaultServlet</servlet-name> <servlet-class>com.qf.web.DefaultServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>DefaultServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>

这段代码配置了一个缺省的Servlet,也就是说,如果在浏览器的url中没有匹配到任何url-pattern,那么就会与配置了"/"的url-pattern进行匹配,并执行该Servlet。

2.起到全局配置作用的web.xml文件

我们发现,在大部分情况下我们不需要配置缺省的Servlet。因为我们直接通过url访问一个服务器上的静态资源时,这个url并不会与url-pattern中的任何一个匹配。但我们也确实访问到了,这是为什么呢?

比如我们当前web应用下的web.xml文件中没有任何url-pattern,但我们却在地址栏里输入:http://localhost:8080/Servlet/1.html,此时能成功的访问到“1.html”静态资源。实际上这是因为,有一个文件帮我们配置了缺省的Servlet,而该缺省的servlet实现的效果,就是把静态资源逐一读取到Java程序中,再讲资源内容写给客户端浏览器。该文件,就是我们说的:起到全局配置作用的web.xml文件,该文件处在服务器的conf文件夹内。

JavaWeb中缺省的Servlet的奥秘

全局Web.xml中的缺省Servlet主要完成以下两件事情:

  • 根据url,成功找到服务器上的静态资源并读取,再发送给客户端
  • 根据url,无法找到服务器上的静态资源,于是发送404页面给客户端

xml <!--全局的Web.xml中配置的缺省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> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>

三、总结

通过上述论述,我们得到了以下几个结论:

    • JavaWeb中浏览器访问的任何url,实际上都是在访问服务器上的某个Servlet,因为web.xml中的url-pattern在负责url的匹配
    • 如果web.xml中的url-pattern匹配不到任何结果,那么就会去寻找缺省的Servlet,即url-pattern是“/”的Servlet
    • 如果在寻找缺省的Servlet时,发现当前Web.xml中没有,于是就会去全局的Web.xml文件中找,找到后执行该Servlet
    • JavaWeb中访问的任何资源,都是动态资源。因为都是经过Servlet运行后生成的,即使直接访问静态资源,也是由缺省的Servlet,通过读取静态资源的内容后,再发送给客户端的。