激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - Java 內(nèi)置Http Server構(gòu)建web應(yīng)用案例詳解

Java 內(nèi)置Http Server構(gòu)建web應(yīng)用案例詳解

2021-12-20 14:21陳宏鴻 Java教程

這篇文章主要介紹了Java 內(nèi)置Http Server構(gòu)建web應(yīng)用案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

一、概述

使用Java技術(shù)構(gòu)建Web應(yīng)用時, 我們通常離不開tomcat和jetty之類的servlet容器,這些Web服務(wù)器功能強大,性能強勁,深受歡迎,是運行大型Web應(yīng)用的必備神器。

雖然Java的設(shè)計初衷就是用來開發(fā)大型應(yīng)用的,然而有時候我們開發(fā)的程序只是簡單的小型應(yīng)用,對于功能的需求和性能的要求并不高, 可能僅僅就幾百行甚至幾十行代碼,這個時候使用tomcat之類的Web服務(wù)器去運行就顯得有點大材小用了。 比如說只是將數(shù)據(jù)庫中的數(shù)據(jù)讀出來轉(zhuǎn)換成JSON,以Web服務(wù)的形式吐給調(diào)用方這樣的閹割型Web應(yīng)用。 如下圖所示

Java 內(nèi)置Http Server構(gòu)建web應(yīng)用案例詳解

二、最簡單的Java Http服務(wù)器

其實在jdk中已經(jīng)內(nèi)置了用于此類簡單Web應(yīng)用構(gòu)建需求的類庫了,sun公司提供的 com.sun.net.httpserver 包就是用來幫助我們解決這類問題的

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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 Main {
 
    public static void main(String[] arg) throws Exception {
        HttpServer server = HttpServer.create(new InetSocketAddress(8001), 0);
        server.createContext("/test", new TestHandler());
        server.start();
    }
 
    static  class TestHandler implements HttpHandler{
        @Override
        public void handle(HttpExchange exchange) throws IOException {
            String response = "hello world";
            exchange.sendResponseHeaders(200, 0);
            OutputStream os = exchange.getResponseBody();
            os.write(response.getBytes());
            os.close();
        }
    }
}

如上代碼清單所示, 僅僅幾行代碼就可以構(gòu)建一個五臟俱全的Web應(yīng)用了。執(zhí)行代碼,在瀏覽器地址欄里代開鏈接

http://localhost:8001/test

就能運行這個段程序,輸入的結(jié)果為helloworld

三、獲得外部數(shù)據(jù)

那在這個程序中如何獲取到外部傳遞過來的數(shù)據(jù)呢?比如說URL上的查詢字符串,POST提交的數(shù)據(jù)等,其實也很簡單 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
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();
    }
 
    static class TestHandler implements HttpHandler{
        @Override
        public void handle(HttpExchange exchange) {
            String response = "hello world";
 
            try{
                //獲得查詢字符串(get)
                String queryString =  exchange.getRequestURI().getQuery();
                Map<String,String> queryStringInfo = formData2Dic(queryString);
                //獲得表單提交數(shù)據(jù)(post)
                String postString = IOUtils.toString(exchange.getRequestBody());
                Map<String,String> postInfo = formData2Dic(postString);
 
                exchange.sendResponseHeaders(200,0);
                OutputStream os = exchange.getResponseBody();
                os.write(response.getBytes());
                os.close();
            }catch (IOException ie) {
 
            } catch (Exception e) {
 
            }
        }
    }
 
    public static Map<String,String> formData2Dic(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;
    }
}

上面的代碼清單標(biāo)識了實現(xiàn)的方法。

注意,要保證上面代碼編譯通過, 需要引入commons-io.jar,此包中提供將InputStream轉(zhuǎn)換成String的方法。

四、并發(fā)處理

com.sun.net.httpserver似乎默認(rèn)不支持同時處理多個請求,一旦有并行的請求涌入,需要排隊等待程序處理,導(dǎo)致Web程序響應(yīng)卡頓。自定義實現(xiàn)的方法也很簡單,為每個請求開一個新的線程處理即可, 如下代碼清單所示

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
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();
    }
 
    static class TestHandler implements HttpHandler{
        @Override
        public void handle(HttpExchange exchange) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try{
                        String response = "hello world";
                        //獲得查詢字符串(get)
                        String queryString =  exchange.getRequestURI().getQuery();
                        Map<String,String> queryStringInfo = formData2Dic(queryString);
                        //獲得表單提交數(shù)據(jù)(post)
                        String postString = IOUtils.toString(exchange.getRequestBody());
                        Map<String,String> postInfo = formData2Dic(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();
        }
    }
 
    public static Map<String,String> formData2Dic(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;
    }
}

五、優(yōu)點

Java內(nèi)置Web服務(wù)器在功能、性能、穩(wěn)定等方面是無法和tomcat和jetty之類的專業(yè)Web服務(wù)器相比的, 它的優(yōu)點主要是開發(fā)和部署方便簡單, 把程序代碼編譯成jar包后,丟到裝有jvm的服務(wù)器上, 直接運行就可以了,省去了安裝相關(guān)的軟件、依賴, 配置復(fù)雜的環(huán)境等工作量。

但是, 在一些各方面要求都比較高的生產(chǎn)環(huán)境下,還是建議使用專門的Web服務(wù)器,畢竟它們久經(jīng)考驗,能滿足所有功能需求,并且出問題的幾率低。 

到此這篇關(guān)于Java 內(nèi)置Http Server構(gòu)建web應(yīng)用案例詳解的文章就介紹到這了,更多相關(guān)Java 內(nèi)置Http Server構(gòu)建web應(yīng)用內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://www.cnblogs.com/aspwebchh/p/8300945.html

延伸 · 閱讀

精彩推薦
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發(fā)現(xiàn)了對于集合操作轉(zhuǎn)換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關(guān)于Java8中S...

    阿杜7482021-02-04
  • Java教程Java實現(xiàn)搶紅包功能

    Java實現(xiàn)搶紅包功能

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程xml與Java對象的轉(zhuǎn)換詳解

    xml與Java對象的轉(zhuǎn)換詳解

    這篇文章主要介紹了xml與Java對象的轉(zhuǎn)換詳解的相關(guān)資料,需要的朋友可以參考下...

    Java教程網(wǎng)2942020-09-17
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經(jīng)有好久沒有升過級了。升級完畢重啟之后,突然發(fā)現(xiàn)好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關(guān)于小米推送Java代碼,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩(wěn)中求8032021-07-12
  • Java教程Java BufferWriter寫文件寫不進(jìn)去或缺失數(shù)據(jù)的解決

    Java BufferWriter寫文件寫不進(jìn)去或缺失數(shù)據(jù)的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進(jìn)去或缺失數(shù)據(jù)的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發(fā)項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
主站蜘蛛池模板: 中文字幕在线观看免费视频 | 亚洲一区国产一区 | 午夜啪视频 | 九草视频 | 久久国产精品电影 | 亚洲va在线 | 久久精品伊人网 | 欧美成人一区二区三区电影 | 久久超| 国产视频在线免费观看 | 成人毛片免费在线 | 国产小视频在线观看 | 日韩电影av在线 | 国产精品久久77777 | 精精国产xxxx视频在线野外 | 黄色免费小网站 | 久久久一区二区三区四区 | 久久人人人 | 欧美成在人线a免费 | 秋霞a级毛片在线看 | 午夜神马电影网 | 极色品影院 | av在线视| 一本色道久久久888 香蕉视频99 | 久久久毛片视频 | 午夜精品区 | 北京一级毛片 | 亚洲第一成人久久网站 | 亚洲第一精品在线 | 二区三区四区 | 欧美一区久久久 | 久久超 | 九色一区二区 | 日本一区二区三区四区高清视频 | 亚洲一区二区免费 | 射逼网站 | 欧美一区二区三区久久精品视 | 久久国产乱子伦精品 | 精品一区二区久久久久久按摩 | 日本特级a一片免费观看 | 色人久久 |