Web应用体系结构

       Serlet也需要帮助。请求到来时,必须有人实例化 Servlet ,或者至少要建一个新的线程处理这个请求,必须有人调用 Servlet 的doPost() 或doGet()方法。另外,对了,这些方法还有一些重要的参数-----HTTP请求和HTTP响应对象,所以必须有人把请求和响应交给  Servlet  。还得有人管理S而vletde生与死以及 Servlet 的资源 。这个 “人” 就是Web容器。 

      不知道大家有没有发现 Servlet是没有Main()方法的,那它是怎么运行的呢?Servlt受控于另一个Java应用,这个应用称为容器。Tomcat就是这样一个容器。如果Web服务器应用(如Apache) 得到一个指向某Servlet的请求(而不是其他请求,如请求一个普通的静态HTML页面),此时服务器不是把这个请求交给Servlet本身,而是交给部署该Servlet的容器,然后由容器向Servlet提供HTTP请求和响应、由容器调用Servlet的doGet()方法和doPost()方法。如图:Web应用体系结构_第1张图片


       

        容器为我们提供了什么呢?又带来了什么样的额外的开销呢?

         一、通信支持。利用容器提供的方法,我们能轻松地让Servlet与Web服务器对话。无需自己建立 ServerSocket 、监听端口、创建流等。容器知道自己与服务器的协议和我们自己的Web代码之间的API。我们只需考虑如何在Servlet中实现业务逻辑。

         二、生命周期管理。容器控制着Servlet的生与死。它会负责加载类、实例化和初始化Servlet、调用servlet方法,并使用Servlet实例能够被回收。有了容器的控制,我们就不用考虑资源管理啦、

         三、多线程支持。容器会自动地为它接收的每个Servlet 请求创建一个新的Java线程。针对客户的请求,如果Servlet已经运行完相应的HTTP服务方法,这个线程就可以结束了(也就是说会死掉)。但这并不是说我们就可以不用考虑线程的安全问题了,我们还是会遇到线程同步问题的。容器只能帮我们创建和管理多个线程。

        四、声明方式实现安全。利用容器,可以使用XML部署描述文件来配置(和修改)安全性,而不必将其硬编码写到Servlet(或其他代码)中。想象一下,我们不用去更改Java源文件,也不用重新编译,就能管理和修改安全性配置,多么激动人心啊!

       五、JSP支持。偷偷告诉你,负责把JSP编译成Java的也是容器。

  

Web应用体系结构_第2张图片

       

 Web应用体系结构_第3张图片

       说了这么多,我们好像忽略了一个重要的问题:容器是怎么找到客户请求的Servlet的呢?

       作为客户请求的一部分,URI会一某种方法映射到服务器上的一个特定 Servlet。怎么映射呢?一个Servlet可以有 3 个名字呢。一个是实际的文件名;另一个是部署人员起的秘密内部名;最后一个是公共的URL名。其中,秘密内部名可以是任意的,不一定与类名或文件名相同;公共URL呢,这是客户所知道的名字。换句话说就是写在HTML里的,当用户点击一个指向Servlet的链接时,就可以把这个公共的URL名放在HTTP请求中发送给服务器,然后服务器进行上文的操作。

       建立Servlet名的映射是有好处的,这有助于改善应用的灵活性和安全性。先说灵活性吧,想象一下,如果你是把Servlet的路径和文件名写在了所有需要它的JSP中,当然这是完全可以的,但是当我们需要重新组织我们的应用且需要改变我们的目录结构时,我们就需要一个个的改JSP中的路径,想想就很可怕。对于安全性呢,但我们在HTML中用的是真实的路径和文件名,也就相当于把我们服务器上的目录结构公布于天下了,这不危险嘛?

       映射Servlet需要用到部署描述文件。将Servlet部署到Web容器时,会创建一个相当简单的XML文档,这称为部署描述文档,它可以告诉容器怎么运行你的Servlet和JSP。给一个例子:

<servlet>
     <servlet-name>ServletDemo(内部秘密部署名)servlet-name>
     <servlet-class>day_052102.ServletDemo(完全限制名)servlet-class>
 servlet>
 <servlet-mapping>
     <servlet-name>ServletDemoservlet-name>
     <url-pattern>/ServletDemo(公共URL,客户看到的公共名)url-pattern>
 servlet-mapping

需要注意的是部署文件还有其他的作用呢,比如使用描述文件对Web应用的其他方面进行定制,包括安全角色、错误页面、标记库、初始配置信息等。

        

   

你可能感兴趣的:(Web开发,Java)