<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    kalman03

    每天早上看一遍《福布斯》富翁排行榜,如果上面沒有我的名字,我就去學(xué)習(xí)......
    隨筆 - 22, 文章 - 0, 評論 - 86, 引用 - 0
    數(shù)據(jù)加載中……

    手動實現(xiàn)Web容器

          一個類似Tomcat的容器,不過只是模擬Web容器的解析過程,只做了簡單的解析HTML。
          首先用Java IDE建立一個普通的Java Project,要解析web少不了Request和Response對象,所以在工程(項目)里建立兩個類:MyHttpServletRequest(對應(yīng)HttpServletRequest)、MyHttpServletResponse(對應(yīng)HttpServletResponse),如下:
    //MyHttpServletRequest.java
    package com.kalman03.servlet;

    import java.io.BufferedReader;
    import java.io.IOException;

    public class MyHttpServletRequest{
        
    private BufferedReader br;
        
    private String header;
        
    public MyHttpServletRequest(BufferedReader br){
            
    try{
                
    this.br = br;
                
    this.header = br.readLine();//  GET /index.html HTTP/1.1
            }catch(IOException ex){
                ex.printStackTrace();
            }
        }   

        
    public String getURL(){
            String [] temp 
    = header.split(" ");
            
    return temp[1].substring(1);
        }
    }

    //MyHttpServletResponse.java
    package com.kalman03.servlet;

    import java.io.PrintWriter;

    public class MyHttpServletResponse{
        
    private PrintWriter out;
        
    public MyHttpServletResponse(PrintWriter out){
            
    this.out = out;
            out.println(
    "HTTP/1.1 200 OK");
        }

        
    public PrintWriter getWriter(){
            
    return out;
        }
    }

    構(gòu)造一個抽象類MyHttpServlet:
    //MyHttpServlet.java
    package com.kalman03.servlet;

    public abstract class MyHttpServlet{
        
    public abstract void doGet(MyHttpServletRequest request,MyHttpServletResponse response)throws Exception;
        
    public abstract void doPost(MyHttpServletRequest request,MyHttpServletResponse response)throws Exception;
    }

    用MyServlet類實現(xiàn)上面MyHttpServlet抽象類:
    //MyServlet.java
    package com.kalman03.servlet.ext;

    import java.io.BufferedReader;
    import java.io.PrintWriter;
    import java.io.File;
    import java.io.FileReader;
    import com.kalman03.servlet.MyHttpServlet;
    import com.kalman03.servlet.MyHttpServletRequest;
    import com.kalman03.servlet.MyHttpServletResponse;

    //該類繼承MyHttpServlet類,實現(xiàn)其中的doGet(),doPost()方法
    public class MyServlet extends MyHttpServlet {
        
    private PrintWriter out;
        
    private String url;

        
    public void doGet(MyHttpServletRequest request,
                          MyHttpServletResponse response) 
    throws Exception {
            
    this.out = response.getWriter();
            url 
    = request.getURL();
            
    if (url.equals("")) {
                url 
    = "index.html";
            }
            File file 
    = new File(url);
            FileReader fr 
    = new FileReader(file);
            BufferedReader brR 
    = new BufferedReader(fr);
            String temp;
            
    while ((temp = brR.readLine()) != null) {
                out.println(temp);
            }
            out.close();
            brR.close();
            fr.close();
        }

        
    public void doPost(MyHttpServletRequest request,
                           MyHttpServletResponse response) 
    throws Exception {
            
    this.doGet(request, response);
        }
    }

    跑一個線程監(jiān)聽類MyWebService:
    //MyWebService.java
    package com.kalman03.servlet;

    import java.net.ServerSocket;
    import java.net.Socket;
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;

    public class MyWebService {
        
    public MyWebService(MyHttpServlet ms) {
            
    try {
                ServerSocket ss 
    = new ServerSocket(2008);
                
    while (true) {
                    Socket s 
    = ss.accept();
                    
    new myRunnable(s, ms).start();
                }
            } 
    catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }


    //線程監(jiān)聽
    class myRunnable extends Thread {
        
    private Socket s;
        
    private MyHttpServlet ms;
        
    public myRunnable(Socket s, MyHttpServlet ms) {
            
    this.s = s;
            
    this.ms = ms;
        }

        
    public void run() {
            
    try {
                BufferedReader br 
    = new BufferedReader(new InputStreamReader(s.
                        getInputStream()));
                PrintWriter out 
    = new PrintWriter(s.getOutputStream(), true);
                MyHttpServletRequest req 
    = new MyHttpServletRequest(br);
                MyHttpServletResponse rep 
    = new MyHttpServletResponse(out);
                ms.doGet(req, rep);
                br.close();
                out.close();
            } 
    catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }

    至此大工基本告成,再來一個main方法(MainClass類)就OK了:
    //MainClass.java
    package com.kalman03.test;

    import com.kalman03.servlet.MyWebService;
    import com.kalman03.servlet.ext.MyServlet;

    public class MainClass {
        
    public static void main (String[] args) {
           
    new MyWebService(new MyServlet());
       }
    }

    運行,OK!一個web容器已經(jīng)啟動,當(dāng)你在剛建的工程(項目)目錄下丟一個HTML(比如welcome.html),在瀏覽器里輸入http://127.0.0.1:2008/welcome.html,即可解析welcome.html。
    示例效果:




    posted on 2008-10-17 22:40 kalman03 閱讀(2139) 評論(6)  編輯  收藏 所屬分類: JSP/Servlet

    評論

    # re: 手動實現(xiàn)Web容器  回復(fù)  更多評論   

    補(bǔ)充一下,這里設(shè)置的默認(rèn)端口為2008,當(dāng)沒有指定具體頁面時候,尋找的是index.html
    2008-10-17 22:48 | kalman03

    # re: 手動實現(xiàn)Web容器  回復(fù)  更多評論   

    看看 NanoHTTPD 這個單文件開源HTTP服務(wù)器, 做的很棒.
    2008-10-18 09:23 | BeanSoft

    # re: 手動實現(xiàn)Web容器  回復(fù)  更多評論   

    @BeanSoft
    where??
    2008-10-18 17:00 | kalman03

    # re: 手動實現(xiàn)Web容器  回復(fù)  更多評論   

    http://elonen.iki.fi/code/nanohttpd/ 可能要代理才能上去...

    http://m.tkk7.com/beansoft/archive/2008/10/18/235235.html 我轉(zhuǎn)發(fā)了一份
    2008-10-18 22:47 | BeanSoft

    # re: 手動實現(xiàn)Web容器  回復(fù)  更多評論   

    @BeanSoft
    謝謝
    2008-10-19 01:02 | kalman03

    # re: 手動實現(xiàn)Web容器  回復(fù)  更多評論   

    好文章啊~~
    2010-05-27 16:40 | 蚊香

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 内射少妇36P亚洲区| 春暖花开亚洲性无区一区二区| 波多野结衣在线免费视频| 亚洲人成网国产最新在线| 国产一区在线观看免费| 你是我的城池营垒免费看| 亚洲福利一区二区| 四虎影在线永久免费观看| 污视频在线免费观看| jzzijzzij在线观看亚洲熟妇| 亚洲欧洲日产国码av系列天堂| 成人免费的性色视频| 无码人妻一区二区三区免费视频| 色偷偷亚洲女人天堂观看欧| 免费看一级做a爰片久久| 无码AV片在线观看免费| 看成年女人免费午夜视频| 18禁超污无遮挡无码免费网站国产| 人碰人碰人成人免费视频| 亚洲精品在线视频观看| 国产精品亚洲综合专区片高清久久久| 91香蕉国产线在线观看免费| 美美女高清毛片视频黄的一免费 | 老色鬼久久亚洲AV综合| 日本一道综合久久aⅴ免费| 视频免费在线观看| 国产偷国产偷亚洲高清人| 亚洲欧洲国产成人精品| 亚洲产国偷V产偷V自拍色戒| 日韩电影免费在线观看视频| 67pao强力打造国产免费| 亚洲综合亚洲国产尤物| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 亚洲女同成av人片在线观看| 日韩高清免费观看| 永久在线免费观看| 精品免费视在线观看| 美女被吸屁股免费网站| 亚洲熟妇无码AV不卡在线播放| 亚洲不卡中文字幕无码| 亚洲色婷婷一区二区三区|