大家一定習慣於使用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/cs
s" 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"
}
}
}