前端视角 Java Web 入门手册 1.5:Java Web 的 Hello World!

165 阅读2分钟

Node.js HTTP Server

学过 Node.js 的同学肯定会对创建一个 HttpServer 的代码印象深刻

const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

Java HttpServer

在 Java 中创建一个 HTTP 服务器同样很简单,Java 提供了内置的 com.sun.net.httpserver.HttpServer 类,使得开发者可以快速搭建一个轻量级的 HTTP 服务器,严格意义上讲,这次是本门课程的 Helllo world!

import java.io.OutputStream;
import java.net.InetSocketAddress;
import com.sun.net.httpserver.HttpServer;

public class MyFunctionalHttpServer {

  public static void main(String[] args) throws Exception {
    // 第二个参数 0 表示使用默认的连接队列大小 
    HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
    server.createContext("/", (exchange -> {
      String response = "Hello Java Web!";
      exchange.sendResponseHeaders(200, response.length());
      OutputStream os = exchange.getResponseBody();
      os.write(response.getBytes());
      os.close();
    }));
    server.setExecutor(null);
    server.start();
    System.out.println("Server started on port 8080");
  }
}

代码几乎可以和 Node.js 版本一一对应,保存上述代码为 SimpleHttpServer.java,然后在终端中编译:

$ javac SimpleHttpServer.java
$ java SimpleHttpServer

在浏览器访问 http://localhost:8080 可以看到响应内容

可以稍微完善一下代码

import com.sun.net.httpserver.HttpServer;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpExchange;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;

public class SimpleHttpServer {

    public static void main(String[] args) throws IOException {
        int port = 8000; // 服务器监听端口
        HttpServer server = HttpServer.create(new InetSocketAddress(port), 0);

        // 创建上下文 /hello,关联处理器
        server.createContext("/hello", new HelloHandler());

        // 设置默认处理器
        server.createContext("/", new RootHandler());

        server.setExecutor(null); // 使用默认的线程池
        server.start();
        System.out.println("服务器已启动,访问 http://localhost:" + port);
    }

    // 处理 /hello 请求的Handler
    static class HelloHandler implements HttpHandler {
        @Override
        public void handle(HttpExchange exchange) throws IOException {
            // 仅处理GET请求
            if ("GET".equals(exchange.getRequestMethod())) {
                String response = "Hello, World!";
                exchange.sendResponseHeaders(200, response.getBytes().length); // 发送状态码和响应长度
                OutputStream os = exchange.getResponseBody();
                os.write(response.getBytes());
                os.close();
            } else {
                // 其他方法返回405 Method Not Allowed
                exchange.sendResponseHeaders(405, -1);
            }
        }
    }

    // 处理根路径 / 的Handler
    static class RootHandler implements HttpHandler {
        @Override
        public void handle(HttpExchange exchange) throws IOException {
            String response = "欢迎来到简单的Java HTTP服务器!";
            exchange.sendResponseHeaders(200, response.getBytes().length);
            OutputStream os = exchange.getResponseBody();
            os.write(response.getBytes());
            os.close();
        }
    }
}

可以为不同的URL路径设置不同的上下文和处理器,以实现多路由的功能

server.createContext("/api/users", new UsersHandler());
server.createContext("/api/products", new ProductsHandler());

除了 GET 方法,还可以在处理器中添加对 POST、PUT、DELETE 等 HTTP 方法的支持

@Override
public void handle(HttpExchange exchange) throws IOException {
    String method = exchange.getRequestMethod();
    switch (method) {
        case "GET":
            // 处理GET请求
            break;
        case "POST":
            // 处理POST请求
            break;
        // 其他方法...
        default:
            exchange.sendResponseHeaders(405, -1); // Method Not Allowed
    }
}

可以设置自定义的响应头和状态码,以实现更丰富的 HTTP 响应

@Override
public void handle(HttpExchange exchange) throws IOException {
    String response = "Custom Header Response";
    exchange.getResponseHeaders().add("Content-Type", "text/plain");
    exchange.getResponseHeaders().add("X-Custom-Header", "MyHeaderValue");
    exchange.sendResponseHeaders(200, response.getBytes().length);
    OutputStream os = exchange.getResponseBody();
    os.write(response.getBytes());
    os.close();
}

值得注意的是,虽然使用 HttpServer 创建服务器简单,但在生产环境中通常建议使用成熟的框架(如Spring Boot)或专门的服务器(如Tomcat、Jetty)来处理更复杂的需求,如高并发、安全性和扩展性等

接下来正式进入 Java Web 的世界吧~