大家一定習慣于使用vb.net和C#來創建asp.net頁面,但是不知大家知不知道我們還可以使用Jscript.net編寫asp.net. 這可能是自微軟1996年推出基于IE3.0的Jscript1.0以來在功能上最大的飛躍。JScript 傳統上被用作開發客戶端腳本。在internet上它普遍存在,特別是在Active sever page(ASP)中 。 當腳本變得很大的時候,程序員需要編寫更有效的代碼;并且程序變得越來越復雜,程序員往往受到Jscript的局限性。 如果你對Jscript很熟悉的話,你將很快的在.net平臺上使用Jscript.net,應為Jscript.net就像是Jscript的升級版,而不是一門新的語言。 Jscript.net最新的特性是Jscript.net是真正的編譯語言。這使它完全可以與vb.net和C#相媲美。從語法方面,Jscript.net改善了變量類型的定義,不但支持明確的變量類型定義,還支持模糊的變量類型定義。模糊定義是一項激動人心的技術,它可以分析你腳本中使用的變量,并且推斷出變量的類型。這就意味著你可以使用未定義的變量并以更快的速度執行。 請參照下面的例子: function test() { for (var x = 0; x < 100; x++) { print(x); } } 當Jscript.net編譯這個程序的時候,它分析變量X的用途并確定變量X只用做數值型,結果變量被安全的定義為數值型。技術進步在于把變量定義為數值型要明顯優于把變量定義為generic Object 或 variant。 為了實現Jscript.net的推斷變量類型的功能,你需要遵守以下幾條規則! 一. 永遠聲明你的局部變量。這看起來像是顯而易見的,但是這是非常重要的,Jscript.net只能推斷你的局部變量,而不是全局變量。如果你沒有聲明它,直接使用,它就將成為全局變量,將不能被優化。 二. 僅使用一種數據類型,如果你聲明一個數值型變量,卻用來儲存字符型的數據,Jscript將把該變量定義為generic Object 或 variant。 //無法推斷類型 -- glob 是一個全局變量 var glob = 42; function myfunc() { //無法推斷類型-- s 沒有定義因此它被當作全局變量 s = "hello"; // 可以推斷類型 var i = 0; //無法推斷類型—q被指派成其他的類型 var q = new Date(); q = 3.14159; } 盡管類型推斷是非常好的功能,但是它還是有一定的缺點的。它無法幫助我們捕獲類型不匹配或其他的錯誤。為了解決這個問題,Jscript.net提供一種方法明確定義變量的類型。通過例子,你將很容易的了解它的使用方法。 // 定義數值類型 var myInt : int = 42; // 定義一個函數,返回一個字符串 function GetName() : String { // 程序行 } // 定義一個帶兩個參數的函數返回一個邏輯類型 function CheckNumber(dVal : double) : Boolean { // function code } 下面給出一個完成的函數,仔細的體會一下。 function getConditions(strCity : String) : String { var now : Date = new Date(); switch (strCity.toUpperCase()) { case "LONDON": if (now.getMonth() <= 7 || now.getMonth() >= 9) { return "overcast"; } else { return "partly overcast and humid"; } break; case "SEATTLE": if (now.getMonth() == 7 && now.getDay() == 4) { return "torrential rain"; } else { return "rain"; } break; case "LA": return "smoggy"; break; case "PHOENIX": return "damn hot"; break; default: return "partly cloudy with a chance of showers"; } } 使用Jscript.net,你也可以定義其他.net架構的類型,通過引用命名空間和派生類可以向Jscript.net引入新的數據類型。這樣在兩者的數據類型中就有可能產生重疊。參見下表: Boolean .NET Framework Boolean / JScript boolean Number .NET Framework Double / JScript number String .NET Framework String / JScript string Int .NET Framework Int32 Long .NET Framework Int64 Float .NET Framework Single Double .NET Framework Double Object .NET Framework Object / JScript Object Date JScript Date object Array JScript Array Function JScript Function object 在Jscript中定義類通過類聲明, 包含方法和對象和var 聲明。對于類的派生通過下面兩個程序的對比,你講清楚地明白。 JScript 5.5 Code // Simple object with no methods function Car(make, color, year) { this.make = make; this.color = color; this.year = year; } function Car.prototype.GetDescription() { return this.year + " " + this.color + " " + this.make; } // Create and use a new Car object var myCar = new Car("Accord", "Maroon", 1984); print(myCar.GetDescription()); JScript.NET Code // Wrap the function inside a class statement. class Car { var make : String; var color : String; var year : int; function Car(make, color, year) { this.make = make; this.color = color; this.year = year; } function GetDescription() { return this.year + " " + this.color + " " + this.make; } } var myCar = new Car("Accord", "Maroon", 1984); print(myCar.GetDescription()); Jscript.net還支持定義private和protected property通過GET和SET進行讀寫。 如下例: class Person { private var m_sName : String; private var m_iAge : int; function Person(name : String, age : int) { this.m_sName = name; this.m_iAge = age; } // Name 只讀 function get Name() : String { return this.m_sName; } // Age 讀寫但是只能用SET function get Age() : int { return this.m_sAge; } function set Age(newAge : int) { if ((newAge >= 0) && (newAge <= 110)) this.m_iAge = newAge; else throw newAge + " is not a realistic age!"; } } var fred : Person = new Person("Fred", 25); print(fred.Name); print(fred.Age); // 這將產生一個編譯錯誤,name是只讀的。 fred.Name = "Paul"; // 這個將正常執行 fred.Age = 26; // 這將得到一個 run-time 錯誤, 值太大了 fred.Age = 200; Jscript.net可以用JScript 或任意NET 框架語言(如 C #,VB7.0) 通過增加extends主題詞在類聲明以后來繼承和擴展現有類。這能力允許Jscript.net非常容易地利用 NET 平臺的豐厚資源。為了說明這些,給出一個程序。這個程序擴展了NET 框架的ServiceBase 類。 // 導入需要的.net命名空間 import System; import System.ServiceProcess; import System.Diagnostics; import System.Timers; class SimpleService extends ServiceBase { private var timer : Timer; function SimpleService() { CanPauseAndContinue = true; ServiceName = "JScript Service"; timer = new Timer(); timer.Interval = 1000; timer.AddOnTimer(OnTimer); } protected override function OnStart(args : String[]) { EventLog.WriteEntry("JScript Service started"); timer.Enabled = true; } protected override function OnStop() { EventLog.WriteEntry("JScript Service stopped"); timer.Enabled = false; } protected override function OnPause() { EventLog.WriteEntry("JScript Service paused"); timer.Enabled = false; } protected override function OnContinue() { EventLog.WriteEntry("JScript Service continued"); timer.Enabled = true; } function OnTimer(source : Object, e : EventArgs) { EventLog.WriteEntry("Hello World from JScript!"); } } ServiceBase.Run(new SimpleService()); 如何在asp+中使用Jscript.net這才是我們關鍵的問題。我們將通過一個例子來說明這個問題。 訪問sqlserver數據庫 第一個aps+例子是使用Jscript.net和.net的數據訪問類來訪問sqlserver數據庫, 這里我還將使用大家熟悉的<% %>格式來編寫,訪問pubs中的authors表,我知道這很簡單但是它可以體現一些新的特性。 <%@ Import Namespace="System.Data" %> <%@ Import Namespace="System.Data.SQL" %> <%@ language="JScript" %> <link rel="STYLESHEET" type="text/css" href="style.css"> <% // 設置數據庫連接 var myConnection:SQLConnection = new SQLConnection("server=scripting;uid=sa;pwd=;database=pubs"); // 執行查詢 var myCommand:SQLDataSetCommand = new SQLDataSetCommand("select * from Authors", myConnection); // 聲明變量 var ds:DataSet = new DataSet(); var myTable:DataTable var myColumns:ColumnsCollection var myCol:DataColumn var myRows:RowsCollection var myRow:DataRow // 通過FillDataSet方法獲取數據 myCommand.FillDataSet(ds, "Authors"); myTable = ds.Tables[0] %> <h1> <%=ds.Tables[0].TableName%> </h1> <br> <TABLE> <THEAD> <TR> <% //在表格的最上面輸出字段名 myColumns = myTable.Columns for (myCol in myColumns) { %> <TH class="spec"> <%=myCol.ColumnName%> </TH> <% } %> </TR> </THEAD> <% // 輸出所有的紀錄 myRows = myTable.Rows for (myRow in myRows) { %> <TR> <% for(var i:int=0;i<myColumns.Count;i++) { %> <TD class="spec"> <%=myRow[i]%> </TD> <% } %> </TR> <% } %> </TABLE> 例子2 <%@ WebService Language="JScript" class="Weather"%> import System import System.Web.Services class Weather { WebMethodAttribute function getConditions(strCity : String) : String { var now = new Date(); switch (strCity.toUpperCase()) { case "LONDON": if (now.getMonth() <= 7||now.getMonth() >=9) { return "overcast" } if { return "partly overcast" } break; case "SEATTLE": if (now.getMonth() == 7 && now.getDay()==4) { return "torrential rain" } else { return "rain" } break; case "LA": return "smoggy" break; case "PHOENIX": return "damn hot" break; default: return "partly cloudy with a chance of showers" } } }
|