ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

自己动手写一个tomcat之2拆分httpserver职责

自己动手写一个tomcat之2拆分httpserver职责 写在前面源码 。本文目标使用标准的servlet以及拆分httpserver职责。1使用标准的servlet引入标准servlet的pomdependencygroupIdjavax.servlet/groupIdartifactIdjavax.servlet-api/artifactIdversion4.0.1/version/dependency让HttpServlet实现javax.servlet.Servlet接口使其成为标准的servletpublicclassHelloServletimplementsServlet{}同样的request和response成为规范内的请求和响应对象importjavax.servlet.ServletRequest;publicclassRequestimplementsServletRequest{}importjavax.servlet.ServletResponse;publicclassResponseimplementsServletResponse{}2拆分httpserver职责当前连接处理请求职责都在http server这显然不符合单一职责的原则来拆分下对于连接引入Connector组件对于处理请求引入processor组件。Connector组件定义类HttpConnectorpackagemonitomcat.server;// ...publicclassHttpConnectorimplementsRunnable{publicvoidrun(){ServerSocketserverSocketnull;intport8080;try{serverSocketnewServerSocket(port,1,InetAddress.getByName(127.0.0.1));}catch(IOExceptione){e.printStackTrace();System.exit(1);}while(true){Socketsocketnull;try{socketserverSocket.accept();HttpProcessorprocessornewHttpProcessor();processor.process(socket);// Close the socketsocket.close();}catch(Exceptione){e.printStackTrace();}}}publicvoidstart(){ThreadthreadnewThread(this);thread.start();}}processor组件定义类HttpProcessorpackagemonitomcat.server;importjava.io.InputStream;importjava.io.OutputStream;importjava.net.Socket;publicclassHttpProcessor{publicHttpProcessor(){}publicvoidprocess(Socketsocket){InputStreaminputnull;OutputStreamoutputnull;try{inputsocket.getInputStream();outputsocket.getOutputStream();// create Request object and parseRequestrequestnewRequest(input);request.parse();// create Response objectResponseresponsenewResponse(output);response.setRequest(request);if(request.getUri().startsWith(/servlet/)){ServletProcessorprocessornewServletProcessor();processor.process(request,response);}else{StaticResourceProcessorprocessornewStaticResourceProcessor();processor.process(request,response);}}catch(Exceptione){e.printStackTrace();}}}此时整个处理请求过程如下这样我们的启动类就很简单了packagemonitomcat.server;// ...publicclassHttpServer{publicstaticfinalStringWEB_ROOTSystem.getProperty(user.dir)File.separatortargetFile.separatorclassesFile.separatorwebroot;publicstaticfinalStringWEB_ROOT_SERVLETSystem.getProperty(user.dir)File.separatortargetFile.separatorclassesFile.separatormonitomcatFile.separatorserver;publicstaticvoidmain(String[]args){// HttpServer server new HttpServer();// server.await();// 启动连接器HttpConnectorconnectornewHttpConnector();connector.start();}}相比原来的代码是不是倍感清新舒爽~~~~~~~~测试下C:\Users\dell9020curl http://localhost:8080/hello.txt say hello from minitomcat v2...! C:\Users\dell9020curl http://localhost:8080/servlet/monitomcat.server.HelloServlet !DOCTYPE html html headmeta charsetutf-8titleTest/title/head body bgcolor#f0f0f0 h1 aligncenterHello World from standard servlet!!!/h1写在后面参考文章列表手把手带你写一个 MiniTomcat 。
返回列表