成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

實現(xiàn)一個簡單的Tomcat

Zoom / 3218人閱讀

摘要:實現(xiàn)一個簡單的作用我們的應(yīng)用會運行在中,那么顯然請求必定是先到達的,對于請求實際上會進行如下的處理提供服務(wù)的啟動,必然是服務(wù),支持協(xié)議。進行請求的分發(fā)一個可以為多個應(yīng)用提供服務(wù),那么就需要把下發(fā)到不同的應(yīng)用。下面我們就自己來實現(xiàn)這三步。

實現(xiàn)一個簡單的Tomcat 1. Tomcat作用

我們的web應(yīng)用會運行在Tomcat中,那么顯然請求必定是先到達Tomcat的,Tomcat對于請求實際上會進行如下的處理:

提供Socket服務(wù):Tomcat的啟動,必然是Socket服務(wù),支持http協(xié)議。

進行請求的分發(fā):一個Tomcat可以為多個web應(yīng)用提供服務(wù),那么就需要把url下發(fā)到不同的web應(yīng)用。

需要將請求和響應(yīng)封裝成request和response:我們在寫后端代碼的時候都是直接使用request和response的,這是因為Tomcat已經(jīng)做好了。

下面我們就自己來實現(xiàn)這三步。

2. 實現(xiàn)代碼

項目結(jié)構(gòu):

  src
    └─mytomcat
            BookServlet.java
            CarServlet.java
            MyRequest.java
            MyResponse.java
            MyServlet.java
            MyTomcat.java
            ServletMapping.java
            ServletMappingConfig.java
2.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("
")[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;
    }
    
    @Override
        public 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
")
                    .append("Content-Type: text/html
")
                    .append("
")
                    .append(content);
        
        outputStream.write(httpResponse.toString().getBytes());
        outputStream.close();
    }

}
2.2 實現(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 {

    @Override
    public void doGet(MyRequest myRequest, MyResponse myResponse) {
        try {
            myResponse.write("[get] book...");
        }catch(IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public 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 {

    @Override
    public void doGet(MyRequest myRequest, MyResponse myResponse) {
        try {
            myResponse.write("[get] car...");
        }catch(IOException e) {
            e.printStackTrace();
        }
        
    }

    @Override
    public 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 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 urlServletMap = new HashMap();
    
    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...
監(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 myServletClass = (Class) 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. 測試

運行MyTomcat主類,然后在瀏覽器輸入http://localhost:8080/car,可以看到返回[get] car...,大功告成。

源碼地址:

https://github.com/WangJun-SCU/mytomcat

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/72060.html

相關(guān)文章

  • 實現(xiàn)簡單Tomcat | Tomcat原理學習(1)

    摘要:項目結(jié)構(gòu)項目結(jié)構(gòu)如下實現(xiàn)細節(jié)創(chuàng)建對象首先創(chuàng)建自定義的請求類,其中定義與兩個屬性,表示請求的以及請求的方式。其構(gòu)造函數(shù)需要傳入一個輸入流,該輸入流通過客戶端的套接字對象得到。創(chuàng)建服務(wù)端套接字,并綁定某個端口。 緣起 用了那么久tomcat,突然覺得自己對它或許并沒有想象中的那么熟悉,所以趁著放假我研究了一下這只小貓咪,實現(xiàn)了自己的小tomcat,寫出這篇文章同大家一起分享! 照例附上gi...

    Corwien 評論0 收藏0
  • Nginx+Tomcat關(guān)于Session管理

    摘要:前言對的管理一直有了解,但是一直沒有實際操作一遍,本文從最簡單的安裝啟動開始,通過實例的方式循序漸進的介紹了幾種管理的方式。 前言 Nginx+Tomcat對Session的管理一直有了解,但是一直沒有實際操作一遍,本文從最簡單的安裝啟動開始,通過實例的方式循序漸進的介紹了幾種管理session的方式。 nginx安裝配置 1.安裝nginx [root@localhost ~]# y...

    superw 評論0 收藏0
  • 使用 Docker 搭建簡易 Java Web 環(huán)境 (二)

    摘要:創(chuàng)建一個環(huán)境最近公司正在使用開發(fā)網(wǎng)站應(yīng)用,所以有必要了解下如何使用創(chuàng)建對應(yīng)的環(huán)境。還好,提供了文檔的形式來組合多個容器來搭建開發(fā)環(huán)境。下一步我們將使用來構(gòu)建更加復雜的開發(fā)環(huán)境。 showImg(https://segmentfault.com/img/remote/1460000011106825); 從《從最簡單的入手學習 Docker (一)》一文中,可以簡單的了解 Docker ...

    Tamic 評論0 收藏0
  • Java Python 和Nodejs在web開發(fā)方面簡單比較

    摘要:在做數(shù)據(jù)分析和人工智能方面也有很多可以直接使用的算法庫。各方面都能找到優(yōu)秀的組件。但開發(fā)起來復雜一些,更適合有一定規(guī)模的團隊采用。 對語言之間優(yōu)勢這個問題,可以寫幾本書來具體闡述. 我嘗試簡單地說一點。不見得對,也不可能完整,僅供參考。 互聯(lián)網(wǎng)興起,靜態(tài)頁面不能滿足復雜的交互需求. 出現(xiàn)了動態(tài)技術(shù).史前時期動態(tài)Web 開發(fā)多采用CGI 技術(shù)來實現(xiàn). CGI 將腳本作為單獨的進程運行, ...

    Riddler 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<