問題的提出:
假定我們的HTML 頁中有一些表單需要處理,並且我們需要初始化資料庫中的欄位,我們該怎麼辦?標準的解決辦法就是使用CGI指令碼或是使用Java Servlet等伺服器端程式,但是你有沒有想過,還可以編寫一個指令碼程式使你可以用JavaScript直接調用伺服器端Java程式進行任何計算的結果,就像下面代碼中列的那樣:
<html>
我們的表單<br>
<form>
<input type="text" name="textField"><br>
<input type="button" value="Click" onClick="updateField();">
</form>
<script>
function updateField()
{
document.forms[0].textField.value=java.dbConnection.getData('SQL_expr');
}
</script>
</html>
所以,當使用者點擊按鈕,該程式就會調用Java的dbConnection類,然後就可以在JavaScript應用程式中使用Java返回的結果了。上面的程式只是更新了textField的值,我們不必重新整理整個頁面。由於這個程式也不是JSP檔案,所以不必把你的頁面編譯成Java Servlet。
你還可以使用調用某些Java函數返回的結果替代段落中的文字;在一個非常大的HTML表中,你可以使用同樣的方法,只要更新一行資訊:
<script language="JavaScript">
function changeCol()
{
document.all.quote.rows[0].cells[1].innerText=java.Stock.getQuote('Wayne');
}
</script>
<table id="quote" border=1>
<tr><td>Wayne</td><td>123</td></tr>
<tr><td>Another one</td><td>34</td></tr>
</table>
怎麼樣,能夠直接在JavaScript中嵌入Java對象的調用,而且可以保證你的頁面的其它部分不會被改變,你一定對這個問題比較感興趣吧。好吧,現在就讓我們用Java Servlet來實現它吧。
工作原理
我的構思是使用Java Servlet編寫一個JinJ(Java in JavaScript)程式,能夠讓 HTML 頁面內整合 Java 類和 JavaScript指令碼,將所有使用JavaScript調用Java函數的HTML頁面都傳送到這個Servlet中處理,JinJ將即時產生帶有Java applet的隱藏幀,這個applet起著橋樑的作用,用來和Java通訊,它的大小還不到2KB,為了調用對象,Applet使用HTTP串連同一個JinJ Servlet。JinJ用相應的JavaScript結構來替換所有的Java調用(其實每一個調用前都有首碼java),並且保持頁面的其它部分不變。所以,為了能夠讓JinJ正確識別,你的JavaScript代碼中的任何Java調用,都要使用如下的結構: java.object_name.function_name(list_of_parameters) 其中:
java:是一個標準的首碼:
object_name:是一個變數名,儲存某些Java類的執行個體(在後面,我們會詳細的探討如何建立/定義這樣的變數),比如說它可以是一個類名。
function_name:是一個Java類的函數名。
list_of_parameters:是調用的函數的參數列表(可以為空白)。
下面也將會探討如何把參數傳給Java,每個參數顯然是某個JavaScript運算式。你也可以使用先行編譯頁,換句話說就是在使用HTML頁面之前編譯它。