Press "Enter" to skip to content

[教程] ch1 Web界的Hello World

Ch0中,我们大概讲述了需要做一个怎样的东西。那么,从这篇开始,我们就着手搭建这样一个框架。

创建工程与解决依赖

所谓万事开头难。我们先定一个小目标:跑起来一个空的框架,这样再往里面添加东西就方便很多,也更直观一些。

首先,创建一个空的Java应用(这里我用了maven管理,习惯性上我是先建立项目再添加maven管理,你也可以直接创建maven项目)。我叫它Jxpress。这里我用的IDE是IntellJ。当然eclipse或者其他的IDE也可以。

有了一个新的工程之后,我们需要一个底层连接的库。这里我选用Jetty。

在pom.xml里面添加jetty的依赖。

<dependencies>
    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-server</artifactId>
        <version>9.3.11.v20160721</version>
    </dependency>

    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-util-ajax</artifactId>
        <version>9.3.11.v20160721</version>
    </dependency>
</dependencies>

然后选择maven -> download source,jetty就被包含在项目里啦。

第一行代码

处理好了整个工程依赖后,我们可以开始写代码了。

首先,我们的整个项目是要做一个webserver。那么,我们先来定义一下我们需要哪些方法。

listen:监听方法。这个方法告诉我们该监听哪个端口。

start/stop:开始,结束。这个方法用于启动/结束我们的server。

get:注册一个get方法,来处理get请求。

于是我们就有了如下的代码:

public interface WebServer {
    WebServer listen(int port);
    WebServer get(String url);
    WebServer stop();
    WebServer start();
}

如果你好奇为什么我的方法返回类型都是WebServer,答案是:这样我可以通过多个get方式来注册不同的处理方法。现在我们还不处理controller(在不久的将来我们会处理的),而是用一个固定的方法来处理它。

有了这个接口后,我们就可以实现它了!下面我们用JettyServer来实现这个接口。

public class JettyServer implements WebServer {
    private Server server;

    protected int port = 80;
    //用一个list记录所有注册的get方法的URL
    List<String> getURL = new ArrayList<String>();

    public WebServer listen(int port) {
        this.port = port;
        return null;
    }

    //每调用一次get,就在list里添加一个url
    public WebServer get(String url) {
        getURL.add(url);
        return this;
    }

    public WebServer stop() {
        // 如果server对象已经存在
        if ( server != null){
            try{
                server.stop();
            }
            catch (Exception e){
                // do nothing
            }
        }
        return this;
    }

    public WebServer start() {
        server = new Server(this.port);
        try{
            server.start();
        }
        catch (Exception e){
            e.printStackTrace();
        }
        return this;
    }
}

 

敲完以上代码后,我们建立一个Main.java文件。

public class Main {

    public static void main(String[] args) {
        WebServer server = new JettyServer();
        server.get("/").get("/introduce").listen(8081);
        server.start();
    }
}

这样运行后,我们会看到如下图:

添加处理器

小伙伴们好奇了:我们不是添加了 “/”应该显示hello world么?

不错,逻辑上来说是这样没错,但是事实上,我们需要将我们的逻辑放在处理器里,并将JettyServer的处理器设为我们的处理器才行。

创建一个class 叫WebServerHandler,让它实现AbstractHandler.

private static class WebServerHandler extends AbstractHandler {

    private List&lt;String&gt; getURLs;
    public WebServerHandler(List getURLs){
        this.getURLs = getURLs;
    }
    public void handle(String s, Request request,
                    HttpServletRequest httpServletRequest, 
                    HttpServletResponse httpServletResponse) 
              throws IOException, ServletException {
        try{
            process(s, httpServletRequest, httpServletResponse);
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }

    private void process(String s,
                    HttpServletRequest request, 
                    HttpServletResponse response)
              throws IOException {
        for (String each : getURLs){
            // 如果请求的url 与任意一个get注册的url 相等
            if (each.equalsIgnoreCase(s)){
                // 在响应里输出hello world,并把状态字设为200(OK)
                OutputStreamWriter optwriter = new OutputStreamWriter(
                                        response.getOutputStream(),
                                        "utf-8");
                optwriter.write("Hello world!");
                response.setStatus(200);
                optwriter.flush();
            }
        }
    }
}

然后将start方法改成下面的样子:

public WebServer start() {
    server = new Server(this.port);
    // 生成处理器
    Handler hdlr = new WebServerHandler(getURL);
    // 将我们的处理器设为Jetty的处理器
    server.setHandler(hdlr);
    try{
        server.start();
    }
    catch (Exception e){
        e.printStackTrace();
    }
    return this;
}

Hello World!

再次启动我们的服务器,然后访问一下:

Bravo!


本文完整代码在Github上有收录,链接为:https://github.com/andysim3d/JxpressTutorial 

 

One Comment

  1. zhang ding zhang ding

    看懂一半,同志仍需努力!争取让零基础的也能看懂

发表评论

电子邮件地址不会被公开。 必填项已用*标注