最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java 內置Http Server構建web應用案例詳解

 更新時間:2021年09月06日 10:54:55   作者:陳宏鴻  
這篇文章主要介紹了Java 內置Http Server構建web應用案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下

一、概述

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

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

二、最簡單的Java Http服務器

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

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();
        }
    }
}

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

http://localhost:8001/test

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

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

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

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;
    }
}

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

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

四、并發(fā)處理

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

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

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

到此這篇關于Java 內置Http Server構建web應用案例詳解的文章就介紹到這了,更多相關Java 內置Http Server構建web應用內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 解讀easyexcel中的常用注解

    解讀easyexcel中的常用注解

    這篇文章主要介紹了關于easyexcel中的常用注解,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • 使用Java如何將圖片轉成Base64編碼,并壓縮至40k

    使用Java如何將圖片轉成Base64編碼,并壓縮至40k

    這篇文章主要介紹了使用Java如何將圖片轉成Base64編碼,并壓縮至40k問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Java實現(xiàn)LeetCode(報數(shù))

    Java實現(xiàn)LeetCode(報數(shù))

    這篇文章主要介紹了Java實現(xiàn)LeetCode(報數(shù)),本文通過使用java實現(xiàn)leetcode的報數(shù)題目和實現(xiàn)思路分析,需要的朋友可以參考下
    2021-06-06
  • IDEA的Mybatis Log Plugin插件配置和使用詳解

    IDEA的Mybatis Log Plugin插件配置和使用詳解

    這篇文章主要介紹了IDEA的Mybatis Log Plugin插件配置和使用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • Springboot應用中過濾器如何修改response的header和body內容

    Springboot應用中過濾器如何修改response的header和body內容

    這篇文章主要介紹了Springboot應用中過濾器如何修改response的header和body內容問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • SpringBoot圖文并茂詳解如何引入mybatis與連接Mysql數(shù)據(jù)庫

    SpringBoot圖文并茂詳解如何引入mybatis與連接Mysql數(shù)據(jù)庫

    這篇文章主要介紹了SpringBoot如何引入mybatis與連接Mysql數(shù)據(jù)庫,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • 詳解JAVA Timer和TimerTask

    詳解JAVA Timer和TimerTask

    這篇文章主要介紹了JAVA Timer和TimerTask的相關資料,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • Spring Boot打開URL出現(xiàn)signin問題的解決

    Spring Boot打開URL出現(xiàn)signin問題的解決

    這篇文章主要介紹了Spring Boot打開URL出現(xiàn)signin問題的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java高并發(fā)編程之CAS實現(xiàn)無鎖隊列代碼實例

    Java高并發(fā)編程之CAS實現(xiàn)無鎖隊列代碼實例

    這篇文章主要介紹了Java高并發(fā)編程之CAS實現(xiàn)無鎖隊列代碼實例,在多線程操作中,我們通常會添加鎖來保證線程的安全,那么這樣勢必會影響程序的性能,那么為了解決這一問題,于是就有了在無鎖操作的情況下依然能夠保證線程的安全,需要的朋友可以參考下
    2023-12-12
  • Java實現(xiàn)心跳機制的方法

    Java實現(xiàn)心跳機制的方法

    這篇文章主要介紹了Java實現(xiàn)心跳機制的方法,文中講解非常細致,幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07

最新評論

司法| 漳州市| 克什克腾旗| 商洛市| 肥西县| 象山县| 社旗县| 轮台县| 镇康县| 永靖县| 信阳市| 黑山县| 富源县| 蓝山县| 高雄市| 栾川县| 康定县| 东辽县| 岳池县| 新干县| 合作市| 曲沃县| 若羌县| 鄂尔多斯市| 佳木斯市| 谢通门县| 兰西县| 靖安县| 封丘县| 利辛县| 交口县| 昌黎县| 靖州| 南溪县| 恩平市| 绵竹市| 麦盖提县| 利川市| 绥中县| 永靖县| 奉新县|