java用原生jdk+freemarker实现一个简单的WebServer

本文介绍如何使用Java自带的HttpServer类快速搭建一个简单的Web服务,并通过Freemarker进行视图渲染,提供了一个基本的Web应用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目前Java开发web最流行的就是Spring系列了。比如SpringBoot,SpringCloud,简单易上手。但有时候,我只想有一个很简单的Web服务,简单到没有数据库,这时候用SpringBoot感觉就有点杀鸡用牛刀了。
我们可以用java自带的jdk实现一个简单的WebServer,用Java自带的com.sun.net.httpserver.HttpServer类就可以了。视图渲染我用了freemarker,需要依赖freemarker-2.3.30.jar
目录结构如下:
在这里插入图片描述

上代码:

package simple_web;

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.Version;

import java.io.*;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class SimpleWebServer {

    private Configuration templateCfg;
    public SimpleWebServer(){
        Version version = new Version("2.3.0");
        templateCfg = new Configuration(version);
        templateCfg.setClassForTemplateLoading(this.getClass(), "");
    }

    public void run(){
        try {
            HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
            server.createContext("/view", new ViewHandler());
            server.createContext("/demo", new DemoHandler());
            server.start();

            System.out.println("Server running");
            System.out.println("Visit: http://localhost:8080/view");
            System.out.println("Visit: http://localhost:8080/demo");
            System.out.println("Hit return to stop...");
            System.in.read();
            System.out.println("Stopping server");
            server.stop(0);
            System.out.println("Server stopped");
        } catch (java.io.IOException ioe) {
            ioe.printStackTrace(System.err);
        }
    }

    private OutputStream viewTemplate(String name, Object dataModel, OutputStream out){
        try {
            Template template = templateCfg.getTemplate(name + ".ftl");
            template.process(dataModel, new PrintWriter(out));
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TemplateException e) {
            e.printStackTrace();
        }
        return out;
    }


    class ViewHandler implements HttpHandler{

        @Override
        public void handle(HttpExchange he) throws IOException {
            System.out.println("Im is ViewHandler");
            he.sendResponseHeaders(200, 0);
            Map<String, Object> dataModel = new HashMap<>();
            dataModel.put("username", "张大宝");
            dataModel.put("userList", selectUser());
            viewTemplate("index", dataModel, he.getResponseBody()).close();
        }

        private List<User> selectUser(){
            List<User> list = new ArrayList<>();
            for (int i = 0; i < 5; i++) {
                User user = new User();
                user.setId(i);
                user.setLogo("https://avatar.csdnimg.cn/E/9/A/3_ma45115200"+ i +".jpg");
                user.setName("小" + i);
                user.setSex((byte)( i % 2));
                user.setTag("我的忧伤,没人能懂");
                list.add(user);
            }
            return list;
        }
    }

    class DemoHandler implements HttpHandler{

        @Override
        public void handle(HttpExchange he) throws IOException {
            System.out.println("Im is DemoHandler");
            he.sendResponseHeaders(200, 0);

            OutputStream out = he.getResponseBody();
            out.write("Hello Demo".getBytes());
            out.close();

        }
    }
}
package simple_web;

public class User {
    private Integer id;
    private String logo;
    private String name;
    private byte sex;
    private String tag;

    // get set ...
}

然后还需要一个模板文件index.ftl,如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="referrer" content="no-referrer" />
    <title>Title</title>
</head>
<style>
    .u-tag{
        padding: 2px 10px;
        background-color: aliceblue;
        border-radius: 10%;
    }
    .u-tag_red{
        background-color: darkred;
        color: aliceblue;
    }
    .u-tag_green{
        background-color: green;
        color: aliceblue;
    }
</style>
<body>
<h4>Hello ${username}</h4>


<#-- 这是注释 -->
<table>
    <thead>
    <tr>
        <th>ID</th>
        <th>头像</th>
        <th>姓名</th>
        <th>性别</th>
        <th>签名</th>
    </tr>
    </thead>
    <tbody>
    <#list userList as user>
        <tr>
            <td>${user.id}</td>
            <td>
                <img src="${user.logo}"/>
            </td>
            <td>${user.name}</td>
            <td>
                <span class="u-tag <#if (user.sex == 0)> u-tag_green </#if>">
                    ${(user.sex == 0) ? string("男", "女")}
                </span>
            </td>
            <td>${user.tag}</td>
        </tr>
    </#list>
    </tbody>
</table>
</body>
</html>

好了,写个main方法,运行起来。

public static void main(String[] args) throws IOException {
	SimpleWebServer server = new SimpleWebServer();
    server.run();
}

在这里插入图片描述
浏览器也显示出来了数据,这样一个很简单的Web服务就完成啦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值