设为首页 加入收藏

TOP

how tomcat works 读书笔记(二)----------一个简单的servlet容器(一)
2015-07-20 17:26:47 来源: 作者: 【 】 浏览:17
Tags:how tomcat works 读书 笔记 ---------- 一个 简单 servlet 容器

app1

(建议读者在看本章之前,先看how tomcat works 读书笔记(一)----------一个简单的web服务器 http://blog.csdn.net/dlf123321/article/details/39378157)
回顾我们上一章,我们开发了一个最最简单的web服务器,它可以使用户访问服务器内的静态资源。当然这是远远不够的,在这一节里,我们就试着让服务器在能相应静态资源的基础上继续支持servlet。
servlet接口
javax.servlet.Servlet接口定义了五个方法,如下:
\
我们所使用的servlet都是Servlet接口的间接实现类。
每当我们实例化一个servlet的时候,servlet容器都会先唯一的调用一次init()方法进行初始化,然后再调用service()方法来处理用户的需求,最后在销毁servlet前容器会调用destroy()方法。
我们看看,这一节我们要用的测试servlet。
import javax.servlet.*;
import com.jspsmart.upload.Request;


import java.io.IOException;
import java.io.PrintWriter;


public class PrimitiveServlet implements Servlet {


  public void init(ServletConfig config) throws ServletException {
    System.out.println("init");
  }


  public void service(ServletRequest request, ServletResponse response)
    throws ServletException, IOException {
    System.out.println("from service");
    PrintWriter out = response.getWriter();
    out.println("Hello. Roses are red.");
    out.print("Violets are blue.");
 //   out.flush();
  }


  public void destroy() {
    System.out.println("destroy");
  }


  public String getServletInfo() {
    return null;
  }
  public ServletConfig getServletConfig() {
    return null;
  }


}
Servlet定义的5个方法,它都实现了(不过我们这一节要实现的servlet还没有能力自动调用init和destroy方法)。


再看看我们的主方法,程序就从这里开始(和上一节的HttpServer差别不是很大)
package ex02.pyrmont;


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


public class HttpServer1 {


  /** WEB_ROOT is the directory where our HTML and other files reside.
   *  For this package, WEB_ROOT is the "webroot" directory under the working
   *  directory.
   *  The working directory is the location in the file system
   *  from where the java command was invoked.
   */
  // shutdown command
  private static final String SHUTDOWN_COMMAND = "/SHUTDOWN";


  // the shutdown command received
  private boolean shutdown = false;


  public static void main(String[] args) {
    HttpServer1 server = new HttpServer1();
    server.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);
    }


    // Loop waiting for a request
    while (!shutdown) {
      Socket socket = null;
      InputStream input = null;
      OutputStream output = null;
      try {
        socket = serverSocket.accept();
        input = socket.getInputStream();
        output = socket.getOutputStream();


        // create Request object and parse
        Request request = new Request(input);
        request.parse();


        // create Response object
        Response response = new Response(output);
        response.setRequest(request);  //没有再这里直接处理静态资源
	                               //而是判断到底请求的事静态资源还是servlet


        // check if this is a request for a servlet or a static resource
        // a request for a servlet begins with "/servlet/"
        if (request.getUri().startsWith("/servlet/")) {
          ServletProcessor1 processor = new ServletProcessor1();
          processor.process(request, response);
        }
        else {
          StaticResourceProcessor processor = new StaticResourceProcessor();
          processor.process(request, response);
        }


        // Close the socket
        socket.close();
        //check if the previous URI is a shutdown command
        shutdown = request.getUri().equals(SHUTDOWN_COMMAND);
      }
      catch (Exception e) {
        e.printStac
首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇UVA11504- Dominos(Tarjan+缩点) 下一篇HDU 4849-Wow! Such City!(最短..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·微服务 Spring Boot (2025-12-26 18:20:10)
·如何调整 Redis 内存 (2025-12-26 18:20:07)
·MySQL 数据类型:从 (2025-12-26 18:20:03)
·Linux Shell脚本教程 (2025-12-26 17:51:10)
·Qt教程,Qt5编程入门 (2025-12-26 17:51:07)