`
ryanflyer
  • 浏览: 102415 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

How tomcat works学习笔记(1)

 
阅读更多

1.  servlet容器是如何工作的?

  • 创建一个Request对象,填充一些信息比如参数、headers、cookies、查询字符串、URI等。一个Request对象是javax.servlet.ServletRequest或javax.servlet.http.ServletRequest接口的实例。
  • 创建一个Response对象,用于调用的servlet向客户端传递响应信息。其是javax.servlet.ServletResponse或javax.servlet.http.ServletResponse的实例。
  • 调用servlet的service方法,传递request和response对象。servlet从request对象中读取值,向response对象中写入值。

2.Catalina主要模块

 

  • Connector,连接器主要是连接请求到容器。它的工作是为每一个接收到http请求构建一个request和response对象,接下来传递给待处理的容器。
  • Container,容器从连接器接收到request和response对象,负责调用servlet的service方法。

连接器和容器是多对1的关系(*对1)

 

3.tomcat4和5对比

 

  • tomcat5支持servlet2.4和jsp2.0规范,tomcat4支持servlet2.3和jsp1.2
  • tomcat5拥有比tomcat4更高效的默认连接器
  • tomcat5使用更少的资源。因为tomcat5共享一个后台处理的线程,而tomcat4的每个模块都有自己的后台处理线程。
  • tomcat5代码更简洁。因为不需要一个mapper组件来找到一个子组件。
一个简单的HttpServer代码示例:
流程图:


 
package com.flyer.tomcat.first;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 一个简单的http服务器
 * <p />
 * 
 * @author Administrator
 */
public class HttpServer {

    private final static String SHUTDOWN_COMMAND = "/shutdown";
    
    public final static String WEB_ROOT = System.getProperty("user.dir") + File.separator + "webroot";

    private boolean shutdown = false;

    public static void main(String[] args) {
        System.out.println("server start");
        System.out.println(WEB_ROOT);
        HttpServer server = new HttpServer();
        try {
            server.await();
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
    }

    private void await() throws IOException {

        ServerSocket serverSocket = new ServerSocket(9090,1,InetAddress.getByName("127.0.0.1"));
        InputStream input = null;
        OutputStream output = null;
        while (!shutdown) {
            Socket socket = 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);
                response.sendStaticResource();
                shutdown = request.getUri().equals(SHUTDOWN_COMMAND);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                socket.close();
                input.close();
                output.close();
            }
        }

    }

}
 Request类
package com.flyer.tomcat.first;

import java.io.IOException;
import java.io.InputStream;

public class Request {

    private byte[] buffer = new byte[1024];

    private InputStream input;

    private String uri;

    public Request(InputStream input) {
        this.setInput(input);
    }

    /**
     * @return
     */
    public InputStream getInput() {
        return input;
    }

    /**
     * @param
     */
    public void setInput(InputStream input) {
        this.input = input;
    }

    public void parse() {
        int count = 0;
        StringBuilder sb = new StringBuilder();
        try {
            count = input.read(buffer);
        } catch (IOException e) {
            count = -1;
        }
        if (count != -1) {
            for (int i = 0; i < count; i++) {
                sb.append((char) buffer[i]);
            }
        }

        uri = parseUri(sb.toString());
    }

    private String parseUri(String requestString) {
        int index1, index2;
        String uri = requestString;
        index1 = uri.indexOf(" ");
        if (index1 != -1) {
            index2 = uri.indexOf(" ", index1 + 1);
            if (index1 < index2) {
                uri = uri.substring(index1 + 1, index2);
                return uri;
            }
        }
        return "";

    }

    /**
     * @return
     */
    public String getUri() {
        return uri;
    }

    // public static void main(String[] args) {
    // Request request = new Request(new InputStream() {
    //
    // @Override
    // public int read() throws IOException {
    // // TODO Auto-generated method stub
    // return 0;
    // }
    //
    // });
    // String test = "GET /index.jsp HTTP/1.1";
    // System.out.println(request.parseUri(test));
    // }

}
 Response类
package com.flyer.tomcat.first;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class Response {

    public final static int BUFFER_SIZE = 1024;

    private Request request;

    private OutputStream output;

    public Response(OutputStream output) {
        this.setOutput(output);
    }

    /**
     * @return
     */
    public Request getRequest() {
        return request;
    }

    /**
     * @param
     */
    public void setRequest(Request request) {
        this.request = request;
    }

    public void sendStaticResource() {
        byte[] buffer = new byte[BUFFER_SIZE];
        InputStream inputStream = null;
        try {
            File file = new File(HttpServer.WEB_ROOT + request.getUri());
            if (file.exists()) {
                inputStream = new FileInputStream(file);
                int count = 0;
                while ((count = inputStream.read(buffer)) != -1) {
                    output.write(buffer, 0, count);
                }
            } else {
                String errorMessage = "HTTP/1.1 404 File not found\r\n" + "Content-Type : text/html\r\n"
                    + "Content-length:23\r\n" + "\r\n" + "<h1>File not Found</h1>";
                output.write(errorMessage.getBytes());
            }
        } catch (Exception e) {
            // TODO: handle exception
        } finally {
            try {
                if (inputStream != null) {
                    inputStream.close();
                }

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }

    /**
     * @return
     */
    public OutputStream getOutput() {
        return output;
    }

    /**
     * @param
     */
    public void setOutput(OutputStream output) {
        this.output = output;
    }

}
 
  • 大小: 32 KB
分享到:
评论

相关推荐

    How Tomcat Works 中文版.pdf

    通过阅读《How Tomcat Works》中文版,读者将能够获得对Tomcat架构的全面理解,学习到如何从源码级别研究和开发一个高性能的Java应用服务器,以及如何将其应用于实际的Web开发和服务器管理工作中。

    How Tomcat Works【英文PDF+中文HTML+源码】.zip

    《How Tomcat Works》是一份深入探讨Apache Tomcat工作原理的重要资源,包含了英文PDF文档、中文HTML翻译以及源代码,旨在帮助读者理解Tomcat服务器的内部运作机制。这份资料是IT从业者,特别是Java Web开发者、系统...

    How Tomcat Works 中文版+例程源码

    总的来说,《How Tomcat Works》中文版结合源码学习,可以帮助读者全面掌握Tomcat的工作原理,提升对Web应用服务器的理解,并且能更好地进行问题排查和性能优化。书中的例程源码可以作为实践参考,加深理论知识与...

    How Tomcat Works 读书笔记(第三章)

    《How Tomcat Works》这本书是理解Apache Tomcat服务器工作原理的重要资源,第三章主要探讨了Tomcat的架构和核心组件。以下是对这部分内容的详细解读: Tomcat作为一款开源的Java Servlet容器,其核心功能是解析...

    How Tomcat Works 英文书及源码

    《How Tomcat Works》这本书是理解Apache Tomcat服务器工作原理的宝贵资源,它全面深入地讲解了这个流行的Java Servlet和JavaServer Pages(JSP)容器的内部机制。书中的20个章节涵盖了从基础概念到高级特性的广泛...

    How Tomcat Works 中文版

    在《How Tomcat Works》一书中,作者不仅仅是提供一个简单的Tomcat学习蓝图,而是通过构建简化版本的组件来帮助读者逐步深入理解真实组件的工作机制,让读者能够更容易地掌握整个Tomcat的运作原理。

    How Tomcat Works中文

    ### How Tomcat Works中文版深度解析 #### 一、引言与概述 《How Tomcat Works》是一本针对Apache Tomcat服务器内部工作机制进行深入剖析的专业书籍。本书详细介绍了Tomcat 4.1.12和5.0.18两个版本的内部结构与...

    How Tomcat works(PDF)

    《How Tomcat Works》这本书深入浅出地介绍了Apache Tomcat这款广泛应用的Java Servlet容器的工作原理。Tomcat作为开源软件,是许多Web应用的基础,尤其在轻量级开发和测试环境中非常常见。以下是对Tomcat核心知识点...

    HowTomcatWorks书籍代码

    HowTomcatWorks书籍课程实例工程与代码 书籍剖析了Tomcat 4.1.12和Tomcat 5.0.18--一个免费的、开源的、深受大众欢迎的、代号为Catalina的servlet容器,并讲解其容器的内部运行机制。通过迭代实现一个简化版软件来...

    HowTomcatWorks 中文版+源码.rar

    《HowTomcatWorks》是一本深入解析Apache Tomcat工作原理的书籍,中文版的发布使得更多的中国开发者能够理解和掌握这款广泛应用的开源Java Servlet容器的工作机制。Tomcat是Apache软件基金会Jakarta项目的一部分,它...

    how tomcat works中英文版

    《How Tomcat Works》是一本深入探讨Apache Tomcat工作原理的书籍,包含了中英文两个版本。这本书对于理解Java Servlet和JavaServer Pages(JSP)容器的运作方式具有极高的价值,特别是对于那些想要深入理解Web应用...

    tomcat工作原理深入详解——HowTomcatWorks中文版.pdf

    tomcat工作原理深入详解——HowTomcatWorks中文版.pdf

    How Tomcat Works 中文版/英文版 + 源码

    总的来说,《How Tomcat Works》结合源码的学习,对于理解和掌握Tomcat服务器的运行机制、优化Web应用性能、解决实际问题具有极大的帮助。对于从事Java Web开发的工程师来说,这是一个不容错过的资源。

    How Tomcat Works 英文版 带书签

    Welcome to How Tomcat Works. This book dissects Tomcat 4.1.12 and 5.0.18 and explains the internal workings of its free, open source, and most popular servlet container code-named Catalina. Tomcat is ...

    how tomcat works

    总的来说,《how tomcat works》通过深入浅出的方式,为读者提供了一套完整的Tomcat工作原理的学习资料。它不仅适合于初学者,更是一本对有经验的开发者也有很大帮助的参考书。通过阅读这本书,开发者可以更加熟练地...

Global site tag (gtag.js) - Google Analytics