亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于JSON的異構(gòu)Web平臺(tái)的設(shè)計(jì)與實(shí)現(xiàn)

        2021-04-06 10:13:48黃秀麗
        關(guān)鍵詞:頁(yè)面實(shí)驗(yàn)室數(shù)據(jù)庫(kù)

        黃秀麗,陳 志

        (1.南京理工大學(xué)紫金學(xué)院,江蘇 南京 210023;2.上海立信會(huì)計(jì)金融學(xué)院,上海 201209)

        0 引 言

        隨著互聯(lián)網(wǎng)的發(fā)展,Web平臺(tái)的前后端分離已經(jīng)成為必然。前后端發(fā)展的越來(lái)越多樣化。Web平臺(tái)前端往往需要同時(shí)支持手機(jī)端、平板電腦和PC端,對(duì)于前端應(yīng)用來(lái)說(shuō),更加注重功能應(yīng)用和良好的用戶體驗(yàn)。目前,HTML5以及相對(duì)應(yīng)的前端框架實(shí)現(xiàn)了前端應(yīng)用的大部分功能,而包含開(kāi)發(fā)語(yǔ)言的傳統(tǒng)前端網(wǎng)頁(yè)開(kāi)發(fā)方式正逐步減少。Web平臺(tái)后端則更加集中于數(shù)據(jù)的存儲(chǔ)、分析和加工,同一個(gè)Web平臺(tái)經(jīng)常要支持多種類型的數(shù)據(jù)庫(kù)甚至開(kāi)發(fā)語(yǔ)言。前后端需要通過(guò)一種獨(dú)立于語(yǔ)言和平臺(tái)的數(shù)據(jù)格式進(jìn)行通信。

        JSON(JavaScript object notation)由Douglas Crockford在2001年提出。JSON作為JavaScript的一個(gè)子集,是一種純文本的數(shù)據(jù)交換格式。目前,JSON在網(wǎng)絡(luò)安全、氣象數(shù)據(jù)、位置信息、3D技術(shù)、物聯(lián)網(wǎng)等領(lǐng)域應(yīng)用廣泛[1-6]。在JSON與XML進(jìn)行數(shù)據(jù)傳輸效率對(duì)比時(shí),實(shí)驗(yàn)顯示JSON在數(shù)據(jù)傳輸效率方面明顯優(yōu)于其他數(shù)據(jù)傳輸格式[7-10]。JSON不僅支持傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù),也支持NoSQL系統(tǒng)中常用的半結(jié)構(gòu)化數(shù)據(jù)模型,JSON對(duì)應(yīng)的查詢語(yǔ)言JSONiq以及JSON的模式形式和邏輯基礎(chǔ)也正在研究中[11]。

        隨著Web平臺(tái)的發(fā)展,在同一個(gè)Web平臺(tái)中往往需要用到不同數(shù)據(jù)庫(kù)或者編程語(yǔ)言進(jìn)行不同功能模塊的開(kāi)發(fā)[12-14]。Java和Python作為目前主流的兩種語(yǔ)言,在數(shù)據(jù)處理和人工智能方面都有各自的優(yōu)勢(shì)。Java作為經(jīng)典的面向?qū)ο笳Z(yǔ)言,語(yǔ)法結(jié)構(gòu)嚴(yán)謹(jǐn),應(yīng)用范圍廣泛,已經(jīng)占據(jù)了Web平臺(tái)開(kāi)發(fā)的主流市場(chǎng)。Python作為近年來(lái)人工智能比較流行的語(yǔ)言,能夠以更簡(jiǎn)潔的語(yǔ)法,更強(qiáng)大的第三方庫(kù)強(qiáng)有力地支撐復(fù)雜數(shù)據(jù)分析和智能處理。該文設(shè)計(jì)了一種結(jié)合Java和Python兩種語(yǔ)言的異構(gòu)Web平臺(tái),實(shí)現(xiàn)了異構(gòu)平臺(tái)中的數(shù)據(jù)通信,同時(shí)采用了目前應(yīng)用廣泛的JSON作為異構(gòu)Web平臺(tái)的數(shù)據(jù)格式。

        1 異構(gòu)Web平臺(tái)的設(shè)計(jì)

        1.1 JSON數(shù)據(jù)格式

        JSON是一種輕量級(jí)的數(shù)據(jù)交換格式,易于閱讀和編寫,也易于機(jī)器解析和生成。JSON使用的字符集是UTF-8,有兩種表示結(jié)構(gòu)。一種是通過(guò)一對(duì)大括號(hào)包含的一組“名/值”對(duì)的無(wú)序組合方式表示數(shù)據(jù),例如:{“name1”:“value1”,“name2”:2020}。“名/值”對(duì)通過(guò)冒號(hào)進(jìn)行分隔,冒號(hào)的前面是名稱,冒號(hào)后面是和名稱對(duì)應(yīng)的屬性值,屬性值可以是布爾值、數(shù)字、字符串,也可以是JSON對(duì)象或JSON數(shù)組,甚至可以是null;另外一種結(jié)構(gòu)是JSON數(shù)組形式,例如:[{“name1”:“value1”},{“name2”:2020}]。在程序中把JSON對(duì)象表示為JSON字符串輸出,稱為JSON序列化。把JSON字符串恢復(fù)成JSON對(duì)象,就稱為反序列化,也稱為JSON解析。JSON在Web應(yīng)用中有很多優(yōu)點(diǎn),如傳輸速率快、支持語(yǔ)言多、書寫簡(jiǎn)單等。由于它的優(yōu)勢(shì),現(xiàn)在廣泛應(yīng)用在開(kāi)發(fā)中[15]。

        1.2 異構(gòu)Web平臺(tái)設(shè)計(jì)

        Java和Python作為經(jīng)典的面向?qū)ο笳Z(yǔ)言,在Web平臺(tái)的開(kāi)發(fā)中可以發(fā)揮各自的優(yōu)勢(shì),將Java和Python結(jié)合使用已經(jīng)成為很多Web平臺(tái)的選擇。目前,Java的Web容器大多是Tomcat,而Python的Web容器有Flask,Djongo等。Tomcat作為經(jīng)典的Web容器已經(jīng)發(fā)展到Tomcat10.0版本,部署方便,運(yùn)行穩(wěn)定。這里選擇Tomcat作為Web容器,Java作為后端開(kāi)發(fā)的主要語(yǔ)言,負(fù)責(zé)和數(shù)據(jù)庫(kù)的持久層進(jìn)行交互工作。同時(shí)通過(guò)Java代碼調(diào)用Python的.py文件方法處理Web平臺(tái)的異構(gòu)情況。Java和Python之間需要進(jìn)行數(shù)據(jù)的通信,這里選擇JSON數(shù)據(jù)作為相互通信的數(shù)據(jù)格式。Web平臺(tái)的前端采用完全獨(dú)立于后端的方式,前端頁(yè)面不包含后端開(kāi)發(fā)語(yǔ)言,完全采用HTML5和前端框架VUE開(kāi)發(fā),前后端之間通過(guò)Jquery和Ajax技術(shù)進(jìn)行通信,同樣采用JSON數(shù)據(jù)格式進(jìn)行交互,如圖1所示。

        圖1 異構(gòu)Web平臺(tái)設(shè)計(jì)

        Web平臺(tái)的視圖層即Web前端頁(yè)面,采用獨(dú)立于后端的前端語(yǔ)言實(shí)現(xiàn),可以增加對(duì)前端設(shè)備的兼容性,同時(shí)支持手機(jī)端、平板電腦、PC端以及不同的操作系統(tǒng)。視圖層通過(guò)Ajax和JSON數(shù)據(jù)相結(jié)合的方式與后端通信,減少了前后端開(kāi)發(fā)的工作難度,可以各自獨(dú)立開(kāi)發(fā),提升開(kāi)發(fā)效率??刂茖油ㄟ^(guò)Servlet進(jìn)行控制,負(fù)責(zé)對(duì)前端請(qǐng)求的統(tǒng)一處理,通過(guò)業(yè)務(wù)判斷選擇和數(shù)據(jù)庫(kù)交互或者是和Python腳本交互。模型層負(fù)責(zé)與持久層的數(shù)據(jù)庫(kù)進(jìn)行交互。下面將通過(guò)一個(gè)實(shí)驗(yàn)室管理系統(tǒng)的核心模塊實(shí)現(xiàn)代碼對(duì)異構(gòu)Web平臺(tái)的具體實(shí)現(xiàn)方式進(jìn)行說(shuō)明。該實(shí)驗(yàn)室管理系統(tǒng)實(shí)現(xiàn)了實(shí)驗(yàn)室的預(yù)約登記,實(shí)驗(yàn)報(bào)告的提交和批改,實(shí)驗(yàn)成績(jī)的登記和分析功能,通過(guò)Java語(yǔ)言的Tomcat8.0容器作為Web開(kāi)發(fā)平臺(tái),并調(diào)用Python3.6腳本實(shí)現(xiàn)成績(jī)數(shù)據(jù)的處理。

        2 JSON在異構(gòu)開(kāi)發(fā)語(yǔ)言中的應(yīng)用

        2.1 JSON在異構(gòu)開(kāi)發(fā)語(yǔ)言中的數(shù)據(jù)流分析

        在實(shí)驗(yàn)室成績(jī)管理模塊中,可以通過(guò)Python對(duì)學(xué)生成績(jī)進(jìn)行更加全面和直觀的分析。教師用戶在前端頁(yè)面通過(guò)Ajax提交對(duì)特定班級(jí)和課程的分析請(qǐng)求。請(qǐng)求參數(shù)通過(guò)Tomcat服務(wù)器傳遞給控制層對(duì)應(yīng)的Servlet,在Servlet中對(duì)前端頁(yè)面?zhèn)鬟f的參數(shù)進(jìn)行判斷,如果需要獲取對(duì)應(yīng)的數(shù)據(jù)庫(kù)信息,則通過(guò)模型層進(jìn)行查詢并返回對(duì)應(yīng)的查詢結(jié)果。Servlet得到查詢結(jié)果以后,通過(guò)Gson對(duì)象將查詢結(jié)果封裝為JSON字符串,Servlet將JSON字符串作為程序運(yùn)行參數(shù)傳遞給Python腳本。在這個(gè)過(guò)程中,數(shù)據(jù)流的傳遞過(guò)程如圖2所示。

        圖2 成績(jī)分析模塊數(shù)據(jù)流圖

        在數(shù)據(jù)流圖中可以看到,所有的數(shù)據(jù)集中在控制層進(jìn)行處理,在異構(gòu)情況中使用JSON數(shù)據(jù)作為通信方式,可以很好地降低系統(tǒng)的耦合度,提高各個(gè)模塊的獨(dú)立性。

        2.2 JSON在異構(gòu)開(kāi)發(fā)語(yǔ)言中的通信實(shí)現(xiàn)

        在異構(gòu)語(yǔ)言的Web項(xiàng)目中,需要安裝所有語(yǔ)言的運(yùn)行環(huán)境。Web項(xiàng)目發(fā)布后,在服務(wù)器中除了安裝Java的運(yùn)行環(huán)境,同時(shí)也要安裝Python的運(yùn)行環(huán)境和使用到的第三方庫(kù)。Python的第三方庫(kù)安裝有多種方式,可以通過(guò)pip命令直接安裝,也可以通過(guò)圖形化開(kāi)發(fā)軟件Pycharm安裝,或者將庫(kù)文件拷貝到安裝目錄site-packages文件夾里。為了更加方便地在服務(wù)器上運(yùn)行Python腳本,這里推薦通過(guò)pip命令直接安裝的方式。以安裝第三方庫(kù)Numpy為例,可以在命令行輸入pip3 install numpy完成Numpy庫(kù)的安裝。

        目前Java調(diào)用Python的方法主要有兩種:第一種是通過(guò)Jython的方式,Jython是一種可以在Java代碼中包含Python代碼并且解釋執(zhí)行的語(yǔ)言,但這種方式不能調(diào)用第三方庫(kù);第二種方式是通過(guò)Java自帶的Runtime對(duì)象調(diào)用Python腳本并傳入JSON參數(shù),這種方式可以調(diào)用第三方庫(kù),前提是在服務(wù)器上安裝了Python的運(yùn)行環(huán)境和第三方庫(kù)。此處采用第二種方式。異構(gòu)Web平臺(tái)的控制層分析完教師用戶從頁(yè)面提交的成績(jī)分析請(qǐng)求后,調(diào)用數(shù)據(jù)庫(kù)查詢方法獲取成績(jī)數(shù)據(jù)封裝為對(duì)象列表,通過(guò)Gson對(duì)象將Java列表轉(zhuǎn)換為JSON字符串給Python腳本。Java在控制器中調(diào)用Python腳本的具體方式如下。

        String result="";

        String Scores="";

        ArrayList scoreList=(ArrayList) new ScoreImpl().getScoreList();

        Gson gs=new Gson();

        String gsObject=gs.toJson(scoreList);

        String argsForPython[]=new String[] {"python","/root/libpythonPlot/score.py",gsObject};

        Process proc;

        try {

        proc=Runtime.getRuntime().exec(argsForPython);

        BufferedReader in=new BufferedReader(new InputStreamReader(proc.getInputStream()));

        String line="";

        while ((line=in.readLine())!=null) {

        result=result+line;

        }

        in.close();

        proc.waitFor();

        } catch (IOException e) {

        e.printStackTrace();

        } catch (InterruptedException e) {

        e.printStackTrace();

        }

        Python腳本的引用方式可以是相對(duì)路徑或絕對(duì)路徑,但為了避免項(xiàng)目發(fā)布時(shí)路徑的變化,更多地采用絕對(duì)路徑。Python腳本通過(guò)運(yùn)行參數(shù)接受JSON字符串,并且通過(guò)json.loads方法將JSON字符串轉(zhuǎn)換為JSON對(duì)象。獲得JSON對(duì)象后可以通過(guò)下標(biāo)進(jìn)行循環(huán)遍歷。

        scores=sys.argv[1]

        jsonscore=json.loads(scores)

        listx=[]

        listy=[]

        for index in range(len(jsonscore)):

        listx.append(index)

        listy.append(jsonscore[index-1]['score'])

        x=np.array(listx)

        y=np.array(listy)

        通過(guò)Python腳本的運(yùn)行可以繪制出分?jǐn)?shù)對(duì)應(yīng)的數(shù)據(jù)分析圖,并由前端頁(yè)面調(diào)用顯示在網(wǎng)頁(yè)上。實(shí)現(xiàn)效果如圖3所示。

        圖3 Java調(diào)用Python繪圖頁(yè)面顯示效果

        通過(guò)JSON數(shù)據(jù)進(jìn)行參數(shù)傳遞的方式,可以簡(jiǎn)潔地將Java和Python在一個(gè)項(xiàng)目中結(jié)合使用,并且不改變Web項(xiàng)目原有的框架結(jié)構(gòu)。

        3 JSON在異構(gòu)Web平臺(tái)前后端的應(yīng)用

        異構(gòu)Web平臺(tái)同時(shí)要考慮前后端的異構(gòu)情況。前端如果通過(guò)JSP進(jìn)行開(kāi)發(fā),就需要在前端頁(yè)面處理很多Java對(duì)象,增加了前端開(kāi)發(fā)的工作量,也不便于前端頁(yè)面的獨(dú)立設(shè)計(jì)和開(kāi)發(fā)。通過(guò)使用輕量級(jí)的JSON數(shù)據(jù)格式進(jìn)行前后端通信,可以大大降低前后端的耦合度,提升項(xiàng)目運(yùn)行效率。這里以教師用戶進(jìn)行實(shí)驗(yàn)室預(yù)約登記功能模塊對(duì)前后端異構(gòu)處理進(jìn)行說(shuō)明。教師用戶在前端頁(yè)面中提交實(shí)驗(yàn)室預(yù)約的請(qǐng)求信息,前端頁(yè)面對(duì)教師用戶提交的基本信息進(jìn)行正確性校驗(yàn)。如果校驗(yàn)通過(guò),則將用戶的預(yù)約信息封裝為JSON對(duì)象發(fā)送給控制層進(jìn)行處理。教師用戶提交頁(yè)面如圖4所示。

        圖4 實(shí)驗(yàn)室預(yù)約登記頁(yè)面

        在Web平臺(tái)中,前后端之間可以有多種方式進(jìn)行JSON數(shù)據(jù)的通信[16],這里通過(guò)Ajax的post方法進(jìn)行JSON通信,同時(shí)對(duì)Ajax返回的執(zhí)行結(jié)果data進(jìn)行判斷,如果data為true,則表示實(shí)驗(yàn)室預(yù)約登記成功。在前端通過(guò)Ajax請(qǐng)求JSON數(shù)據(jù)的時(shí)候,需要加上時(shí)間戳new Date()以保證每次請(qǐng)求的數(shù)據(jù)都是最新數(shù)據(jù)。

        var url="roomOrder";

        var args={

        "teacher":teacher,

        "department":department,

        "weekstext":weekstext,

        "weeketext":weeketext,

        "daystext":daystext,

        "dayetext":dayetext,

        "classtext":classtext, "classetext":classetext,

        "coursename":coursename,

        "room":room,

        "classname":classname,

        "personnum":personnum,

        "username":username,

        "time":new Date()

        };

        $.post(url,args,function(data) {

        if(data=="true"){

        $("#notice").val("");

        $("#notice").html("提交成功");}

        });

        前端頁(yè)面提交JSON數(shù)據(jù)給Tomcat容器的控制層,控制層解析JSON對(duì)象封裝的參數(shù)信息后進(jìn)行業(yè)務(wù)邏輯判斷。如果判斷與原有數(shù)據(jù)庫(kù)記錄不沖突,則向數(shù)據(jù)庫(kù)添加新的實(shí)驗(yàn)室預(yù)約登記條目,并且返回預(yù)約登記是否成功的結(jié)果。實(shí)驗(yàn)室預(yù)約登記的數(shù)據(jù)流如圖5所示。

        圖5 實(shí)驗(yàn)室預(yù)約模塊數(shù)據(jù)流圖

        在實(shí)驗(yàn)室預(yù)約登記條目增加到數(shù)據(jù)庫(kù)之前,需要將登記信息和數(shù)據(jù)庫(kù)中的已有信息進(jìn)行比較判斷,如果該實(shí)驗(yàn)室已經(jīng)被占用則記錄增加不成功,這部分需要通過(guò)事務(wù)處理來(lái)執(zhí)行。在實(shí)驗(yàn)室預(yù)約記錄表中增加記錄的同時(shí),也向?qū)嶒?yàn)室使用情況記錄表中增加記錄,如果其中一個(gè)表的記錄增加失敗,則整個(gè)事務(wù)取消,并且返回執(zhí)行失敗的結(jié)果。實(shí)驗(yàn)室預(yù)約記錄如表1所示,實(shí)驗(yàn)室使用情況記錄如表2所示。

        表1 實(shí)驗(yàn)室預(yù)約記錄

        表2 實(shí)驗(yàn)室使用情況記錄

        教師用戶提交實(shí)驗(yàn)室預(yù)約登記信息后,可以通過(guò)前端頁(yè)面查看實(shí)驗(yàn)室使用情況??刂茖邮盏角岸隧?yè)面?zhèn)鬟f的查看請(qǐng)求后,在Servlet中通過(guò)模型層獲取實(shí)驗(yàn)室使用情況記錄表的查詢信息,并將查詢信息封裝為對(duì)象列表。得到對(duì)象列表后,Servlet將對(duì)象列表通過(guò)GSON對(duì)象進(jìn)行JSON序列化并傳遞給前端頁(yè)面。具體代碼如下:

        Gson gs=new Gson();

        String gsObject=gs.toJson(weekListNew);

        response.setContentType("text/html;charset=UTF-8 ");

        response.getWriter().print(gsObject);

        前端頁(yè)面收到執(zhí)行結(jié)果data也就是后端返回的JSON字符串后,要將data解析為JSON數(shù)組對(duì)象。得到JSON數(shù)組對(duì)象后,可以通過(guò)循環(huán)獲取具體的屬性值。

        $.post( "ajextRoomServ",{"roomnum":room,"time":new Date()},function(data) {

        jasondemo=$.parseJSON(data);//解析Json字符串

        if (jasondemo!=null) {

        for (var i=0, l=jasondemo.length;i

        for (var key in jasondemo[i]) {

        }

        }

        }

        });

        通過(guò)循環(huán)獲取到JSON對(duì)象的屬性值后,根據(jù)屬性值進(jìn)行頁(yè)面表格的內(nèi)容修改,得到每個(gè)實(shí)驗(yàn)室的使用情況。具體實(shí)現(xiàn)效果如圖6所示。

        4 結(jié)束語(yǔ)

        JSON數(shù)據(jù)作為一種獨(dú)立于平臺(tái)的數(shù)據(jù)格式,在實(shí)際項(xiàng)目中有非常突出的優(yōu)勢(shì),也能很好地與不同的開(kāi)發(fā)語(yǔ)言以及各種數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)轉(zhuǎn)換。JSON數(shù)據(jù)不僅能降低前后端的耦合度,作為Web平臺(tái)前后端的通信方式,同時(shí)可以將Java和Python兩種語(yǔ)言結(jié)合起來(lái)。這將為日益智能化的Web開(kāi)發(fā)帶來(lái)更加便利的解決方案。

        基于以上情況,對(duì)多種語(yǔ)言的異構(gòu)Web平臺(tái)進(jìn)行了研究,以JSON作為數(shù)據(jù)格式進(jìn)行前后端的獨(dú)立開(kāi)發(fā)和數(shù)據(jù)通信,同時(shí)以JSON數(shù)據(jù)通信作為Java和Python兩種語(yǔ)言的集成方式。詳細(xì)描述了JSON數(shù)據(jù)在異構(gòu)Web平臺(tái)的使用方式,并給出了Java和Python進(jìn)行JSON通信的具體方法,以及前后端通過(guò)JSON通信的具體方法。目前獨(dú)立的數(shù)據(jù)格式逐漸成為主流,除了JSON之外,還有對(duì)于圖片和視頻更加友好的數(shù)據(jù)格式如GraghQL等。后續(xù)需要對(duì)新型數(shù)據(jù)格式進(jìn)行不斷研究。

        圖6 實(shí)驗(yàn)室使用情況頁(yè)面顯示

        猜你喜歡
        頁(yè)面實(shí)驗(yàn)室數(shù)據(jù)庫(kù)
        大狗熊在睡覺(jué)
        刷新生活的頁(yè)面
        電競(jìng)實(shí)驗(yàn)室
        電競(jìng)實(shí)驗(yàn)室
        電競(jìng)實(shí)驗(yàn)室
        電競(jìng)實(shí)驗(yàn)室
        數(shù)據(jù)庫(kù)
        數(shù)據(jù)庫(kù)
        數(shù)據(jù)庫(kù)
        數(shù)據(jù)庫(kù)
        免费a级毛片在线播放不收费| 久久国产高潮流白浆免费观看| 免费人成黄页在线观看国产| av天堂精品久久综合网| 亚洲一区二区三区播放| 久久6国产| 婷婷开心五月综合基地| 国产精品精品国产色婷婷| 亚洲色成人www永久在线观看| 亚洲日韩欧美一区二区三区| 亚洲中文字幕无线乱码va| 亚洲第一黄色免费网站| 99久久婷婷国产综合精品青草免费| 国产亚洲婷婷香蕉久久精品| 国产精品制服一区二区| 蜜桃视频第一区免费观看| 亚洲精品无码久久久久去q| 激情另类小说区图片区视频区 | 日本熟女中文字幕在线| 亚洲码国产精品高潮在线| 亚洲AV无码精品呻吟| 91国产视频自拍在线观看| 高黄暴h日本在线观看| 三级在线看中文字幕完整版| 99久久精品一区二区三区蜜臀| 亚洲一区二区三区色偷偷| 天堂国产一区二区三区| 成人天堂资源www在线| 99精品国产成人一区二区在线| 国产成人一区二区三区乱| 国产顶级熟妇高潮xxxxx| 亚洲AV无码永久在线观看| 亚洲国语对白在线观看| 亚洲综合成人婷婷五月网址| 丰满少妇被猛烈进入无码| 一区二区高清视频在线观看| 午夜被窝精品国产亚洲av香蕉| 人妻暴雨中被强制侵犯在线| 96精品免费视频大全| 全亚洲最大的私人影剧院在线看 | 深夜国产成人福利在线观看女同|