JavaScript EE,第2部分:用Ajax調用遠程JavaScript函數

來源:互聯網
上載者:User

在本系列的第1部分中,您學習了如何在Asynchronous JavaScript and XML(Ajax)和Java™ Platform, Enterprise Edition(Java EE)應用程式中使用javax.script API。本文將展示如何為同時在伺服器和客戶機上使用JavaScript的Web 應用程式實現遠端程序呼叫(Remote Procedure Call,RPC)機制。您還將學習一些有趣的技巧,例如用JavaScript實現Java介面、構建XMLHttpRequest封裝器、使Ajax調試更加容易以及使用JSP 標記檔案產生JavaScript代碼。

RPC機制非常簡單。伺服器上有一組 JavaScript函數,現在希望能從Web瀏覽器調用它們,就像有一個JavaScript引擎在同時執行客戶機代碼和伺服器代碼一樣。因此,需要有一些用戶端常式,這些常式應該與伺服器端的對應常式有相同的名稱和參數。

用戶端常式將使用Ajax 把它們的參數傳遞到伺服器,在伺服器上進行真正的處理。一個Java servlet 將調用伺服器端函數,並使用JSON格式將結果返回到客戶機。然後,用戶端常式計算 Ajax 響應,將JSON 字串轉換回JavaScript對象,後者被返回到應用程式。

作為應用程式開發人員,可以將精力放在構建使用者介面和伺服器中執行的函數上。您不需要處理Ajax或RPC 問題,因為本文以標記檔案的形式提供了一個JavaScript代碼產生器,您可以在JSP頁面使用它來自動產生用戶端常式。為了理解其中的工作原理,我們從一個應用程式範例開始。

開發一個JVM 監視應用程式

本文中的應用程式範例使用Java Management API 監視運行託管應用程式的Java EE 伺服器的JVM。使用者介面由一個簡單的Web頁面組成,該頁面顯示各種不同的指標,例如 Java類的數量、記憶體消耗、垃圾收集器的活動和線程的數量。

這些資訊通過Ajax獲得,並插入到一個HTML表中(如圖 1 所示;單擊 這裡 查看圖 1的放大圖)。更有趣的是,這個Web頁麵包含一個表單,通過該表單可以為給定的秒數分配記憶體。還可以調用JVM的垃圾收集器(GC)。

圖 1. 應用程式範例

在伺服器端,應用程式使用一個JavaScript檔案,Web瀏覽器將藉助 Ajax 並使用本系列第1部分提供的指令碼運行器調用該檔案中的函數。這是一個簡單的servlet,它處理URL 以.jss 副檔名結束的所有請求。該 servlet 尋找伺服器上相應的JavaScript檔案,並使用Java Scripting API執行它。

建立Web頁面

清單 1 顯示MonitorPage.jsp檔案中的表和表單。每個資料單元有一個ID,以便用JavaScript 更新表中的內容。<body> 標記的onload 屬性用於調用一個名為 init()的JavaScript函數,該函數將初始化應用程式的用戶端部分。另外兩個函數 allocMem()和gc() 是在使用者單擊按鈕時調用的。

清單 1. MonitorPage.jsp的HTML代碼

<html>
<head>
...
<style type="text/css">
th { text-align: left; }
td { text-align: right; }
.space { margin: 10px; }
</style>
</head>
<body onload="init()">
<table border="1" cellpadding="5">
<tr>
<th colspan=2>Classes</th>
<th colspan=2>Heap Memory</th>
<th colspan=2>Non-Heap Memory</th>
<th colspan=2>Garbage Collector</th>
<th colspan=2>Threads</th>
</tr>
<tr>
<th>Loaded</th>
<td id="info.classes.loaded"></td>
<th>Used</th>
<td id="info.memory.heap.used"></td>
<th>Used</th>
<td id="info.memory.nonHeap.used"></td>
<th>Count</th>
<td id="info.gc.count"></td>
<th>Live</th>
<td id="info.threads.live"></td>
</tr>
<tr>
<th>Unloaded</th>
<td id="info.classes.unloaded"></td>
<th>Committed</th>
<td id="info.memory.heap.committed"></td>
<th>Committed</th>
<td id="info.memory.nonHeap.committed"></td>
<th>Time</th>
<td id="info.gc.time"></td>
<th>Peak</th>
<td id="info.threads.peak"></td>
</tr>
</table>
<br>
<form name="monitorForm">
Size: <input name="size" size="10">
<span class="space"></span>
Seconds: <input name="seconds" size="4">
<span class="space"></span>
<button type="button"
onclick="allocMem(this.form.size.value, this.form.seconds.value)"
>Allocate Memory</button>
<span class="space"></span>
<button type="button" onclick="gc()">Collect Garbage</button>
</form>
</body>
</html>

MonitorPage.jsp檔案(見清單 2)使用一個名為 <js:rpc>的定製標記來產生用戶端 JavaScript函數,這些函數調用伺服器端對應的函數。<js:rpc> 標記有以下屬性:

script 將在伺服器上執行的指令碼的URL
function 被遠程調用的JavaScript函數的簽名
validator 一個可選運算式,在Web瀏覽器中將計算該運算式以驗證函式的參數
jsonVar 一個可選 JavaScript 變數的名稱,該變數用於儲存 JSON 響應
method HTTP方法,可以是 GET或POST
async 表明應該非同步還是同步使用XMLHttpRequest的一個布爾屬性

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.