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

时间: 2024-08-28 14:16:19

模拟带Servlet技术的HTTP服务器的Java实现的相关文章

漫谈Servlet技术

1.要谈到Servlet技术,不得不先谈谈动态网页的概念. 编写过网页的人都知道,浏览器能够根据HTML静态标记语言来显示各式各样的网页.但是如果我们需要在网页上完成一些业务逻辑:比如登陆验证.或者说网页显示的内容在服务器的数据库中.如果是这样,除了负责显示的HTML标记之外,必须还要有完成这些业务功能的代码存在.这种网页我们就叫做动态网页. 对于静态网页而言,服务器上存在的是一个个纯HTML文件.当客户端浏览器发出HTTP请求时,服务器可以根据请求的URL找到对应的HTML文件,并将HTML代

【Java】Java Servlet 技术简介

Java 开发人员兼培训师 Roy Miller 将我们现有的 servlet 介绍资料修改成了这篇易于学习的实用教程.Roy 将介绍并解释 servlet 是什么,它们是如何工作的,如何使用它们来创建您能够想像到的任意复杂度的 Web 应用程序,以及作为一名专业编程人员,您如何才能最有效地使用 servlet. 5 评论: Roy W. Miller ([email protected]), 独立的软件开发辅导员.程序员和作者, RoleModel Software 2004 年 12 月 2

Java Servlet 技术简介

Java Servlet 技术简介 Java 开发人员兼培训师 Roy Miller 将我们现有的 servlet 介绍资料修改成了这篇易于学习的实用教程.Roy 将介绍并解释 servlet 是什么,它们是如何工作的,如何使用它们来创建您能够想像到的任意复杂度的 Web 应用程序,以及作为一名专业编程人员,您如何才能最有效地使用 servlet. 4 评论: Roy W. Miller ([email protected]), 独立的软件开发辅导员.程序员和作者, RoleModel Soft

CGI与Servlet技术对比

CGI:Common Gateway Interface,通用网关接口. CGI处理步骤 首先,客户端(即Web浏览器)根据某资源的URL向Web服务器提出请求:Web服务器的守护进程(HTTP Daemon)将此请求的参数通过标准输入和环境变量传递给指定的CGI程序,并启动此应用程序进行处理,如要存取数据库服务器上数据库的数据,则向数据库服务器发出处理请求,数据库服务器将执行结果返回给CGI程序,CGI程序把处理结果通过标准输出返回给HTTP Daemon进程,再由HTTP Daemon进程返

Servlet 技术文档(一步步学习,定成高手)

Servlet笔记文档 Servlet,服务器端的小程序,它是相对于Applet而言的,Applet是客户端小程序. Servlet,是接受来自网络的请求(form表单,以及其他的请求),并对不同请求作出不同的响应 Servlet,是基于Http协议的,是运行在web服务器中的程序.这里要提出一个容器的概念. servlet是运行在web容器中,在后面会详细地讲解,这个web容器可以控制Servlet对象的生命周期,控制请求由Servlet对象处理. web服务器,这里的服务器不是硬件概念,而是

Java Servlet技术

当Web刚开始被用来传送服务时,服务提供者就已经意识到了动态内容的需要.Applet是为了实现这个目标的一种最早的尝试,它主要关注使用客户端平台来交付动态用户体验.与此同时,开发人员也在研究如何使用服务器平台实现这个目标.开始的时候,公共网关接口(Common Gateway Interface ,CGI)脚本是生成动态内容的主要技术.虽然使用得非常广泛,但CGI脚本技术有很多的缺陷,这包括平台相关性和缺乏可扩展性.为了避免这些局限性,Java Servlet技术应运而生.它能够以一种可移植的方

javaSE学习笔记—Servlet技术(11)

如果大家要开发一个动态的网站,那么就必须要学习一种动态的网页开发技术.那么在SUN提供的JavaEE中主要包含两种开发动态网页的技术:Servlet和JSP技术. Servlet技术简介 Servlet技术是SUN提供的一种开发动态网页的核心组件之一.可以方便的开发动态网页.主要用得语言是java,开发者只需要实现相应的接口或者继承相应的类,那么你的java文件就是一个动态的网页.当然好需要一些额外的配置即可. 一个Servlet其实就是一个运行在web server上得一个java程序. Se

servlet技术学习随笔

进入这里学习的第二天!开始着手想看servlet,前面看到javabean jsp 跟这个servlet的MVC框架!真心觉得很重要,技术这种东西学会了就很懂!学不会再怎么解释都不明白.看了一整上午!没怎么搞明白!才想起来以前学习c#的土办法!各种去百度!起查……终于算是有点懂得了! (1).  PrintWriter out = response.getWriter();当一个Servlet响应的时候将响应信息通过out对象输出到网页上,当响应结束时它自动被关闭.PrintWriter用处是将

安全狗与数字引擎合作推出带安全设置的云服务器

近日,国内领先的云安全与解决方案提供商安全狗与国内十佳主机服务商数字引擎达成合作,推出全新的带安全设置的云服务器,携手为广大用户带来最高效的云安全管理及服务. 云服务的应用前景被普遍看好,随着云计算市场的快速增长,用户逐步将更多的业务应用向云端进行迁移.但随着云端应用范围的不断拓展,针对的云端的攻击行为也在不断增加.因此,安全性便成为用户选择云服务商的首要考虑因素,其次便是服务价格.服务稳定性以及售后服务质量.此次,安全狗联手数字引擎在在技术和服务上通力合作,为用户提供更安全.更稳定的云服务器.