距离开篇已经过了很久,期间完善了一下之前的版本,目前已经能够完好运行,基本上该有的功能都有了,此外将原来的测试程序改为示例项目,新项目只需按照示例项目结构实现controller和view即可,详情见: easy-httpserverdemo-httpsrever
    这次我们将首先来实现一个简单版本,该版本只包括一些基本的功能,后续版本也将在此基础上一步步改进。

    俗话说的好,工欲善其事,必先利其器。我们在开始开发之前应做好如下准备(真的很简单):

  • java开发环境,IDE依据个人爱好,JDK1.6+(1.6之后才自带httpserver)
  • maven环境,项目使用maven构建
  • git,如果你想clone我的代码做参考的话,当然github也支持直接下载zip包

、功能和结构设计

   我们动手写代码之前应该先确定好项目的功能,并设计好项目的结构,虽然我们目前需要实现的很简单,但是还是应该简单的进行一番设计。项目计划的功能如下:

  • 基本的http请求接收和响应
  • 可以分别处理动态和静态资源请求,对于静态请求直接返回对应资源,对于动态请求处理后返回
  • 简单的模板处理,通过替代符替换的方法实现模板数据渲染
  • 简单的log支持,不是必须,但是却很有用

    看起来并没有多少功能,但是其实仅仅这几个功能我们就能完成一个小型的动态网站了。在这里需要提一点,如果你还一点都不了解web服务器的工作流程,可以先看 这篇博客了解一下。这里我们先看一些本次实现的服务器的工作流程图(用在线的 gliffy画的,挺不错):

打造一款属于自己的web服务器——从简单开始

    现在功能方面已经清晰了,那么我们据此来分析一下项目结构的设计,对于http的请求和响应处理我们目前直接使用jdk自带的httpserver处理(httpserver使用);我们需要实现一个比较核心的模块实现各部分之间的衔接,根据httpserver我们可以实现一个EHHttpHandler来处理,其实现了HttpHandler接口,主要功能是接收http请求,判断类型,解析参数,调用业务处理conroller,调用视图处理Viewhandler,最后响应http请求。此外,为了处理业务和视图渲染我们需实现controller和view相关的类。具体结构代码见后边。

三、实现代码

1、新建并配置项目

    首先我们需要新建一个maven项目,首先建立如下结构:

打造一款属于自己的web服务器——从简单开始

    其中主要几个文件夹和类的功能如下:

  • Constants.java存放系统常量,目前主要存放一些路径,如静态文件夹路径等;
  • EHServer是入口类,在这里我们初始化配置,并启动server。
  • EHHttpHandler功能前边已经说过,是项目最核心的类;
  • ResultInfo是一个实体类,主要用来传输Controller处理后的结果;
  • Controller是一个空接口,主要考虑后期拓展;IndexController是业务处理类,其可调用server进行业务处理,并返回结果;
  • ViewHandler是视图处理,根据controller返回的路径和参数集合,找到对应模板页,并替换参数
  • src/main/view文件夹主要存放静态资源(static下)和模板(page下,后缀为.page)

    好了,文件结构建好了,我们接下来配置maven依赖,由于主要使用的是jdk自带的包,因此依赖只需要junit和common-log模块,pom.xml如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>learn-1</groupId>
    <artifactId>learn-1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>learn-1</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.1.3</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <build>
            <finalName>easy-httpserver</finalName>
            <resources>
                <resource>
                    <directory>${basedir}/src/main/view</directory>
                </resource>
            </resources>
        </build>
    </build>
</project>
pom.xml

相关文章:

  • 2021-09-10
  • 2022-12-23
  • 2022-12-23
  • 2021-12-02
  • 2021-10-31
  • 2021-10-08
  • 2023-02-11
猜你喜欢
  • 2022-12-23
  • 2022-01-05
  • 2021-11-19
  • 2021-10-12
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案