1.  Request Response 对象起到了服务器与客户机之间的信息传递作用。

    Request 对象用于接收客户端浏览器提交的数据,而 Response 对象的功能则是将服务器端的数据发送到客户端浏览器。

   Request 对象

l            从浏览器端取得数据的方法

l           Request.QueryString 集合读取表单 GET 方法数据      

l           Request.Form 集合读取表单 POST 方法数据      

l           Request.ServerVariables 集合读取服务器端环境变量

 

2. 为什么 servlet jsp 中可以直接使用 req res 对象?

自己的理解:(不一定正确,有待学习和理解)

servlet 容器类负责贞听请求,如果捕获到请求,请创建 req res 对象,然后激活 service ()方法,(或者,如果是 get 请求,激活 doGet ()方法;如果是 post ,则激活 doPost ()方法),并且同时也把 req res 对象传递给了 service ()方法(或者是相应的 doGet() doPost() 方法);

也就是说 servlet 容器类贞听到请求后已经自动创建 req res 对象,并传递给 service ()方法了,所以自己编码实现 servlet service ()方法时候,直接使用 req res 对象就可以,因为 service ()方法(由 service 方法根据请求方式再调用相应的 doGet ()和 doPost ()方法) 是容器负责自动调用的,调用的同时也实现的 req res 的传参。 Ok !!

 

问题:迫切需要查看 tomcat javax.servlet.Servlet 接口实现的类来验证自己的理解;

 

参考资料:

Servlet 容器工作原理(一)(二)(三)(四)

http://www.linuxmine.com/45398.html

注释:这是一个通过给出简单实现 servlet 容器的源代码的方式来阐述 servlet 容器( tomcat )工作原理的好资料。

关键内容摘要:

编者注 : 本文和同系列的前面一文“基于 Java Web 服务器工作原理”,都摘自“ Tomcat 运行内幕”一书(一本有关 Tomcat 的教程)。在阅读本文前,最好先阅读前文,以巩固基础信息。在此,将介绍如何建立两个 servlet 容器。 随附本书的应用程序可以下载 ,如果您有兴趣,可以在近段时间内到 作者网站 下载。

 

   本文介绍一个简单 servlet 容器的基本原理。这个 servlet 容器都处理简单的 servlet staticResource 。复杂一些的 servlet 会超出这些容器的容量,您可以从 TOMCAT  运行内幕 一书学习创建复杂的 servlet 容器。

 

 在理解应用程序如何运作之前,您必须熟悉 javax.servlet.Servlet 接口。首先就来介绍这个接口。随后,就介绍 servlet 容器服务 servlet 的具体内容。

 

   javax.servlet.Servlet 接口

 

   servlet 编程,需要引用以下两个类和接口: javax.servlet javax.servlet.http ,在这些类和接口中, javax.servlet.Servlet 接口尤为重要。所有的 servlet 必须实现这个接口或继承已实现这个接口的类。

   Servlet 接口有五个方法,如下:

l         public void init(ServletConfig config) throws ServletException

l         public void service(ServletRequest request, ServletResponse response)  throws ServletException, java.io.IOException

l         public void destroy()

l         public ServletConfig getServletConfig()

l         public java.lang.String getServletInfo()

 

    init service destroy  方法是 Servlet 生命周期的方法。当 Servlet 类实例化后,容器加载 init ,以通知 servlet 它已进入服务行列。 init 方法必须被加载, Servelt 才能接收和请求。如果要载入数据库驱动程序、初始化一些值等等,程序员可以重写这个方法。在其他情况下,这个方法一般为空。

 

   service 方法由 Servlet 容器调用,以允许 Servlet 响应一个请求。 Servlet 容器传递 javax.servlet.ServletRequest 对象和 javax.servlet.ServletResponse 对象。 ServletRequest 对象包含客户端 HTTP 请求信息, ServletResponse 则封装 servlet 响应。 这两个对象,您可以写一些需要 servlet 怎样服务和客户怎样请求的代码。

 

一个功能健全的 servlet 容器对于每个 servlet HTTP 请求会完成以下事情:

 

l         servlet 第一次被调用的时候,加载了 servlet 类并调用它的 init 方法(仅调用一次)

l         响应每次请求的时候 ,构建一个 javax.servlet.ServletRequest javax.servlet.ServletResponse 实例。

l         激活 servlet service 方法,传递 ServletRequest ServletResponse 对象。

l         servlet 类关闭的时候,调用 servlet destroy 方法,并卸载 servlet 类。

 

发生在 servlet 容器内部的事就复杂多了。只是这个简单的 servlet 容器的功能不很健全,所以,这它只能运行非常简单的 servelt ,并不能调用 servlet init destroy 方法。然而,它也执行了以下动作:

 

l         等待   HTTP 请求。

l         构建 ServletRequest   ServletResponse 对象  

l         如果请求的是一个 staticResource ,就会激活 StaticResourceProcessor 实例的 process 方法,传递 ServletRequest ServletResponse 对象。

l         如果请求的是一个 servlet , 载入该类,并激活它的 service 方法,传递 ServletRequest ServletResponse 对象。注意:在这个 servlet 容器,每当 servlet 被请求的时候该类就被载入。

Servlet 容器的关键工作流程 HttpServer1 类的 await 方法
在这个应用程序中, servlet 容器由六个类组成

• HttpServer1
• Request
• Response
• StaticResourceProcessor
• ServletProcessor1
• Constants

  正如前文中的应用程序一样,这个程序的进入口(静态 main 方法)是 HttpServer 类。这个方法创建了 HttpServer 实例,并调用它的 await 方法。这个方法等待 HTTP 请示,然后创建一个 request 对象和 response 对象,根据请求是否是 staticResource 还是 servlet 来分派它们到 StaticResourceProcessor 实例或 ServletProcessor 实例。

代码如下:  
    Listing 2.2. HttpServer1 类的 await 方法
   public void await() {
   ServerSocket serverSocket = null;
   int     port   = 8080;
  
   try {
   serverSocket =   new ServerSocket(port, 1,
   InetAddress.getByName("127.0.0.1"));
     }
   catch (IOException e) {
   e.printStackTrace();
   System.exit(1);
     }
  
   // 循环,等待一个请求
   while (!shutdown) {
   Socket socket     = null;
   InputStream input   = null;
   OutputStream output = null;
  
   try {
   socket = serverSocket.accept();// 贞听用户请求;
   input   = socket.getInputStream();
   output = socket.getOutputStream();
  
   // 如果捕获用户请求,则创建请求对象并解析
   Request request = new Request(input);
   request.parse();
  
   // 创建回应对象
   Response response = new Response(output);
   response.setRequest(request);
  
   // 检测是否是 servlet 或静态资源的请求
   //servlet 请求以 "/servlet/" 开始
   if (request.getUri().startsWith("/servlet/")) {
   ServletProcessor1 processor = new ServletProcessor1();

// 激活 process req res )方法,并同时把 req res 实例传递给 process ()方法;

// tomcat 中,激活的是 service req res )方法(或者相应的 doGet doPost 方法)
   processor.process(request, response);
         }
   else {
   StaticResourceProcessor processor =
   new StaticResourceProcessor();
   processor.process(request, response);
         }
   // 关闭 socket
   socket.close();
  
   // 检测是否前面的 URI 是一个 shutdown 命令
   shutdown = request.getUri().equals(SHUTDOWN_COMMAND);
       }
   catch (Exception e) {
   e.printStackTrace();
   System.exit(1);
       }
     }
   }
   如果 URI 中包含 "/servlet/." ,请求推进到后面,否则,请求传递到 StaticResourceProcessor 实例。

Ok

 

3. 如何理解内置的含义?(不一定正确,有待学习和理解)

http://topic.csdn.net/t/20060211/20/4551196.html

问:

如何深入理解内置对象  
 
最好是在实现原理层次上

答:

tomcat 的体系中,有个 jsp   parser ,它的作用是把 jsp 页面 parse java 程序( servlet ),然后再运行 parse 出来的 servlet ,由此可见, 9 个内置对象就是 jsp   parser 在根据 jsp 页面生成 servlet 的时候自动创建的 java 对象或容器中已经创建的对象。