实现一个简单的Tomcat
生活随笔
收集整理的這篇文章主要介紹了
实现一个简单的Tomcat
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
實(shí)現(xiàn)一個(gè)簡單的Tomcat
1. Tomcat作用
我們的web應(yīng)用會(huì)運(yùn)行在Tomcat中,那么顯然請求必定是先到達(dá)Tomcat的,Tomcat對于請求實(shí)際上會(huì)進(jìn)行如下的處理:
- 提供Socket服務(wù):Tomcat的啟動(dòng),必然是Socket服務(wù),支持http協(xié)議。
- 進(jìn)行請求的分發(fā):一個(gè)Tomcat可以為多個(gè)web應(yīng)用提供服務(wù),那么就需要把url下發(fā)到不同的web應(yīng)用。
- 需要將請求和響應(yīng)封裝成request和response:我們在寫后端代碼的時(shí)候都是直接使用request和response的,這是因?yàn)門omcat已經(jīng)做好了。
下面我們就自己來實(shí)現(xiàn)這三步。
2. 實(shí)現(xiàn)代碼
項(xiàng)目結(jié)構(gòu):
src└─mytomcatBookServlet.javaCarServlet.javaMyRequest.javaMyResponse.javaMyServlet.javaMyTomcat.javaServletMapping.javaServletMappingConfig.java2.1 封裝http請求和響應(yīng)
package mytomcat;import java.io.IOException; import java.io.InputStream;/*** 封裝http請求*/ public class MyRequest {private String url;private String method;public MyRequest(InputStream inputStream) throws IOException {String httpRequest = "";byte[] httpRequestBytes = new byte[1024];int length = 0;if((length = inputStream.read(httpRequestBytes)) > 0) {httpRequest = new String(httpRequestBytes, 0, length);}String httpHead = httpRequest.split("\n")[0];url = httpHead.split("\\s")[1];method = httpHead.split("\\s")[0];System.out.println(this.toString());}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public String getMethod() {return method;}public void setMethod(String method) {this.method = method;}@Overridepublic String toString() {return "MyRequest -- url:" + url + ",method:" + method;}} package mytomcat;import java.io.IOException; import java.io.OutputStream;/*** 封裝http響應(yīng)*/ public class MyResponse {private OutputStream outputStream;public MyResponse (OutputStream outputStream) {this.outputStream = outputStream;}public void write(String content) throws IOException {StringBuffer httpResponse = new StringBuffer();httpResponse.append("HTTP/1.1 200 OK\n").append("Content-Type: text/html\n").append("\r\n").append(content);outputStream.write(httpResponse.toString().getBytes());outputStream.close();}}2.2 實(shí)現(xiàn)不同的Servlet
package mytomcat; /*** Servlet抽象類*/ public abstract class MyServlet {public abstract void doGet(MyRequest myRequest, MyResponse myResponse);public abstract void doPost(MyRequest myRequest, MyResponse myResponse);public void service(MyRequest myRequest, MyResponse myResponse) {if(myRequest.getMethod().equalsIgnoreCase("POST")) {doPost(myRequest, myResponse);}else if(myRequest.getMethod().equalsIgnoreCase("GET")) {doGet(myRequest, myResponse);}} } package mytomcat;import java.io.IOException;/*** 處理操作'書'的http請求*/ public class BookServlet extends MyServlet {@Overridepublic void doGet(MyRequest myRequest, MyResponse myResponse) {try {myResponse.write("[get] book...");}catch(IOException e) {e.printStackTrace();}}@Overridepublic void doPost(MyRequest myRequest, MyResponse myResponse) {try {myResponse.write("[post] book...");}catch(IOException e) {e.printStackTrace();}}} package mytomcat;import java.io.IOException;/*** 處理操作'車'的http請求*/ public class CarServlet extends MyServlet {@Overridepublic void doGet(MyRequest myRequest, MyResponse myResponse) {try {myResponse.write("[get] car...");}catch(IOException e) {e.printStackTrace();}}@Overridepublic void doPost(MyRequest myRequest, MyResponse myResponse) {try {myResponse.write("[post] car...");}catch(IOException e) {e.printStackTrace();}}}2.3 定義Servlet映射POJO類
package mytomcat;public class ServletMapping {private String servletName;private String url;private String className;public ServletMapping(String servletName, String url, String className) {super();this.servletName = servletName;this.url = url;this.className = className;}public String getServletName() {return servletName;}public void setServletName(String servletName) {this.servletName = servletName;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public String getClassName() {return className;}public void setClassName(String className) {this.className = className;}}2.4 配置Servlet映射關(guān)系
package mytomcat;import java.util.ArrayList; import java.util.List;/*** 配置請求url和處理的servlet的對應(yīng)關(guān)系*/ public class ServletMappingConfig {public static List<ServletMapping> servletMappingList = new ArrayList<>();;static {servletMappingList.add(new ServletMapping("Book", "/book", "mytomcat.BookServlet"));servletMappingList.add(new ServletMapping("Car", "/car", "mytomcat.CarServlet"));}}2.5 主類
package mytomcat;import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.HashMap; import java.util.Map;public class MyTomcat {private int port;//保存請求url和處理請求servlet的對應(yīng)關(guān)系private Map<String, String> urlServletMap = new HashMap<String, String>();public MyTomcat(int port) {this.port = port;}public void start() {initServletMapping();ServerSocket serverSocket = null;try {serverSocket = new ServerSocket(port);System.out.println("MyTomcat is start...\n監(jiān)聽端口:" + port);while(true) {System.out.println("等待請求...");Socket socket = serverSocket.accept();InputStream inputStream = socket.getInputStream();OutputStream outputStream = socket.getOutputStream();MyRequest myRequest = new MyRequest(inputStream);MyResponse myResponse = new MyResponse(outputStream);//請求分發(fā)disPatch(myRequest, myResponse);socket.close();}}catch(IOException e) {e.printStackTrace();}finally {if(serverSocket != null) {try {serverSocket.close();}catch(IOException e) {e.printStackTrace();}}}}//初始化url和處理的servlet的對應(yīng)關(guān)系private void initServletMapping() {for(ServletMapping servletMapping: ServletMappingConfig.servletMappingList) {urlServletMap.put(servletMapping.getUrl(), servletMapping.getClassName());}}//分發(fā)處理請求private void disPatch(MyRequest myRequest, MyResponse myResponse) {String className = urlServletMap.get(myRequest.getUrl());//反射try {Class<MyServlet> myServletClass = (Class<MyServlet>) Class.forName(className);MyServlet myServlet = myServletClass.newInstance();myServlet.service(myRequest, myResponse);}catch(Exception e) {e.printStackTrace();}}public static void main(String[] args) {MyTomcat myTomcat = new MyTomcat(8080);myTomcat.start();} }3. 測試
運(yùn)行MyTomcat主類,然后在瀏覽器輸入http://localhost:8080/car,可以看到返回[get] car...,大功告成。
源碼地址:
https://github.com/WangJun-SCU/mytomcat
總結(jié)
以上是生活随笔為你收集整理的实现一个简单的Tomcat的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最烂Windows操作系统究竟是哪一代
- 下一篇: xr和8p性价比