当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > 使用JScript.NET创建asp.net页面

ASP.NET
asp.net css注释的影响
ASP.NET与数据库相关技巧
关于HtmlForm控件
三色交替的下拉列表框
精通ASP.NET中弹出窗口技术
ASP.NET Forums与现有系统整合方案示例
ASP.NET操作IIS中的虚拟目录
DataGrid与SQL Server 2000数据绑定
如何让Web应用程序在Client端实现导出报表功能
如何保证web app中的Send Email线程稳定性
关于用ASP.Net识别远程主机服务器种类
ASP.NET中上传下载文件
提高ASP.NET性能的方法
asp.net StreamReader 创建文件
asp.net如何生成图片验证码(简单)
一个.net 压缩位图至JPEG的代码
简单的SQL Server数据库数据读取与数据操作
获取网站的RSS聚合到自己的网页
.Net程序中整站通用的防SQL注入函数
asp.net生成缩略图及给原始图加水印的函数

ASP.NET 中的 使用JScript.NET创建asp.net页面


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 66 ::
收藏到网摘: n/a

大家一定习惯于使用vb.net和C#来创建asp.net页面,但是不知大家知不知道我们还可以使用Jscript.net编写asp.net.
这可能是自微软1996年推出基于IE3.0的Jscript1.0以来在功能上最大的飞跃。JScript传统上被用作开发客户端脚本。在internet上它普遍存在,特别是在Activeseverpage(ASP)中。
当脚本变得很大的时候,程序员需要编写更有效的代码;并且程序变得越来越复杂,程序员往往受到Jscript的局限性。
如果你对Jscript很熟悉的话,你将很快的在.net平台上使用Jscript.net,应为Jscript.net就像是Jscript的升级版,而不是一门新的语言。
Jscript.net最新的特性是Jscript.net是真正的编译语言。这使它完全可以与vb.net和C#相媲美。从语法方面,Jscript.net改善了变量类型的定义,不但支持明确的变量类型定义,还支持模糊的变量类型定义。模糊定义是一项激动人心的技术,它可以分析你脚本中使用的变量,并且推断出变量的类型。这就意味着你可以使用未定义的变量并以更快的速度执行。
请参照下面的例子:
functiontest()
{
for(varx=0;x<100;x++)
{
print(x);
}
}
当Jscript.net编译这个程序的时候,它分析变量X的用途并确定变量X只用做数值型,结果变量被安全的定义为数值型。技术进步在于把变量定义为数值型要明显优于把变量定义为genericObject或variant。
为了实现Jscript.net的推断变量类型的功能,你需要遵守以下几条规则!
一.永远声明你的局部变量。这看起来像是显而易见的,但是这是非常重要的,Jscript.net只能推断你的局部变量,而不是全局变量。如果你没有声明它,直接使用,它就将成为全局变量,将不能被优化。
二.仅使用一种数据类型,如果你声明一个数值型变量,却用来储存字符型的数据,Jscript将把该变量定义为genericObject或variant。
//无法推断类型--glob是一个全局变量
varglob=42;
functionmyfunc()
{
//无法推断类型--s没有定义因此它被当作全局变量
s="hello";
//可以推断类型
vari=0;
//无法推断类型—q被指派成其他的类型
varq=newDate();
q=3.14159;
}
尽管类型推断是非常好的功能,但是它还是有一定的缺点的。它无法帮助我们捕获类型不匹配或其他的错误。为了解决这个问题,Jscript.net提供一种方法明确定义变量的类型。通过例子,你将很容易的了解它的使用方法。
//定义数值类型
varmyInt:int=42;
//定义一个函数,返回一个字符串
functionGetName():String
{
//程序行
}
//定义一个带两个参数的函数返回一个逻辑类型
functionCheckNumber(dVal:double):Boolean
{
//functioncode
}
下面给出一个完成的函数,仔细的体会一下。
functiongetConditions(strCity:String):String
{
varnow:Date=newDate();
switch(strCity.toUpperCase())
{
case"LONDON":
if(now.getMonth()<=7||now.getMonth()>=9)
{
return"overcast";
}
else
{
return"partlyovercastandhumid";
}
break;
case"SEATTLE":
if(now.getMonth()==7&&now.getDay()==4)
{
return"torrentialrain";
}
else
{
return"rain";
}
break;
case"LA":
return"smoggy";
break;
case"PHOENIX":
return"damnhot";
break;
default:
return"partlycloudywithachanceofshowers";
}
}
使用Jscript.net,你也可以定义其他.net架构的类型,通过引用命名空间和派生类可以向Jscript.net引入新的数据类型。这样在两者的数据类型中就有可能产生重叠。参见下表:
Boolean.NETFrameworkBoolean/JScriptboolean
Number.NETFrameworkDouble/JScriptnumber
String.NETFrameworkString/JScriptstring
Int.NETFrameworkInt32
Long.NETFrameworkInt64
Float.NETFrameworkSingle
Double.NETFrameworkDouble
Object.NETFrameworkObject/JScriptObject
DateJScriptDateobject
ArrayJScriptArray
FunctionJScriptFunctionobject
在Jscript中定义类通过类声明,包含方法和对象和var声明。对于类的派生通过下面两个程序的对比,你讲清楚地明白。
JScript5.5Code
//Simpleobjectwithnomethods
functionCar(make,color,year)
{
this.make=make;
this.color=color;
this.year=year;
}
functionCar.prototype.GetDescription()
{
returnthis.year+""+this.color+""+this.make;
}
//CreateanduseanewCarobject
varmyCar=newCar("Accord","Maroon",1984);
print(myCar.GetDescription());
JScript.NETCode
//Wrapthefunctioninsideaclassstatement.
classCar
{
varmake:String;
varcolor:String;
varyear:int;
functionCar(make,color,year)
{
this.make=make;
this.color=color;
this.year=year;
}
functionGetDescription()
{
returnthis.year+""+this.color+""+this.make;
}
}
varmyCar=newCar("Accord","Maroon",1984);
print(myCar.GetDescription());
Jscript.net还支持定义private和protectedproperty通过GET和SET进行读写。
如下例:
classPerson
{
privatevarm_sName:String;
privatevarm_iAge:int;
functionPerson(name:String,age:int)
{
this.m_sName=name;
this.m_iAge=age;
}
//Name只读
functiongetName():String
{
returnthis.m_sName;
}
//Age读写但是只能用SET
functiongetAge():int
{
returnthis.m_sAge;
}
functionsetAge(newAge:int)
{
if((newAge>=0)&&(newAge<=110))
this.m_iAge=newAge;
else
thrownewAge+"isnotarealisticage!";
}
}
varfred:Person=newPerson("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命名空间
importSystem;
importSystem.ServiceProcess;
importSystem.Diagnostics;
importSystem.Timers;
classSimpleServiceextendsServiceBase
{
privatevartimer:Timer;
functionSimpleService()
{
CanPauseAndContinue=true;
ServiceName="JScriptService";
timer=newTimer();
timer.Interval=1000;
timer.AddOnTimer(OnTimer);
}
protectedoverridefunctionOnStart(args:String[])
{
EventLog.WriteEntry("JScriptServicestarted");
timer.Enabled=true;
}
protectedoverridefunctionOnStop()
{
EventLog.WriteEntry("JScriptServicestopped");
timer.Enabled=false;
}
protectedoverridefunctionOnPause()
{
EventLog.WriteEntry("JScriptServicepaused");
timer.Enabled=false;
}
protectedoverridefunctionOnContinue()
{
EventLog.WriteEntry("JScriptServicecontinued");
timer.Enabled=true;
}
functionOnTimer(source:Object,e:EventArgs)
{
EventLog.WriteEntry("HelloWorldfromJScript!");
}
}
ServiceBase.Run(newSimpleService());

如何在asp+中使用Jscript.net这才是我们关键的问题。我们将通过一个例子来说明这个问题。
访问sqlserver数据库
第一个aps+例子是使用Jscript.net和.net的数据访问类来访问sqlserver数据库,
这里我还将使用大家熟悉的<%%>格式来编写,访问pubs中的authors表,我知道这很简单但是它可以体现一些新的特性。
<%@ImportNamespace="System.Data"%>
<%@ImportNamespace="System.Data.SQL"%>
<%@language="JScript"%>
<linkrel="STYLESHEET"type="text/css"href="style.css">
<%
//设置数据库连接
varmyConnection:SQLConnection=newSQLConnection("server=scripting;uid=sa;pwd=;database=pubs");
//执行查询
varmyCommand:SQLDataSetCommand=newSQLDataSetCommand("select*fromAuthors",myConnection);
//声明变量
vards:DataSet=newDataSet();
varmyTable:DataTable
varmyColumns:ColumnsCollection
varmyCol:DataColumn
varmyRows:RowsCollection
varmyRow:DataRow
//通过FillDataSet方法获取数据
myCommand.FillDataSet(ds,"Authors");
myTable=ds.Tables[0]
%>
<h1>
<%=ds.Tables[0].TableName%>
</h1>
<br>
<TABLE>
<THEAD>
<TR>
<%
//在表格的最上面输出字段名
myColumns=myTable.Columns
for(myColinmyColumns)
{
%>
<THclass="spec">
<%=myCol.ColumnName%>
</TH>
<%
}
%>
</TR>
</THEAD>
<%
//输出所有的纪录
myRows=myTable.Rows
for(myRowinmyRows)
{
%>
<TR>
<%
for(vari:int=0;i<myColumns.Count;i++)
{
%>
<TDclass="spec">
<%=myRow[i]%>
</TD>
<%
}
%>
</TR>
<%
}
%>
</TABLE>

例子2
<%@WebServiceLanguage="JScript"class="Weather"%>
importSystem
importSystem.Web.Services
classWeather{
WebMethodAttributefunctiongetConditions(strCity:String):String
{
varnow=newDate();
switch(strCity.toUpperCase())
{
case"LONDON":
if(now.getMonth()<=7||now.getMonth()>=9)
{
return"overcast"
}
if
{
return"partlyovercast"
}
break;
case"SEATTLE":
if(now.getMonth()==7&&now.getDay()==4)
{
return"torrentialrain"
}
else
{
return"rain"
}
break;
case"LA":
return"smoggy"
break;
case"PHOENIX":
return"damnhot"
break;
default:
return"partlycloudywithachanceofshowers"
}
}
}