0. 前言
使用 Java 语言实现服务端应用的企业占比很大,特别是现今 Web 应用大展异彩的时刻。作为 web 前端开发,掌握 Java 的开发有利于你的职业更进一步。为了让你快速入门 Java,今天纳撸多要分享的是如何快速开发部署一个 Java web 后端简单应用。
文章大纲:
- 开发制品,编写 Java 代码
- 制品构建,打包 Java 代码
- 部署制品,部署 Java 代码
1. 如何开发制品
一个 web 应用简单考虑由三部分组成:浏览器作为客户端,Java 应用作为服务端,通信协议是 HTTP。我们要实现的效果是:在浏览器地址栏,访问应用地址,在页面中打印出 “Hello, naluduo" 文字,为此我们需要使用 Java 编写一个 HTTP 服务器响应浏览器端的访问请求。
1.1 Servlet 入门
编写 HTTP 服务器其实不难,在 Java 中只需要先编写给予多线程的 TCP 服务器,然后在一个 TCP 连接中读取 HTTP 请求,发送 HTTP 响应即可,可以看到下图中的客户端应用与服务端应用通信结构:
┌───────────┐ ┌───────────┐
│Application│ │Application│
├───────────┤ ├───────────┤
│ Socket │ │ Socket │
├───────────┤ ├───────────┤
│ TCP │ │ TCP │
├───────────┤ ┌──────┐ ┌──────┐ ├───────────┤
│ IP │<────>│Router│<─────>│Router│<────>│ IP │
└───────────┘ └──────┘ └──────┘ └───────────┘
现在我们使用 Java 代码编写一个 HTTP 服务器,这块代码理解下传统的开发流程,相对底层。不想看,可以直接跳过。
import java.io.BufferedReader; // 缓冲读取
import java.io.BufferedWriter; // 缓冲写入
import java.io.IOException; // 异常
import java.io.InputStream; // 输入流
import java.io.InputStreamReader; // 输入流读取
import java.io.OutputStream; // 输出流
import java.io.OutputStreamWriter; // 输出
import java.net.ServerSocket; // socket 包
import java.net.Socket;
import java.nio.charset.StandardCharsets;
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(5050); // 监听指定端口
System.out.println("server is running...");
for (;;) {
Socket sock = ss.accept();
System.out.println("connected from " + sock.getRemoteSocketAddress());
Thread t = new Handler(sock); // 新建线程
t.start();
}
}
}
class Handler extends Thread {
Socket sock;
public Handler(Socket sock) {
this.sock = sock;
}
@Override
public void run() {
try (InputStream input = this.sock.getInputStream()) {
try (OutputStream output = this.sock.getOutputStream()) {
handle(input, output);
}
} catch (Exception e) {
try {
this.sock.close();
} catch (IOException ioe) {
}
System.out.println("client disconnected.");
}
}
private void handle(InputStream input, OutputStream output) throws IOException {
System.out.println("Process new http request...");
var reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
var writer = new BufferedWriter(new OutputStreamWriter(output, StandardCharsets.UTF_8));
// 读取HTTP请求:
boolean requestOk = false;
String first = reader.readLine();
if (first.startsWith("GET / HTTP/1.")) {
requestOk = true;
}
for (;;) {