1. 程式人生 > >模擬帶Servlet技術的HTTP伺服器的Java實現

模擬帶Servlet技術的HTTP伺服器的Java實現

上一篇文章說道, Web發展初期, 使用者只能檢視靜態頁面. 隨著Web發展,只能顯示靜態頁面的web顯然已經不能滿足大眾的需求,所以出現了CGI和用Java編寫的Servlet程式.
Servlet可以根據使用者的請求動態的生成html頁面,然後發給瀏覽器.

下面模擬一下這個過程:

  • HttpServer2類:伺服器類,負責啟動Http服務.
  • Servlet介面: 定義Servlet服務介面.
  • HelloServlet類:實現Servlet介面.使用者提交請求時,HttpServer2將請求發給HelloServlet處理.處理完後動態生成頁面返回給使用者.
  • ServletRequest類: 封裝使用者的請求.交給HelloServlet處理.
  • ServletResponse類: 封裝返回的響應.由HelloServlet返回.

HttpServer2類

伺服器類,負責啟動Http服務.

import java.io.*;
import java.net.*;

public class HttpServer2 {
    private static final int port = 8088;
    private ServerSocket serverSocket = null;

    public HttpServer2() throws IOException {
        serverSocket = new
ServerSocket(port); System.out.println("HTTPServer startup OK..."); } public void work() throws IOException { while (true) { try { Socket socket = serverSocket.accept(); ServletRequest request = new ServletRequest( socket.getInputStream()); ServletResponse response = new
ServletResponse( socket.getOutputStream()); System.out.println("Receive request:\n" + request.getRequest()); String servletName = request.getServletName(); ​ ​//動態生成servlet Servlet servlet = (Servlet) Class.forName(servletName) .newInstance(); ​//呼叫servlet介面 servlet.init(); servlet.service(request, response); servlet.destroy(); socket.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public static void main(String[] args) throws IOException, InterruptedException { HttpServer2 httpServer = new HttpServer2(); httpServer.work(); } }

Servlet介面

定義Servlet服務介面.

public interface Servlet {
    public void init();
    public void service(ServletRequest req, ServletResponse res) throws Exception;
    public void destroy();
}

HelloServlet類

實現Servlet介面.使用者提交請求時,HttpServer2將請求發給HelloServlet處理.處理完後動態生成頁面返回給使用者.

public class HelloServlet implements Servlet {

    @Override
    public void init() {
        // TODO Auto-generated method stub
        System.out.println("servlet init ");
    }

    @Override
    public void service(ServletRequest req, ServletResponse res)
            throws Exception {
        // TODO Auto-generated method stub
        String contentType = req.getContentType();
        String param = req.getParam();
    ​//組裝HTTP響應頭
        String header = res.assembleResponseHeader(contentType);
    ​//組裝HTTP響應正文
        String body = res.assembleResponseBody(param);
    ​//返回響應
        res.write(header + body);
    }

    @Override
    public void destroy() {
        // TODO Auto-generated method stub
        System.out.println("servlet destroy ");
    }

}

ServletRequest類

封裝使用者的請求.交給HelloServlet處理.

import java.io.IOException;
import java.io.InputStream;

public class ServletRequest {
    private String request;
    private InputStream socketIn;
    private String URI;
    private String contentType;
    private String param;

    public ServletRequest(InputStream socketIn) throws IOException {
        // TODO Auto-generated constructor stub
        this.socketIn = socketIn;
        this.request = _getRequest();
        this.URI = _getURI();
        this.contentType = _getContentType();
        this.param = _getParam();
    }

    public String getRequest() {
        return request;
    }

    public String getURI() {
        return URI;
    }

    public String getContentType() {
        return contentType;
    }

    public String getParam() {
        return param;
    }

    private String _getRequest() throws IOException {
        int size = socketIn.available();
        byte[] requestBuff = new byte[size];
        socketIn.read(requestBuff);
        return new String(requestBuff);
    }
    ​//獲得要呼叫servlet的類名
    public String getServletName(){
        return URI.substring(URI.indexOf("/") + 1, URI.indexOf("?"));
    }

    private String _getURI() {
        String firstLine = request.substring(0, request.indexOf("\r\n"));
        String[] parts = firstLine.split(" ");

        return parts[1];
    }

    private String _getContentType() {
        /* 決定HTTP響應正文的型別 */
        return "html";
    }

//獲得請求引數
    private String _getParam() {
        String paramString = URI.substring(URI.indexOf("?") + 1);
        String[] paramPairs = paramString.split("=");
        return paramPairs[1];
    }
}

ServletResponse類

封裝返回的響應.由HelloServlet返回.

import java.io.IOException;
import java.io.OutputStream;

public class ServletResponse {
    private OutputStream outputStream;

    public ServletResponse(OutputStream outputStream) {
        // TODO Auto-generated constructor stub
        this.outputStream = outputStream;
    }

    public String assembleResponseHeader(String contentType) {
        /* 建立HTTP響應結果 */
        // HTTP響應的第一行
        String responseFirstLine = "HTTP/1.1 200 OK\r\n";
        // HTTP響應頭
        String responseHeader = "Content-Type:" + contentType + "\r\n\r\n";

        return responseFirstLine + responseHeader;
    }

    public String assembleResponseBody(String param) {
        String content = "<body><h1>Hello:" + param + "</h1></body>";
        String title = "<head><title>HelloWorld</title></head>";
        String body = "<html>" + title + content + "</html>";
        return body;
    }

    public void write(String res) throws IOException {
        outputStream.write(res.getBytes());
    }

}

測試

在chrome瀏覽器輸入http://localhost:8088/HelloServlet?username=tom.
即使用者請求的引數是tom,要呼叫HelloServlet. (在實際的servlet實現中,是用一個web.xm配置檔案實現URI到servlet的對映.)

這裡寫圖片描述

servlet解析出來後組裝成html返回給瀏覽器.顯示為Hello:tom

這裡寫圖片描述

相關推薦

模擬Servlet技術HTTP伺服器Java實現

上一篇文章說道, Web發展初期, 使用者只能檢視靜態頁面. 隨著Web發展,只能顯示靜態頁面的web顯然已經不能滿足大眾的需求,所以出現了CGI和用Java編寫的Servlet程式. Servlet可以根據使用者的請求動態的生成html頁面,然後發給瀏覽器.

java 模擬session的http請求

1.不帶session的請求 服務端 @RequestMapping("/test1") @ResponseBody public String test1() { return "no land can see !"; } 客戶端 CloseableHttpCli

作業系統- 實驗四 模擬FIFO頁面置換演算法(Java實現

                                          &

作業系統-實驗三 模擬處理機HRRN排程演算法(Java實現

                                          &

詳解NodeJS搭建HTTP伺服器實現步驟

前言 在 NodeJS 中用來建立服務的模組是 http 核心模組,本篇就來介紹關於使用 http 模組搭建 HTTP 伺服器和客戶端的方法,以及模組的基本 API。 HTTP 伺服器 1、建立 HTTP 伺服器 在 NodeJS 中,建立 HTTP 伺服器可以與 net 模

Linux下curl模擬header的Http請求

curl -H "Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-E

一個簡單的http伺服器實現 含原始碼

EasyHttp 最簡單的http伺服器 說明: 這是一個C語言編寫的http伺服器簡單實現,使用python語言作為cgi程式處理使用者的表單輸入。通過這個專案有利於理解http服務流程,以及

利用socket技術實現java實現客戶端向服務端傳送檔案,伺服器端接收檔案並給出一個響應。

通訊是網路程式設計中重要的組成部分,而socket程式設計是網路程式設計的基礎。利用socket可以實現客戶端和伺服器端的通訊。下面我先把客戶端和伺服器端的程式碼粘上去再進行詳細的分析。 package test1; import java.io.File; import java.io

使用VC6實現基於winsock技術伺服器客戶機模擬程式

網路程式設計課:實驗1。 程式已跑通,現貼出來詳細步驟: 1.開啟vc6,新建一個工程。開啟選單欄欄裡的File(檔案) - > New(新建) - > Projects。然後選擇Win32控制檯應用程式。 給工程起名tcpserver,選擇工程目錄(預設就可以)。之後

基於 Java NIO 實現簡單的 HTTP 伺服器

1.簡介 本文是上一篇文章實踐篇,在上一篇文章中,我分析了選擇器 Selector 的原理。本篇文章,我們來說說 Selector 的應用,如標題所示,這裡我基於 Java NIO 實現了一個簡單的 HTTP 伺服器。在接下來的章節中,我會詳細講解 HTTP 伺服器實現的過程。另外,本文所對應的

JAVA實現簡易HTTP伺服器

說實話,之前完全沒有想過,我還能寫出伺服器。感覺伺服器這麼高階的東西,能會用就不錯了,還能寫。 不吐槽了,開始了。 這次的作業是搭建一個伺服器,要能接收請求,並給瀏覽器返回正確響應。 專案的下載地址 專案目標:實現一個簡易的多執行

基於Java實現簡單Http伺服器之一

        本文將詳細介紹如何基於java語言實現一個簡單的Http伺服器,文中將主要介紹三個方面的內容:1)Http協議的基本知識、2)java.net.Socket類、3)java.net.ServerSocket類,讀完本文後你可以把這個伺服器用多執行緒的技術重新編

android客戶端與部署到tomcat的servlet伺服器之間實現http通訊

博主目前小白,為了完成這個踩到不少地雷,在此處記錄下,可能錯誤忘記了,以後想起來再更新。 伺服器端: public class Servlet extends HttpServlet { @Override protected void doPo

Java執行緒池技術之二 Java執行緒池實現

一,介紹   類檢視如下:     自Java 1.5後,Java對執行緒相關的庫做了很大的拓展,執行緒池就是其中之一。Java執行緒的新特性多數在java.util.concurrent,其包含眾多的介面和類。其中java.util.concurrent.Execut

java 實現ajax傳送http請求,直接訪問伺服器

 //-----------------------------客戶端請求時需要把中文轉碼 --------------------- /**       * 向指定URL傳送POST方法的請求   

JAVA實現一個簡單地Http伺服器

SimpleHttpServer.java import java.io.FileInputStream; import java.io.IOException; import java.net.InetSocketAddress; import java.net.So

使用Java實現簡單的Http伺服器

在Java中可以使用HttpServer類來實現Http伺服器,該類位於com.sun.net包下(rt.jar)。實現程式碼如下: 主程式類 package bg.httpserver; import com.sun.net.httpserver.HttpServer; import java.io.IO

java實現鏈表模擬LinkedList類

trac () object new mov this index als size LinkedList類底層數據結構 模擬: 1 package Collection; 2 3 public class MyLinkedList { 4 No

java 實現HTTP連接(HTTPClient)

ons urlencode arraylist col response str exec utils default   在實習中,使用到了http連接,一直理解的很模糊,特地寫個分析整理篇。分析不到位的地方請多多指教。   Http 目前通用版本為 http 1.1 。

Java對象池技術的原理及其實現

問題 多種方式 等待 具體實現 tex sin 工作 程序 collect Java對象的生命周期分析  Java對象的生命周期大致包括三個階段:對象的創建,對象的使用,對象的清除。因此,對象的生命周期長度可用如下的表達式表示:T = T1 + T2 +T3。其中T1