社区后台开发 → 浏览:帖子主题
* 帖子主题:asp jscript 编程
pojin (ID: 1)
头衔:论坛坛主
等级:究级天王[荣誉]
积分:2826
发帖:230
来自:保密
注册:2023-12-09 09:36:49
造访:2026-05-05 13:56:22
[ 第 1 楼 ] 206 回复
今天开始修改我以前做得那个访问统计小插件,顺便加强一下asp和javascript。(确切的说应该是JScript,自从ie4.0以后,微软就用自己的JScript了,跟javascript基本上没什么区别。大概是脚本引擎将javascript,JScript都用JScript解释。)

asp用了很久了,可是一直没有认真学习过,很多东西含混不清,javascript也是。本来已经不想再用asp了,但是这段时间看了些东西,发现原来我很菜,既然学了,就把它学好;也不是为了学习asp而学,学什么都一样,关键是一个态度。

之所以选择javascript,一是感觉javascript比vbscript要规范;二是javascript在客户端还是必不可少的;三是跟java之类语法有些相似。

刚刚开始写,可能比较零乱,只是做个记录,待日后再整理。

首先是用javascript书写asp方法:

1.在iis中设置默认脚本语言为javascript,在站点属性-主目录-配置-默认asp语言

2.在asp文件第一行用<%@LANGUAGE=JAVASCRIPT>指定脚本语言

3.用<SCRIPT RUNAT=SERVER LANGUAGE=JAVASCRIPT></SCRIPT>指定服务器端执行脚本,我选择了这种,因为这样EditPlus才可以正确显示脚本颜色和标记,便于书写和排错。

Global.asa

这个文件的功能我就不多说了,在网上找了一下,全都是vbscript的例子。vbs的过程跟js中的function应该是等价的,可以用。

    <SCRIPT LANGUAGE=javascript RUNAT=Server>
    function Application_OnStart() {
        Application('VERSION') = '0.1';
    }

    function Application_OnEnd() {
    }

    function Session_OnStart() {
    }

    function Session_OnEnd() {
    }
    </SCRIPT>

在另一个asp文件中Response.write(Application('VERSION'));可以看到结果。(需要注意的是javascript调用asp内置对象首字母要大写。这也算是个好习惯。)

数据类型判断:

今天碰到一个小问题,判断一个变量的数据类型。js有typeof()函数可以返回一个对象的类型,对象的constructor方法可以返回一个对象的原始构造函数。

当直接赋值给一个变量的时候,可以返回正确的类型,但是当用初始化的方法赋值时,typeof()返回的总是object

比如:

var figure = 3;或者var figure = Number('3');  Response.write(typeof(figure));返回的是Number

var figure = new Number('3');    或者从asp内置对象Request中获得的数值(如:var figure = Request(str);),返回的就是object

但是Response.write(figure.constructor);得到的却是同样的结果:function Number() { [native code] }

测试是否为Number可以用figure.constructor == Number来判断。

同时我还找到javascript的一个全局函数:isNaN

当我们赋给figure的值是数值时,isNaN返回False,否则返回True。比如:isNaN(a=1); isNaN(a='1'); isNaN(a= Number('1')); isNaN(a=new Number('1'));返回的都是False,isNaN(a='1a')等返回的是True。我在网上找到很多用js写的IsNumeric函数,有些笨拙了。

另外,当Request对象返回一个空值时,javascript中得到的这个空值我不知道怎么比较。

比如:var requestStr = Request(str);返回一个空值

当直接用Response.write(requestStr);什么都没有显示,但是Response.write('str:'+requestStr);却打印出来一个undefined。

用requestStr == 'undefined'  requestStr == '' 都不能得到正确的结果。

最后我用比较笨拙的办法,var requestStr = new String(Request(str));这样再用requestStr == 'undefined'就可以得到正确的结果了。
2024-04-08 09:35:38 IP:已设置保密
pojin (ID: 1)
头衔:论坛坛主
等级:究级天王[荣誉]
积分:2826
发帖:230
来自:保密
注册:2023-12-09 09:36:49
造访:2026-05-05 13:56:22
[ 第 2 楼 ] 207 回复
今天进展不大,先是费了些时间找windows的脚本引擎究竟有没有JavaScript,好像windows脚本引擎把Javascript跟Jscript都当作javascript处理的,所以写成javascript/jscript都一样了。

后来因为自己的电脑FSO有问题,FSO对象可以建立,但是一建立Folder对象就死住了- -也不知道什么问题,哪位知道还请指点。

最后在服务器上测试着写了一个文件列表的小函数,只是初步实现功能,还没怎么处理。

<SCRIPT RUNAT=SERVER LANGUAGE=JAVASCRIPT>
    var fso;
    fso = new ActiveXObject("Scripting.FileSystemObject");
    var fldr;
    var subFldr;
    var files;
    function listFolder(folder) {
    try{
      fldr = fso.GetFolder(folder);
      subFldr = fldr.SubFolders;
      var emFldrs = new Enumerator(subFldr);
      while (!emFldrs.atEnd()) {
        var x  = emFldrs.item();
        Response.Write(x.name + '<BR>');
        listFile(x);
        emFldrs.moveNext();
      }
    }
    catch (objException) {
      throw objException;
    }
    }
    function listFile(folder) {
    try{
      files = folder.files;
      var emFiles = new Enumerator(files);
      while (!emFiles.atEnd()) {
        var x  = emFiles.item();
        Response.Write('&nbsp;' + x.name + '<BR>');
        emFiles.moveNext();
      }
    }catch (exception) {
      throw exception;
    }
    }
    var tfolder = Server.mappath('//');
    listFolder(tfolder);
    fso.Close;
</SCRIPT>

主要是熟悉了JScript的Enumerator对象, Microsoft JScript 3.0 引入了 Enumerator 对象。可以使用该对象遍历 ASP 集合。atEnd 方法指出了集合中是否还存在项目。moveNext 方法移动到集合中的下一个项目。
2024-04-08 09:35:47 IP:已设置保密
pojin (ID: 1)
头衔:论坛坛主
等级:究级天王[荣誉]
积分:2826
发帖:230
来自:保密
注册:2023-12-09 09:36:49
造访:2026-05-05 13:56:22
[ 第 3 楼 ] 208 回复
尽量按照面向对象编程的规则来写代码,感觉得心应手!而且JScript所具有的很多VBScript没有的特性使用非常方便!

下面是用JScript实现的一个conn类,使用try...catch...语法实现错误处理。

<SCRIPT RUNAT=SERVER LANGUAGE=JAVASCRIPT>
    //Class Conn()
    function Conn() {
    //private variables
    var db = 'data/data.mdb';
    var connStr = 'Provider = Microsoft.Jet.OLEDB.4.0;Data Source = ' + Server.mapPath(db);
 
    //public variables
    this.conn;
 
    //public function getConn()
    this.getConn = function() {
      try{
      this.conn = new ActiveXObject('ADODB.Connection');
      this.conn.open(connStr);
      }catch(exception){
      Response.write('<ol>');
      Response.write('<li>' + exception + '</li>');
      Response.write('<li>' + (exception.number & 0xFFFF) + '</li>');
      Response.write('<li>Microsoft Jet connection error</li>');
      //Response.write('<li>' + exception.description + '</li>');  //不打印错误信息,以防止报漏数据库地址
      Response.write('</ol>');
      //throw exception;  //不打印错误信息,以防止报漏数据库地址
      Response.end();  //停止执行,防止下面的错误发生
      }
    }

    //public function execute()
    this.execute = function(sqlStr) {
      try{
      return this.conn.execute(sqlStr);
      }catch(exception){
      Response.write('<ol>');
      Response.write('<li>' + exception + '</li>');
      Response.write('<li>' + (exception.number & 0xFFFF) + '</li>');
      Response.write('<li>' + exception.description + '</li>');
      Response.write('</ol>');
      Response.end();
      }
    }

    //public function close()
    this.close = function() {
      try{
      this.conn.close();
      this.conn = null;
      }catch(exception){
      Response.write('<ol>');
      Response.write('<li>' + exception + '</li>');
      Response.write('<li>' + (exception.number & 0xFFFF) + '</li>');
      Response.write('<li>' + exception.description + '</li>');
      Response.write('</ol>');
      Response.end();
      }
    }
    }

    //var conn = new Conn(); //建立新的Conn对象
    //conn.getConn(); //当数据库路径错误是,打印定制的错误信息
    //conn.execute('select * from test');//当路径正确,而没有test表时打印响应信息
    //conn.close()

</SCRIPT>

去掉代码尾部注释掉的几行代码可以看到效果。

另外,其实代码实例也是很丰富的,网络上很多高手写的javascript客户端代码,简单修改之后就可以拿来作为服务器端代码,比如将客户端代码中的document.write改为asp的Response.write...
2024-04-08 09:35:56 IP:已设置保密
分页: 1, 共 1 页
快速回复主题
账号/密码
用户: 没有注册? 密码:
评论内容