模擬帶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
詳解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