使用Javascript面向对象的思想编写ASP
作者:jlmqq 来源:无忧脚本 发布时间:2008-06-16 12:20:00
VBScript似乎已经成为ASP服务器端开发的首先语言,VBScript函数库丰富、而且使用起来也很容易上手,即使平时不太编程的朋友,只要稍微花点时间研究一下就能写出功能不赖的脚本程序了。
这次想使用的服务器端脚本并非Vbscript而是Javascript,其实Javascript也是ASP所支持的脚本语言,只是,大家平时很少用在服务器端的开发,而更多的都使用在客户端的环境。
OK!关于Javascript的相关知识这里就不多阐述了,坛子里面多的很,自己去搜索一下吧。
现在进入正题,接触过Javascript的朋友都应该知道它是一种基于对象的脚本语言,虽然不象C++、Java那样真的正面向对象,但是也能模拟面向对象的思想。这里采用面向对象的方式来写,这样做的目的也是为了今后在维护上更加方面、代码逻辑更加清晰明了。
Step 1 建立一个sys_conf.asp文件,用来定义数据库环境变量的。代码如下:
<%
//定义数据库环境变量
function sys_conf() {
//数据库登陆帐号
this.dbuser = "jimmy";
//数据库登陆密码
this.dbpwd = "*******";
//数据库名称
this.dbname = "course";
//SQL SERVER服务器
this.dbhost = "(local)";
}
%>
请注意,第一行
<%@LANGUAGE="JAVASCRIPT" CODEPAGE="936"%>
这一句一定要写上,因为ASP默认设置是VBSCRIPT。但是如果你在IIS中设置默认语言是#的话,那么也可以不写。建议大家还是写上比较好,接着就是一些数据库的环境变量了。
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 = "";
//连接数据库
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 = null;
Response.Write ("The database connection makes a mistake, please inspect connects the string.");
Response.End();
}
}
/*----------------------------------------------*/
//公共方法:create_rs()
//作用 : 创建记录集对象
//返回值:无
/*----------------------------------------------*/
database.prototype.create_rs = function() {
this.rs = Server.CreateObject("ADODB.RECORDSET");
this.rs.ActiveConnection = this.conn;
}
/*----------------------------------------------*/
//公共方法:close_rs()
//作用 :释放记录集对象
//返回值:无
/*----------------------------------------------*/
database.prototype.close_rs = function() {
this.rs.close();
this.rs = null;
}
/*----------------------------------------------*/
//公共方法:close_database()
//参数 : 无
//作用 : 释放数据库连接对象
//返回值:无
/*----------------------------------------------*/
database.prototype.close_database = function() {
this.conn.close();
this.conn = null;
}
/*----------------------------------------------*/
//公共方法:query()
//参数 : sql - sql语句 max - 最大记录数
//作用 : 将记录集对象转换为二维数组
//返回值:记录集数组
/*----------------------------------------------*/
database.prototype.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 = new Array();
//指针指向下一条记录的首字段
sp = i * fieldslen;
for(j=0;j<fieldslen;j++)
data[j] = vdata[sp+j];
}
}else{
//显示指定的记录数
for(i=0;i<max;i++) {
if(i>=len) break;
data = new Array();
//指针指向下一条记录的首字段
sp = i * fieldslen;
for(j=0;j<fieldslen;j++)
data[j] = vdata[sp+j];
}
}
return data;
}
}
database.prototype.update = function(sql) {
if(typeof(sql) == "undefined") {
return;
} else {
this.conn.Execute(sql);
}
}
%>
注意,这里采用的是记录集的GetRows()方法来得到一个数组,然后使用Javascript中的toArray()函数将它转换为一个#的数组。用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中是没有直接转换二维数组的函数,最后将它转换成我们需要的二维数组。当然如果你不习惯这种方法也可以使用常规的记录集的方法来逐一输出数据,这个主要是看个人的习惯了。
现在的问题是,如果数据库中的记录很多,象这样逐一输出数据肯定不可行,那么就得采取分页的形式了。关于这个我想放在下一次来说。以上的代码只是抛砖引玉,希望能够给大家得到一些编程上的启发,如果能这样的话,我已经很高兴了。由于个人水平有限,如果有哪些地方写得不妥,还请大家多多指正,在此谢过了!


猜你喜欢
- 本文实例讲述了mysql报错:MySQL server version for the right syntax to use near t
- 综述本系列文档用于对Python爬虫技术进行简单的教程讲解,巩固自己技术知识的同时,万一一不小心又正好对你有用那就更好了。Python 版本
- 导 读vue3.0中,响应式数据部分弃用了 Object.defineProperty ,使用 Proxy 来代替它。本文将主要通过以下方面
- 本文实例讲述了Go语言接口用法。分享给大家供大家参考。具体分析如下:接口类型是由一组方法定义的集合。接口类型的值可以存放实现这些方法的任何值
- Anaconda is a completely free Python distribution (including for comme
- Python的3.0版本,常被称为Python 3000,或简称Py3k。相对于Python的早期版本,这是一个较大的升级。为了不带入过多的
- 本文实例讲述了Python实现的凯撒密码算法。分享给大家供大家参考,具体如下:一 介绍凯撒密码是一种非常古老的加密方法,相传当年凯撒大地行军
- 选择正确的数据列类型能大大提高数据库的性能和使数据库具有高扩展性。在选择数据列类型时,请从以下几个方面考虑:存放到数据列中的数据类型。数据值
- 在用Python绘制红楼梦词云图文章中讲到我们使用Python把红楼梦中的核心词汇给绘画出来了,但是,红楼梦这么唯美的书,给我们乌漆麻黑的搞
- 一、Time 包中定时器函数go v1.20.4定时函数:NewTicker,NewTimer 和 time.After 介绍time 包中
- 表单介绍说到表单,在HTML中表单的创建时通过<form>标签实现的,在<form>标签内部,字段通过使用<i
- handle non numerical data举个例子,将性别属性男女转换成0-1,精通ML的小老弟们可以略过本文~~,这里不考虑稀疏向
- 前言在开发中一些需求需要通过程序操作excel文档,例如导出excel、导入excel、向excel文档中插入图片、表格和图表等信息,使用E
- js 获取经纬度的实现方法<!-- copyright (c) 2009 Google inc. You are free to
- 本文实例讲述了python条件变量之生产者与消费者操作。分享给大家供大家参考,具体如下:互斥锁是最简单的线程同步机制,面对复杂线程同步问题,
- 如何用Response.Write调用代替内嵌表达式?我们可以利用下面的代码,注意:代码的每一行对响应流有一次写操作,所有的代码都包含在一个
- 在这个abc.php文件中写入如下代码。<?php phpinfo(); ?>你将会看到一个网页,网页内容通常,如下图所示:用中
- train_comb 为Dataframe数据:train_comb= train_comb.as_matrix() #得到values的n
- 设置自动的参数注释标识如何使用pycharm自动添加引用注释描述功能使用场景多行注释,且需要对传入的参数以及返回值进行详尽的阐述时,如下图设
- 列表解析 在需要改变列表而不是需要新建某列表时,可以使用列表解析。列表解析表达式为: [expr for iter_var in itera