使用Java内置的HttpServer构建Web应用

写在前面

大家都知道我们在搭建web应用时,语言肯定首先选择java,通常也离不开tomcat或者jetty等一些容器,为啥呢?
因为这些web服务器功能强大,性能强劲。但是如果我们要做一个小型应用,对性能和需求要求不高,我们并不需要tomcat之类的web服务器,下面我来介绍一下jdk内置的web应用构建需求的类库com.sun.net.httpserver

首先我们查一下jdk文档
在这里插入图片描述

大概意思:
提供简单的高级Http服务器API,可用于构建嵌入式HTTP服务器。支持“http”和“https”。API提供RFC 2016(HTTP 1.1)和RFC 2018
(HTTP over TLS)的部分实现。此API未提供的任何HTTP功能都可以使用API​​通过应用程序代码实现。
程序员必须实现该HttpHandler接口。此接口提供一个回调,调用该回调来处理来自客户端的传入请求。
、HTTP请求及其响应称为交换。HTTP交换由HttpExchange类表示。在HttpServer类用于监听传入的TCP连接,
并调度这些连接到处理器已经在服务器上注册的请求。

根据官方提供的案例我们来搭建一个测试一哈

import com.sun.net.httpserver.HttpExchange;

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

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

public class TestHttpServer {

    public static void main(String[] arg) throws Exception {
        HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0);
        server.createContext("/test", new TestHandler());
        server.start();
    }

    static  class TestHandler implements HttpHandler{
        @Override
        public void handle(HttpExchange exchange) throws IOException {
            String response = "hello httpserver";
            exchange.sendResponseHeaders(200, 0);
            OutputStream os = exchange.getResponseBody();
            os.write(response.getBytes());
            os.close();
        }
    }
}

好嘞,这样一个简单的web应用,就搞定了,如果你用的是idea编辑器,你可以直接复制上面的代码,对着你这包路径 ctrl + v,idea会帮您自动创建好一个类,这时只需要访问一下这个路 径 http://localhost:8000/test 就能返回一个为"hello httpserver"

不过我们还可以让它变得更强大
com.sun.net.httpserver似乎默认不支持同时处理多个请求,一旦有并行的请求涌入,需要排队等待程序处理,导致Web程序响应卡顿。自定义实现的方法也很简单,为每个请求开一个新的线程处理即可

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;
import org.apache.commons.io.IOUtils;

import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.InetSocketAddress;
import java.net.URLDecoder;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

public class Main {
	/**
	 * 用于配置端口和访问地址 并启动
	*/
    public static void main(String[] arg) throws Exception {
        HttpServer server = HttpServer.create(new InetSocketAddress(8001), 0);
        server.createContext("/test", new TestHandler());
        server.start();
    }
	/**
	*实现HttpHandler接口重写handle方法分别对get和post请求进行处理
	*/
    static class TestHandler implements HttpHandler{
        @Override
        public void handle(HttpExchange exchange) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try{
                         String response = "hello httpserver";
                        //获得查询字符串(get)
                        String queryString =  exchange.getRequestURI().getQuery();
                        Map<String,String> queryStringInfo = dataUtil(queryString);
                        //获得表单提交数据(post)
                        String postString = IOUtils.toString(exchange.getRequestBody());
                        Map<String,String> postInfo = dataUtil(postString);
					
                        exchange.sendResponseHeaders(200,0);
                        OutputStream os = exchange.getResponseBody();
                        os.write(response.getBytes());
                        os.close();
                    }catch (IOException ie) {
                        ie.printStackTrace();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    }
  /**
	*根据值的特性解析,并封装到一个map中
	*/
    public static Map<String,String> dataUtil(String formData ) {
        Map<String,String> result = new HashMap<>();
        if(formData== null || formData.trim().length() == 0) {
            return result;
        }
        final String[] items = formData.split("&");
        Arrays.stream(items).forEach(item ->{
            final String[] keyAndVal = item.split("=");
            if( keyAndVal.length == 2) {
                try{
                    final String key = URLDecoder.decode( keyAndVal[0],"utf8");
                    final String val = URLDecoder.decode( keyAndVal[1],"utf8");
                    result.put(key,val);
                }catch (UnsupportedEncodingException e) {}
            }
        });
        return result;
    }
}

好了,到这里就结束了,在这里介绍一个有趣的,您可以跳过tomcat,自己写一个web框架,仿照SpringMVC,接收请求,处理请求,接下来我会试着写这么一个框架(虽然它不是很实用),如果你也有兴趣,欢迎留言或添加微信

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值