写在前面
大家都知道我们在搭建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,接收请求,处理请求,接下来我会试着写这么一个框架(虽然它不是很实用),如果你也有兴趣,欢迎留言或添加微信