使用Javascript面向对象的思想编写ASP[上]

Vbscript似乎已经成为ASP服务器端开发的首先语言,Vbscript函数库丰富、而且使用起来也很容易上手,即使平时不太编程的朋友,只要稍微花点时间研究一下就能写出功能不赖的脚本程序了。

这次我想使用的服务器端脚本并非是Vbscript而是Javascript,其实Javascript也是ASP所支持的脚本语言,只是,大家平时很少用在服务器端的开发,而更多的都使用在客户端的环境。

OK!关于Javascript的相关知识这里就不多阐述了,如果有不清楚的可以查阅相关文献、资料。这类东东在网上到处都是,BAIDU、GOOGLE一下都出来了。

现在进入正题,接触过Javascript的朋友都应该知道它是一种基于对象的脚本语言,虽然不象C++、Java那样真的正面向对象,但是也能模拟面向对象的思想。这里我采用面向对象的方式来写,这样做的目的也是为了今后在维护上更加方面、代码逻辑更加清晰明了。

Step 1 建立一个名为sys_conf.asp文件,该文件就是用来定义数据库环境变量的。代码如下:

<%@LANGUAGE="JAVASCRIPT" CODEPAGE="936"%>
<%
//定义数据库环境变量
function sys_conf() {
this.dbuser = "sa";
this.dbpwd = "12345678";
this.dbname = "bookshop";
this.dbhost = "(local)";
}
%>

请注意,第一行<%@LANGUAGE="JAVASCRIPT" CODEPAGE="936"%>这一句一定要写上,因为ASP默认设置是VBSCRIPT。但是如果你在IIS中设置默认语言是JAVASCRIPT的话,那么也可以不写。建议大家还是写上比较好,接着就是一些数据库的环境变量了。

Step 2 建立一个class_database.asp的数据库类文件,代码如下:

<!--#Include file="sys_conf.asp"-->
<%
/*----------------------------------------------*/
//数据库类database
//参数 : 无
/*----------------------------------------------*/
function database() {
       //建立数据库环境变量对象
       var sys_conf_obj = new sys_conf();
       //私有属性
       var host = sys_conf_obj.dbhost;
       var user = sys_conf_obj.dbuser;
       var pwd = sys_conf_obj.dbpwd;
       var name = sys_conf_obj.dbname;
       //公共属性
       this.conn = "";
       this.rs = "";
      
       /*----------------------------------------------*/
       //公共方法:connection()
       //参数 : 无
       //作用 : 建立数据库连接
       //返回值:无
       /*----------------------------------------------*/
       this.connection = function() {
              try {
                     this.conn = Server.CreateObject("ADODB.CONNECTION");
                     this.conn.open("PROVIDER=SQLOLEDB.1;Data Source=" + host + ";Initial Catalog=" + name + ";Persist Security Info=True;User ID=" + user + ";Password=" + pwd + ";Connect Timeout=30");
                     if(this.conn.state == 1) {
                            this.rs = Server.CreateObject("ADODB.RECORDSET");
                            this.rs.ActiveConnection = this.conn;
                     }
              }

              catch(e) {
                     this.conn.close();
                     this.conn = null;
                     Response.Write ("The database connection makes a mistake, please inspect connects the string.");
                     Response.End();
              }
       }
      
       /*----------------------------------------------*/
       //公共方法:create_rs()
       //作用 : 创建记录集对象
       //返回值:无
       /*----------------------------------------------*/
       this.create_rs = function() {
                     this.rs = Server.CreateObject("ADODB.RECORDSET");
                     this.rs.ActiveConnection = this.conn;
       }

       /*----------------------------------------------*/
       //公共方法:close_rs()
       //作用 :释放记录集对象
       //返回值:无
       /*----------------------------------------------*/
       this.close_rs = function() {
                     this.rs.close();
                     this.rs = null;
       }

       /*----------------------------------------------*/
       //公共方法:close_database()
       //参数 : 无
       //作用 : 释放数据库连接对象
       //返回值:无
       /*----------------------------------------------*/
       this.close_database = function() {
              this.conn.close();
              this.conn = null;
       }
      
       /*----------------------------------------------*/
       //公共方法:query()
       //参数 : sql - sql语句 max - 最大记录数
       //作用 : 将记录集对象转换为二维数组
       //返回值:记录集数组
       /*----------------------------------------------*/
       this.query = function(sql,max) {
              var i,j,fieldslen,len,vdata,data=[],sp;
              this.rs.Open(sql),this.conn,1,1;
              if(this.rs.EOF || this.rs.BOF) {
                     this.close_rs();
                     return null;
              } else {
                     vdata = this.rs.GetRows().toArray();
                     //获取数据表的字段数
                     fieldslen = this.rs.fields.count;
                     this.close_rs();
                     //开始转换数组
                     //得到记录数
                     len = vdata.length/fieldslen;
                     if(typeof(max) == "undefined") {
                            //遍历所有记录
                            //i:记录号 j:字段号
                            for(i=0;i<len;i++) {
                                   data[i] = new Array();
                                   //指针指向下一条记录的首字段
                                   sp = i * fieldslen;
                                   for(j=0;j<fieldslen;j++)
                                          data[i][j] = vdata[sp+j];
                            }
                     }else{
                            //显示指定的记录数
                            for(i=0;i<max;i++) {
                                   if(i>=len) break;
                                   data[i] = new Array();
                                   //指针指向下一条记录的首字段
                                   sp = i * fieldslen;
                                   for(j=0;j<fieldslen;j++)
                                          data[i][j] = vdata[sp+j];
                            }
                     }
                     return data;
              }
       }

}

%>

注意,这里采用的是记录集的GetRows()方法来得到一个数组,然后使用JAVASCRIPT中的toArray()函数将它转换为一个JAVASCRIPT的数组。用GetRows()方法得到的数组是个二维数组,用VBSCRIPT很轻松就可以输出数组中的记录了,但是在JAVASCRPT中是没有二维数组的直接转换函数的,用toArray()转换的也只是一个一维数组,所以就要我们自己来将这个一维数组转换为二维数组了。

Step 3 建立一个view.asp来查看数据库中的记录。代码如下:

<!--#Include file="class_database.asp"-->
<%
var database_obj = new database();

database_obj.connection();

str_sql = "Select CourseID,CourseName,UpdateTime,CommDateTime,Comm,Hit From Course order by UpdateTime Desc";

var tmp_arr = database_obj.query(str_sql);
if(!tmp_arr) {
      Response.Write("no data...");
} else {
// 循环输出数据
for(var y=0;y<tmp_arr.length;y++) {

    // 注意,数组下标从0开始

    // 显示数据库中数据

    Response.Write("CourseID: "+tmp_arr[y][0]+", CourseName: "+tmp_arr[y][1] + ",UpdateTime: "+tmp_arr[y][2]);

}
}

database_obj.close_database();

%>

这里的代码就很简单了。主要是调用class_database.asp中的query()方法得到真正的二维数组(也就是我们自己转换的二维数组),然后用循环逐一输出数据。

好了,到此处应该可以搞一段落了。总结一下思路,首先我们使用一个sys_conf()对象来定义数据库的环境变量,这样做的好处就是以后变量修改很方便。接着定义数据库类文件database(),其中封装了一些常规的方法,诸如,连接数据库、关闭数据库、建立记录集等。最重要的还是query()方法,它使用记录集的GetRows()方法将记录集返回一个Vbscript的二维数组,而后使用Javascript中的toArray()函数来转换成一个一维的数组,刚才说了,Javascript中是没有直接转换二维数组的函数的,最后将它转换成我们需要的二维数组。当然如果你不习惯这种方法也可以使用常规的记录集的方法来逐一输出数据,这个主要是看个人的习惯了。

现在的问题是,如果数据库中的记录很多,象这样逐一输出数据肯定不可行,那么就得采取分页的形式了。关于这个我想放在下一次来说。以上的代码只是抛砖引玉,希望能够给大家得到一些编程上的启发,如果能这样的话,我已经很高兴了。由于个人水平有限,如果有哪些地方写得不妥,还请大家多多指正,在此谢过了!

评论: 0 | 引用: 0 | 查看次数: 4324
发表评论
登录后再发表评论!