tomcat 分析(一)

Tomcat服务器是一个servlet服务器,他http协议与客户段进行通讯。通常这个客户端是浏览器,但也可以是自定义的输出。Http协议是基于可靠的tcp协议来通讯的。在Java 的编程中,tcp协议的基本通讯对象是socketserversocket,当然还有基于加密的通讯机制,为sslsocketsslserversocket。本次的一个模拟客户段服务器机制使用ssl系列对象实现。应用层协议Http虽说是基于传输层的tcp,但是http是一种请求响应协议。它有自己的请求和响应规范。本系列主要说明tomcat的源码组织结构,并不深入讨论客户端,对浏览器等客户端不做说明。

1、请求格式:

    POST/GET(method) URI HTTP/1.1(或其他版本号)

    ⑵请求头部

    ⑶请求主体

注意:请求头部和请求主题之间有一个空行

2、响应格式:

    HTTP/1.1(版本号) 200(等返回码) OK(返回码描述)

    ⑵响应头部

    ⑶响应主体

注意:响应头部和响应主体之间同样存在一个空行

3servlet.作为servlet容器,当然跑不了servlet了。先看看Java 标准规范中的servlet所提供的服务。

Servlet的全路径名为javax.servlet.Servlet.Servlet类总共有5个方法,其中有3个生命周期方法,另2个是一些config信息等,如下:

void init(ServletConfig config):初始化时被容器所调用,只会调用一次

void service(ServletRequest req, ServletResponse res):每次请求调用一次

void destroy():容器被关闭时,或servlet对象被销毁时

String getServletInfo():获取servlet信息

ServletConfig getServletConfig():获取config信息

4servlet容器工作

⑴加载servlet,并调用init方法实例化servlet

⑵对每个请求构造service方法需要的reqres参数,并在请求是调用service方法

⑶调用destroy方法,卸载servlet

5、实例。实例的基本类图如下:

tomcat 分析(一)

⑴先看最简单的HelloWorldServlet类,这个类是最基础的servlet,也是我们经常用的servlet:这里只实现了service方法

public void service(ServletRequest req, ServletResponse res){
  System.out.println(“#####execute helloworld servlet#####”);
  PrintWriter writer = res.getPrintWriter();
  writer.println(“hello world”);
}

 

⑵看看requestresponse

先看httpresponse类,httpresponse的主要接收输出流,然后构造response返回需要的一系列参数对象,主要实现了他的getwriter方法。

 

 

 

ServletProxy代理,他负责对servlet和静态页面做转换并回应,以下是execute体: 

String uri = req.getURI();
if (uri.indexOf("Servlet") != -1) {
  ClassLoader loader = ServletProxy.class.getClassLoader();
  String className = uri.replaceAll("/", "");
  Servlet servlet = (Servlet) loader.loadClass(className).newInstance();
  servlet.service(request, response);
} else {
  PrintWriter writer = response.getWriter();
  File file = new File(HttpServer.WEB_ROOT, uri);
  fis = new FileInputStream(file);
  int ch = fis.read(buffer));
  writer.println(new String(buffer, 0, ch));
 }

 

⑷然后最重要的是我们的httpserver了,httpservermain的主要做的事情就是如下的代码了:

 

ServerSocket serverSocket = null;
int port = 8080;
serverSocket = new ServerSocket(port, 1, InetAddress.getByName("127.0.0.1"));
while (!shutdown) {
  try {
    Socket socket = serverSocket.accept();
    InputStream input = socket.getInputStream();
    OutputStream output = socket.getOutputStream();
    HttpRequest httpRequest = new HttpRequest(input);
    HttpResponse httpResponse = new HttpResponse(output);
    new ServletProxy().execute(httpRequest, httpResponse);
    socket.close();
  } catch (Exception ex) {
  }
}

 

 

 

⑸至次一个简易的tomcat就制作完成了,下面写个测试的htmlservlet测试下

Html代码,放在工程目录的webroot目录下:

<body>
<form action="/eg02.HelloWorldServlet" method="post">
name:<input type="text" name="name" value="" /><br>
<input type="submit" value="submit" />
</form>
</body>

 

Servlet代码也更简单,继承自servlet类,只实现service方法。

public void service(ServletRequest req, ServletResponse res) throws Exception{
  String name = req.getParameter("name");
  PrintWriter writer = res.getWriter();
  writer.println("Hello " + name + ",First example helloworld");
}

 

最后我们来看下测试的结果吧:打开浏览器,输入http:127.0.0.1:8080/index.html

tomcat 分析(一)

在输入框输入smurfs,点击提交后

测试完成,至此,大功告成。

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(tomcat)