`

手动实现Web容器(转)

    博客分类:
  • 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。
(转自http://www.blogjava.net/kalman03/archive/2008/10/17/235090.html,尊重原作者的成果)
分享到:
评论

相关推荐

    一个最基本的手动构建web工程

    在IT行业中,手动构建Web工程是一项基础且至关重要的技能,尤其对于初学者和开发者来说,理解这一过程能够帮助他们更好地掌握Web开发的全貌。本文将深入探讨如何手动构建一个最基本的Web工程,涵盖相关的概念、步骤...

    手动实现的简单Spring框架

    【标题】手动实现的简单Spring框架 在Java Web开发领域,Spring框架是一个极其重要的存在,它提供了丰富的功能,包括依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)架构等。本项目是基于对Spring框架核心...

    web容器tomcat7.0

    【标题】:Web容器Tomcat 7.0详解 【描述】:Apache Tomcat是一款开源且免费的Web应用服务器,特别适用于运行Java Servlet和JavaServer Pages(JSP)技术。Tomcat 7.0版本是它的一个重要里程碑,提供了一系列增强...

    docker手动创建tomcat容器且端口映射且磁盘对应

    Docker 手动创建 Tomcat 容器且端口映射且磁盘对应 本文将详细介绍如何使用 Docker 手动创建 Tomcat 容器,并进行端口映射和磁盘对应。 一、创建容器 首先,我们需要使用 Docker 创建一个新的容器。我们可以使用...

    21-04-05_DefaultDIPattern(003_使用常规、泛型、反射等 方式实默认容器注入和管道的建立_Web转控件台).rar

    本资料包"21-04-05_DefaultDIPattern(003_使用常规、泛型、反射等 方式实默认容器注入和管道的建立_Web转控件台)"详细介绍了如何通过常规方法、泛型以及反射来实现默认容器注入和管道的建立,这对于理解和实践.NET ...

    c# ,net 容器

    C#和.NET平台提供了多种实现DI容器的方式,包括自定义实现和使用第三方库。本文将深入探讨C#和.NET中的容器概念、其工作原理以及如何在实践中应用。 首先,让我们了解什么是依赖注入。依赖注入是一种软件设计原则,...

    canal-server-web:canal服务端的web版本,支持使用web容器启动

    【标题】:“canal-server-web:Canal服务端的Web版本,支持在Web容器中启动” 【正文】: Canal是阿里巴巴开源的一款高效、稳定、轻量级的数据库实时增量同步工具,它能够实现对数据库的binlog进行监听并解析,...

    WEB开发需要手动添加的jar包和配置文件集合

    在进行Web开发时,我们经常会遇到需要手动添加的jar包和配置文件,这些是构建一个功能完备、运行稳定的Web应用程序必不可少的部分。"SS+Ajax"的标签表明此资源集主要涉及Spring Framework(简称SS)与Ajax技术的整合...

    servlet实现的一个简单web程序

    在我们的例子中,客户端通常是Web浏览器,而服务器端则是运行Servlet的Web容器,如Tomcat或Jetty。 **注册模块** 在"friend"项目中,注册功能通常涉及以下几个步骤: 1. **创建表单**:HTML页面上有一个表单,...

    Vue 实现手动刷新组件的方法

    本文将探讨几种在Vue中实现手动刷新组件的方法,这些方法可以帮助开发者解决数据更新后视图不刷新的问题。 首先,Vue实例中提供了一个 vm.$forceUpdate() 方法,此方法允许我们强制组件重新渲染。当你在组件的数据...

    离线百度地图 Web示例及使用

    离线百度地图Web示例通常会提供完整的代码示例,帮助开发者快速理解和实现这一功能。在实际应用中,你可能还需要考虑版权问题,因为地图数据可能受到严格的使用条款限制。 总的来说,离线百度地图Web示例及使用涉及...

    JAVA Web中过滤器

    初始化发生在Web应用启动时,Web容器调用filter的init()方法,可以进行一些全局的设置。doFilter()方法会在每次请求匹配到该过滤器时被调用。销毁发生在Web应用关闭或重新部署时,Web容器调用destroy()方法,释放...

    21-04-05_DefaultDIPattern(004_使用常规、泛型、反射等 方式实默认容器注入和管道的建立_Web).rar

    在这个主题中,“21-04-05_DefaultDIPattern(004_使用常规、泛型、反射等 方式实默认容器注入和管道的建立_Web).rar”文件涵盖了如何使用不同的技术来实现依赖注入,特别是关注默认容器的配置以及管道的建立。...

    javaproject_转化为web项目

    JavaProject工程通常是一个标准的Java应用程序,主要包含源代码、资源文件等,而Web项目则是构建Web应用的基础,它需要额外的配置和结构以支持动态网页(如JSP)、Servlet以及Web容器(如Tomcat)的运行。...

    纯java写的web服务器

    然而,一个“纯Java写的web服务器”可能不依赖这些成熟的容器,而是直接实现Servlet的逻辑,或者使用其他方式(如函数式编程、微服务框架)来处理动态请求。 在提供的压缩包文件"myserver"中,可能包含了服务器的源...

    weblucene安装文档

    你可以通过POST请求向 `/admin/indexer` API发送数据,或者在Web界面中手动操作。 7. **配置WebLucene** 在`src/main/resources`目录下,有多个配置文件,如`search-config.xml`和`index-config.xml`,它们定义了...

    servlet生命周期详解

    接着,容器创建一个ServletConfig对象,这个对象包含了Servlet的初始化配置信息,如在web.xml文件中定义的参数。ServletConfig对象还与当前Web应用程序的ServletContext对象关联,ServletContext是整个Web应用的共享...

    使用axis手动编写webservice服务发布,并调用

    本教程将详细介绍如何使用Axis手动创建并调用Web服务。 首先,我们需要了解Web服务的基本概念。Web服务基于SOAP(Simple Object Access Protocol)协议,通过HTTP协议进行通信,使得应用程序可以在网络上共享功能。...

    毕业答辩-基于web的实验室管理系统(自动排课功能的实现).rar

    "自动排课功能的实现"则表明系统能够自动进行课程安排,避免手动排课的繁琐与耗时,这对于规模较大的实验室或课程设置复杂的教育机构来说尤其重要。 【标签】:“rar” “rar”是文件压缩格式,通常用于打包多个...

Global site tag (gtag.js) - Google Analytics