大家一定习惯于使用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" } } }
|