欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2021年09月06日 10:54:55   作者:陳宏鴻  
這篇文章主要介紹了Java 內(nèi)置Http Server構(gòu)建web應(yīng)用案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

一、概述

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

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

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

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

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)建一個(gè)五臟俱全的Web應(yīng)用了。執(zhí)行代碼,在瀏覽器地址欄里代開(kāi)鏈接

http://localhost:8001/test

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

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

那在這個(gè)程序中如何獲取到外部傳遞過(guò)來(lái)的數(shù)據(jù)呢?比如說(shuō)URL上的查詢字符串,POST提交的數(shù)據(jù)等,其實(shí)也很簡(jiǎ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) {
            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)識(shí)了實(shí)現(xiàn)的方法。

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

四、并發(fā)處理

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

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)點(diǎn)

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

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

到此這篇關(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決IDEA鼠標(biāo)點(diǎn)擊光標(biāo)變大問(wèn)題

    解決IDEA鼠標(biāo)點(diǎn)擊光標(biāo)變大問(wèn)題

    這篇文章主要介紹了解決IDEA鼠標(biāo)點(diǎn)擊光標(biāo)變大問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • Java枚舉類型在switch語(yǔ)句正確使用方法詳解

    Java枚舉類型在switch語(yǔ)句正確使用方法詳解

    這篇文章主要介紹了Java枚舉類型在switch語(yǔ)句正確使用方法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Java線程重復(fù)執(zhí)行以及操作共享變量的代碼示例

    Java線程重復(fù)執(zhí)行以及操作共享變量的代碼示例

    這篇文章主要介紹了Java中對(duì)線程重復(fù)執(zhí)行以及操作共享變量的代碼示例,來(lái)自于Java面試題目的練習(xí)整理,需要的朋友可以參考下
    2015-12-12
  • 簡(jiǎn)述mybatis大于小于的轉(zhuǎn)義

    簡(jiǎn)述mybatis大于小于的轉(zhuǎn)義

    這篇文章主要介紹了mybatis大于小于的轉(zhuǎn)義以及xml中常用轉(zhuǎn)義字符,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-09-09
  • SpringBoot批處理的實(shí)現(xiàn)示例

    SpringBoot批處理的實(shí)現(xiàn)示例

    SpringBatch是一個(gè)開(kāi)源 的、全面的、輕量級(jí)的批處理框架,通過(guò)SpringBoot可以實(shí)現(xiàn)強(qiáng)大的批處理應(yīng)用程序開(kāi)發(fā),本文主要介紹了SpringBoot批處理的實(shí)現(xiàn)示例,感興趣的可以了解一下
    2022-03-03
  • 詳解利用spring-security解決CSRF問(wèn)題

    詳解利用spring-security解決CSRF問(wèn)題

    這篇文章主要介紹了詳解利用spring-security解決CSRF問(wèn)題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • SpringMVC訪問(wèn)靜態(tài)資源的方法

    SpringMVC訪問(wèn)靜態(tài)資源的方法

    本篇文章主要介紹了SpringMVC訪問(wèn)靜態(tài)資源的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-02-02
  • java中ImageReader和BufferedImage獲取圖片尺寸實(shí)例

    java中ImageReader和BufferedImage獲取圖片尺寸實(shí)例

    這篇文章主要介紹了java中ImageReader和BufferedImage獲取圖片尺寸實(shí)例,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Java處理科學(xué)計(jì)數(shù)法數(shù)字方式

    Java處理科學(xué)計(jì)數(shù)法數(shù)字方式

    這篇文章主要介紹了Java處理科學(xué)計(jì)數(shù)法數(shù)字方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Jenkins Maven pom jar打包未拉取最新包解決辦法

    Jenkins Maven pom jar打包未拉取最新包解決辦法

    包版本號(hào)未變更新后,jenkins打包不會(huì)拉取最新包,本文主要介紹了Jenkins Maven pom jar打包未拉取最新包解決辦法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02

最新評(píng)論