`
Ydoing
  • 浏览: 106005 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

模拟带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

这里写图片描述

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>

版权声明:本文为博主原创文章,未经博主允许不得转载。

分享到:
评论

相关推荐

    模拟tomcat、servlet服务器

    6. **Servlet规范**:虽然我们不是直接使用Tomcat,但理解Servlet规范对于模拟Servlet服务器至关重要。Servlet是Java Web应用的标准接口,用于扩展服务器的功能。模拟服务器需要实现类似Servlet的接口,处理HTTP请求...

    HttpServer.zip_http servlet server_httpclient_http服务器_java https

    本项目"HttpServer.zip"提供了一个独特的实现,它是一个全网唯一的基于Java编写的完整HTTP Servlet服务器,具备通过XML灵活配置的能力,同时支持HTTPS安全通信。下面我们将深入探讨这个项目中的关键技术点。 一、...

    Servlet3.0 异步处理 页面推送 Comet 实例

    本实例主要关注的是如何利用Servlet3.0的异步处理来实现页面推送技术——Comet。 Comet是一种Web应用程序架构,用于创建持久连接,允许服务器向客户端(通常是浏览器)实时推送数据。在传统的HTTP协议中,服务器...

    JSP,Servlet简易淘宝网JAVA

    本项目“JSP,Servlet简易淘宝网JAVA”旨在通过这两种技术实现一个简单的淘宝网模拟系统,让学生或开发者能够理解其核心概念和实际应用。 首先,Servlet是Java编写的一种服务器端程序,它可以接收并处理客户端...

    JSP+Servlet的模拟移动计费系统的java web项目

    该项目是一个基于Java Web技术的模拟移动计费系统,主要用于理解和实践JSP、Servlet以及相关的Web开发技能。它包含了四个核心模块:操作员管理、资源管理、业务管理和开户业务,这四个模块共同构成了一个完整的计费...

    使用servlet的简单服务器demo

    Servlet是Java API的一部分,它允许开发者编写可插入到Web服务器中的Java代码,以扩展服务器的功能。在我们的"简单服务器demo"中,Servlet将处理客户端发起的HTTP请求,并返回适当的响应。 1. **Servlet生命周期**...

    基于java的一个支持servlet的web服务器.zip

    2. **Servlet技术**:Servlet是Java Web开发中的服务器端组件,用于扩展Web服务器的功能。它们接收HTTP请求,处理数据并返回响应。Servlet生命周期包括加载、初始化、服务、销毁四个阶段,开发者需要理解如何编写...

    JavaServlet示例代码

    JavaServlet是一种用于构建动态Web应用程序的技术,它是Java平台上的服务器端组件,允许开发者在服务器上处理HTTP请求并返回响应。这个示例代码主要是关于用户注册和登录功能的实现,这在许多Web应用中是非常基础且...

    HTTP 通信测试或者JAVAServlet测试

    在IT行业中,HTTP通信测试和Java Servlet测试是Web应用程序开发中的关键环节,它们确保了客户端与服务器之间的数据传输准确无误。在这个场景中,我们关注的是如何通过HTTP协议进行通信,以及如何使用Java Servlet来...

    servlet技术初步入门

    Servlet技术是Java Web开发中的核心组件之一,它用于扩展服务器的功能,处理来自客户端(通常是Web浏览器)的HTTP请求,并向客户端发送响应。本教程将引导初学者了解Servlet的基本概念、工作原理以及如何在实际项目...

    android+servlet服务器

    这个"android+servlet服务器"项目显然涉及到Android客户端与基于Servlet的Web服务器之间的通信,用于实现登录验证功能。以下将详细讲解这一领域的相关知识点。 一、Android客户端开发 1. Android SDK:Android应用...

    JAVA+JSP实现模拟登录主动向用户推送

    总的来说,Java和JSP结合使用,配合AJAX和WebSocket等技术,可以实现模拟登录和主动消息推送的功能。这样的系统对于实时性强、交互频繁的Web应用非常有用,例如社交网络、聊天室或者股票交易系统。在整个过程中,...

    Android Servlet WEB http

    Servlet是一种Java技术,用于扩展Web服务器的功能,处理客户端的请求并返回响应。而HTTP(超文本传输协议)是互联网上应用最为广泛的一种网络协议,它定义了客户端和服务器之间交换数据的方式。Android作为移动开发...

    java模拟tomcat的web服务器源码

    总的来说,模拟Tomcat的Java源码是一个学习服务器编程的好起点,它可以帮助你掌握Servlet的使用,理解HTTP协议,以及服务器如何处理并发请求。通过深入研究,你可以更好地设计和优化自己的Web应用程序,甚至可以为...

    简单的servlet容器实现

    Servlet容器是Java Web开发中的核心组件,它负责管理和运行Servlet,处理HTTP请求并返回响应。在本示例中,我们看到一个简化的Servlet容器的实现,这个容器仅用于理解基本概念,而非生产环境中的实际应用。 首先,...

    【Java项目】基于servlet的商品进销存售系统(源码+设计模式类图)

    狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的...

    JAVA网上商城-servlet运用

    在Java EE平台上构建网上商城系统是常见的应用场景,Servlet作为Java服务器端编程的核心技术,扮演着处理HTTP请求和响应的重要角色。在这个基于JAVA EE的网上商城项目中,Servlet被用来实现用户与服务器之间的交互,...

    JAVA实现模拟导入数据/上传文件进度条

    在Java Web开发中,实现一个模拟数据导入或文件上传进度条功能可以极大提升用户体验,让用户在等待过程中心中有数。这个功能通常涉及到前端与后端的交互,涉及到的技术包括Servlet、JSP、jQuery和Ajax。下面我们将...

    servlet模拟器

    在IT行业中,Servlet技术是Java Web开发的核心组成部分,主要用于处理HTTP请求和响应。Servlet模拟器是一种工具,它能够帮助开发者理解和测试Servlet程序,而无需实际部署到Web服务器上。在这个场景下,我们主要关注...

    java 实现百度网盘模拟

    本项目旨在通过Java技术栈,模拟实现一个类似于百度网盘的客户端/服务器(C/S)架构系统,为用户提供多用户登录、文件管理等一系列功能。下面我们将深入探讨该系统的实现原理和关键技术。 【描述详解】 1. **多...

Global site tag (gtag.js) - Google Analytics