kalman03

每天早上看一遍《福布斯》富翁排行榜,如果上面没有我的名字,我就去学习......
随笔 - 22, 文章 - 0, 评论 - 86, 引用 - 0
数据加载中……

手动实现Web容器

      一个类似Tomcat的容器,不过只是模拟Web容器的解析过程,只做了简单的解析HTML。
      首先用Java IDE建立一个普通的Java Project,要解析web少不了Request和Response对象,所以在工程(项目)里建立两个类:MyHttpServletRequest(对应HttpServletRequest)、MyHttpServletResponse(对应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;
    }
}

构造一个抽象类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类实现上面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类,实现其中的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);
    }
}

跑一个线程监听类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();
        }
    }
}


//线程监听
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容器已经启动,当你在刚建的工程(项目)目录下丢一个HTML(比如welcome.html),在浏览器里输入http://127.0.0.1:2008/welcome.html,即可解析welcome.html。
示例效果:




posted on 2008-10-17 22:40 kalman03 阅读(2112) 评论(6)  编辑  收藏 所属分类: JSP/Servlet

评论

# re: 手动实现Web容器  回复  更多评论   

补充一下,这里设置的默认端口为2008,当没有指定具体页面时候,寻找的是index.html
2008-10-17 22:48 | kalman03

# re: 手动实现Web容器  回复  更多评论   

看看 NanoHTTPD 这个单文件开源HTTP服务器, 做的很棒.
2008-10-18 09:23 | BeanSoft

# re: 手动实现Web容器  回复  更多评论   

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

# re: 手动实现Web容器  回复  更多评论   

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

http://www.blogjava.net/beansoft/archive/2008/10/18/235235.html 我转发了一份
2008-10-18 22:47 | BeanSoft

# re: 手动实现Web容器  回复  更多评论   

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

# re: 手动实现Web容器  回复  更多评论   

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

只有注册用户登录后才能发表评论。


网站导航: