《ASP动态网页设计》 电子教案 系部:信息工程系 专业:计算机应用专业 第一讲 ASP的系统运行环境 教学重点: 1、ASP动态网页的工作基本原理; 2、Windows 2000 Server /XP IIS的安装与配置; 教学要求: 1、熟知有关ASP的基本概念和工作原理,如ASP、HTML、静态网页、动态网页、HTTP、PWS、IIS、IP地址等;了解静态网页和动态网页的区别。 2、熟练掌握ASP Web服务器的安装与运行环境的配置,特别是在Windows 2000 Server/XP系统中IIS的安装与配置;熟知WEB服务器根目录的设置和主页文件的命名。 3、熟悉ASP文件的基本格式;熟练运用Dreamweaver编辑ASP动态网页原代码;熟练掌握使用本机IE浏览器调试ASP程序的方法。 教学内容 1、关于网站的有关术语与知识 Web服务器:存储和管理供给全球各地用户浏览网页的服务器,软件支持如:运行在windows 2000 sever系统上的IIS,运行在unix系统上的apache等 ; 客户端浏览器:通过在地址栏中输入Web服务器地址从而访问Web服务器的软件;目前主要是Internet Explorer(IE)和Netscape; HTML:超级文本标记语言(Hypertext Mark-up Language)标准的文本文件,不是编程语言,而是一种描述性的标记语言;如:<font face=”宋体” size=4 color=”#FF0000”>安徽工业职业技术学院</font>; HTTP:(Hypertext Transfers Protocol)超级文本(超级链接)的传输协议,是TCP/IP协议的一部分;这个协议管理Web浏览器如何向Web服务器请求文件,以及服务器如何将文件发送回来。 FTP:(File Transfers Protocol)文件传输协议,在互联网上上传或下载文件的协议;通常需要输入IP地址、用户名、密码等; IIS:(Internet Information System)Internet信息服务器,用于配置和管理WEB站点的软件;能响应客户端用户的请求从而下载网页到客户端; IP地址:用于标识互联网上各类计算机和服务器的唯一地址,其由32位二进制组成,分成四段,每段8位,如:192.168.0.1; 子网掩码:用于通过与IP地址进行“与”操作来判断某两个IP地址是否位于同一个网内,如果在一个网内,则在网内查找,否则将数据包发送到路由器到外网查找; 域名:是替代枯燥乏味的IP地址的一种分层次的表示方式;如:www.ahip.cn;www.yahoo.com.cn ; 域名服务器DNS:将域名解析为IP地址的服务器(具体原理可参考有关网络类书籍); 2、何为ASP ? ASP是Active Server Pages的简称,是微软公司开发的一套服务器,在这种环境中,通过在标准的HTML网页中嵌入和使用ASP内建对象和可安装组件ActiveX组件,并结合VBScript或JavaScript编程,即可建立动态的、交互的、功能强大的Web页面。主要运行于Windows NT或Windows 2000 server平台,其服务器为IIS4.0/5.0;扩展名为:.asp; 3、ASP的执行方式 静态网页:在客户端浏览地址栏目中键入某个网址,它会向Web服务器发送一个HTTP请求消息(包含消息头和消息体);HTTP请求的第一行如下所示: GET /http://www.sohu.com/a.htm HTTP/1.1 这一行指定了一个被称为(method)的HTTP命令、文档的地址、HTTP协议的版本,还有一些有关浏览器的信息。 Web服务器接收请求,处理请求,并发出响应。HTTP响应的第一行如下所示: HTTP/1.1 200 OK 状态码为“200”意味着成功,之后还有一些头信息用于指定当前的时间、服务器的类型、数据的类型,其后是所请求的数据。 如果请求的页面文件的扩展名为HTM或HTML,则服务器直接从硬盘中读取所请求的页面文件,然后将其传送给客户端浏览器,客户端浏览器收到服务器传送的网页代码后,然后对其解释执行,从而显示网页的内容。 动态网页:若扩展名为.ASP,从服务器中读取出所请求的文件,然后对其ASP脚本代码进行解释执行,生成新的HTML格式,与非ASP代码部分结合,产生动态的HTML网页,并且可以一些提供高级服务(数据库的存储、电子邮件的发送等)。 提示:服务器与客户端的位置关系有三种: 1、在同一机器中(localhost或127.0.0.1) 2、在局域网中 3、在互联网中 4、ASP Web服务器的安装与配置(实验指导1) 控制面板》》》添加和删除程序》》》添加和删除windows组件》》》Internet信息服务》》》将系统盘放入光驱中,安装后在“管理工具”中出现Internet信息服务器即可; 主要需要配置Web服务器的根目录和默认主页文件。 运行Dreamweaver MX 2004建立站点,完成相关的设置,其中根目录与IIS中一致,并使用服务器技术; 5、程序举例(chapter01/myfirstpage.asp、showdate.asp) //myfirstpage.asp <%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>无标题文档</title> </head> <body> <h1> 我是张山,大家好!我的Web服务器配置好了,我的IP地址是192.168.0.1。请访问吧!这是我的第一个ASP网页 !</h1> </body> </html> //showdate.asp <%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>无标题文档</title> </head> <body> <table width="375" border="0" align="center" cellpadding="0" cellspacing="0"> <tr> <td width="178">现在日期:</td> <td width="197"><%=now%> </td> </tr> </table> </body> </html> 课后问题: 请在有关书籍中或Internet中查找并补充有关网络有关概念和术语的详细内容; 现在有一家民营企业希望在互联网中拥有自己的网站来宣传自己的产品,你该做哪些事情呢?能有几种方案?费用多少? 第二讲 HTML 基础 教学重点: 1、HTML表单的应用; 2、CSS层叠样式表的应用; 教学要求: 1、了解HTML语言与高级语言(如VB、C等)的区别;识记网页常用标记及属性,如标题、字体、段落、图像、超链接、表格等; 2、熟练掌握HTML表单中各界面对象的标记符号和属性,如表单、文本域、列表域、复选框与单选钮、命令按钮等; 3、熟练掌握在Dreamweaver中使用层叠样式表CSS;了解层叠样式表与标记属性的区别。 教学内容: 1、构建HTML网页(chapter02/section2/htmlpage.asp) <%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <meta name="keywords" content="计算机,机电,矿产"> <meta name="author" content="安徽工业职业技术学院"> <meta name="description" content="安徽工业职业技术学院是一所工科院校。。。"> <title>标题</title> <style type="text/css"> <!-- form { text-align: center; } --> </style> <link href="mystyle.css" rel="stylesheet" type="text/css"> <Script language="JavaScript"> function checkform() { 函数体 } </script> </head> <body> 主体部分 </body> </html> 2、HTML标记的特点 1、HTML是文本文件,标记符号均用<>括起来,大多数标记成对出现,结束标记多一个斜杠,其用法见其上; 2、标记拥有自己的属性; <font face=”宋体” size=4 color=”#FF0000”>安徽工业职业技术学院</font> 3、HTML标记可嵌套使用,不能交叉; <b><div align=center><font color=#FF00>Active sever page</font></div></b> 4、少数标记是单独使用如:<BR>、<HR> 3、常用标记(图像、超链接和表格) <font face=”宋体” size=4 color=”#FF0000”>安徽工业职业技术学院</font> <img src=”images/flower.jpg” border=”1”> <a href=”http://www.ahip.com”>安徽工业职业技术学院</a> <a href="超星阅读.exe">单击此处文件下载</a> (chapter02/section3/download.asp) <table border="0" bordercolor="#FF0000" >(chapter02/section4/myform.asp) <tr> <td colspan="2" class="td1">用户注册</td> </tr> <tr> <td width="289" class="td2">用户名:</td> <td width="295" class="td2"><input name="username" type="text" id="username"></td> </tr> </table> 4、HTML的表单(chapter02/section4/myform.asp) <form action="userlogin.asp" method="post" name="login"> </form> 两种表单数据的传递方法:GET和POST方法 GET方法:将表单数据附加在Action属性指定的URL地址之后,并在URL地址与表单数据间加上一个“?”分割符,表单的各个数据项间用“&”分割符。 http://localhost/test.asp?txtid=012&txtusename=ucau GET方式一次最多只能提交256个字符; POST方式是将表单数据作为一个独立的数据块直接发送给服务器; 表单中的界面对象 单行文本域 <input name="username" type="text" id="username"> 隐藏域 <input name="username" type="hidden" id="username"> 口令域 <input name="userkey1" type="password" id="userkey1"> 单选按钮 <input name="sex" type="radio" value="radiobutton" checked>男 <input type="radio" name="sex" value="radiobutton">女 列表框 <select name="edu" size="1" id="edu"> <option value="硕士以上">硕士以上</option> <option value="大学本科">大学本科</option> <option value="大专">大专</option> <option value="中专以下">中专以下</option> </select> 按钮 <input type="button" name="Submit" value="确定"> <input type="submit" name="Submit" value="登陆"> <input type="reset" name="Submit2" value="全部重写"> 5、HML的其他常用标记;(chapter02/section5/duomeiti.asp、moveleft.asp) 多媒体 <img dynsrc="clock.avi" start="mouseover"> <bgsound src=”bg.mid loop=3> <marquee dirction=up behavior=”scroll scrollamount=滚动速度 scrolldelay=滚动延迟时间 bgcolor=背景颜色>滚动的内容</marquee> 6 层叠样式表CSS(chapter02/section6/myform.asp) 层叠样式表 (Cascading Style Sheet) 是一系列格式设置规则,它们控制 Web 页面内容的外观。术语 cascading 表示向同一个元素应用多种样式的能力。例如,可以创建一个 CSS 规则来应用颜色,创建另一个 CSS 规则来应用边距,然后将两者应用于页面上的同一个文本。所定义的样式向下“层叠”到您的 Web 页面上的元素,并最终创建您想要的设计。 优点1:使用 CSS 可以非常灵活并更好地控制具体的页面外观,从精确的布局定位到特定的字体和样式。CSS 允许您控制 HTML 无法独自控制的许多属性。例如,可以为选定的文本指定不同的字体大小和单位(像素、磅值等)。通过使用 CSS 以像素为单位设置字体大小,还可以确保在多个浏览器中以更一致的方式处理页面布局和外观。除设置文本格式外,还可以使用 CSS 控制 Web 页面中块级别元素的格式和定位。例如,可以设置块级元素的边距和边框、其他文本周围的浮动文本等。 优点2:它提供了便利的更新功能;更新一处的 CSS 规则时,使用该已定义样式的所有文档的格式都会自动更新为新样式。 CSS 格式设置规则由两部分组成:选择器和声明。选择器是标识格式元素的术语(如 P、H1、类名或 ID),声明用于定义元素样式。在下面的示例中,H1 是选择器,介于括号 ({}) 之间的所有内容都是声明: H1 { font-size:16 pixels; font-family:Helvetica; font-weight:bold; } 声明由两部分组成:属性(如 font-family)和值(如 Helvetica)。上面的 CSS 规则为 H1 标签创建了一个特定的样式:链接到此样式的所有 H1 标签的文本都将是 16 个像素大小、Helvetica 字体和粗体。 在 Dreamweaver 中可以定义以下样式类型: 自定义 CSS 规则(也称为类样式)使您可以将样式属性应用于任何文本范围或文本块。(请参见应用类样式。) <style type="text/css"> .mystyle { font-family: "新宋体"; font-size: 24px; font-weight: 300; color: #FF0000; } </style> HTML 标签样式重定义特定标签(如 h1)的格式。创建或更改 H1 标签的 CSS 样式时,所有用H1标签设置了格式的文本都会立即更新。 H1 { font-size:16 pixels; font-family:Helvetica; font-weight:bold; } CSS 选择器样式(高级样式)重新定义特定元素组合的格式设置,或重新定义 CSS 允许的其他选择器表单的格式设置(例如,每当 h2 标题出现在表格单元格内时都应用选择器 td h2)。高级样式还可以重新定义包含特定 id 属性的标签的格式设置(例如,#myStyle 定义的样式可应用于包含属性值对 id="myStyle" 的所有标签)。 <style type="text/css"> <!-- td h2 { font-family: "宋体"; font-size: x-large; font-weight: 500; color: #000099; } #mystyle { font-family: "宋体"; font-size: 36px; color: #FF0000; } --> </style> <body> <form id="form1" name="form1" method="post" action=""> <label> <input type="text" name="textfield" id="mystyle"/> </label> </form> CSS 规则可以位于以下3个位置: 内部(或嵌入式)CSS 样式表是一系列包含在 HTML 文档文件头部分的 style 标签内的 CSS 规则。 <style type="text/css"> body { margin: auto; padding-top: 100px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; background-color: #FFCCFF; } </style> 外部 CSS 样式表是一系列存储在一个单独的外部 CSS (.css) 文件(并非 HTML 文件)中的 CSS 规则。利用文档文件头部分中的链接,该文件被链接到 Web 站点中的一个或多个页面。 <link href="mystyle.css" rel="stylesheet" type="text/css"> 内联样式是在标签的特定实例中在整个 HTML 文档内定义的。 <p style="line-height:14.5pt;color:red">这是直接在标记符号中应用的样式的方法</p> 注意:手动设置的 HTML 格式设置会覆盖通过 CSS 应用的格式设置。要使 CSS 规则能够控制段落格式,必须删除所有手动设置的 HTML 格式。 CSS 样式设置 定义 CSS 类型属性 定义 CSS 样式背景属性 定义 CSS 样式区块属性 定义 CSS 样式方框属性 定义 CSS 样式边框属性 定义 CSS 样式列表属性 定义 CSS 样式定位属性 定义 CSS 样式扩展属性 课后问题: 1、请访问“安徽工业职业技术学院”的首页,查看源代码,在这个页面中使用了哪些HTML标记语言,使用了哪些CSS样式; 2、总结描述所有的CSS样式的应用,对于课堂上没有提到的CSS样式请查阅Dreamweaver的帮助信息; 3、自己制作一个“用户信息注册界面”的表单,运用CSS样式编排其字体、色彩、格式等元素,并给其他同学浏览,至少五位同学表示赞赏表示成功; 第三讲 JavaScript 教学重点: 1、JavaScript的语法特点,函数的定义、调用,变量的作用域; 2、条件控制语句、循环控制语句; 3、JavaScript中几个常用对象的应用; 教学要求: 1、回顾和复习以前C语言的基本语法知识;进一步加深理解Javascript语法知识; 2、深刻理解有关函数中变量的作用域和各类控制语句的功能; 3、理解和灵活运用JavaScript中常用的几个对象的属性和方法; 教学内容: 1、什么是JavaScript? JavaScript是Netscape公司推出的一种嵌入HTML文档的,基于对象的脚本描述语言。利用它可以进一步的增强网页的交互性、方便操作和控制各种浏览器对象,实现控制浏览器外观、状态和运行方式的目的。利用它还可以实现对用户所输入的数据进行有效性检验,从而减轻服务器的负担。其语法与C语言很相似。 2、在网页中使用JavaScript <Script language="javascript"> window.alert("欢迎进入"); </script> 如果一段javascript应用到多个网页,可以将其放入到扩展名称为:Js文本文件。 在需要使用"JavaScript"的页面中插入方法:(chapter03/section1/javaexample.asp) <Script Language="JavaScript" src="java/java.js"></script> 3、JavaScript语法基础 1、JavaScript的数据类型 JavaScript提供四种基本的数据类型,分别为数值型、逻辑型、字符串型和undefined类型 2、常量、变量(chapter03/section2/mathexpression.asp) <script language="javascript"> var num=24,id="36"; x=num+id; //Number(id) 结果为60 window.alert("x的值为:"+x); //显示的结果为“2436” </script> 通过上例需要注意的问题: Javascript语句区分大小写,语句以分号作为结束符号; 用//来注释语句 变量需要用var定义可以给多个变量赋初值; 变量的类型转换,数值型转换成字符型进行连接运算;需要用类型转换函数。 3、表达式 条件表达式 (条件)?A:B(chapter03/section2/logicexpression.asp) <script language="javascript"> age=20; man=(age>=18)?"adult":"minor"; window.alert("this man is a "+man); </script> 算术表达式、关系表达式(==、===、>=、<=等)、逻辑表达式(&&、||、!等) <script language="javascript">(chapter03/section2/samevalue.asp) document.write("3"==3); //显示true document.write("3"===3); //显示false </script> 4、函数: 函数的定义: function 函数名(形式参数) { 函数体 return 表达式 }(chapter03/section2/ usefucntion.asp) 函数的调用: 格式1:varname=函数名(实际参数) //有返回值时用 格式2:函数名(参数值) //无返回值时用 JavaScript的函数采用传值方式进行传递;通常函数的定义是在<head></head>部分 举例:(chapter03/section2/ passvalue.asp) <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>无标题文档</title> <script language="javascript"> function cuberoot(num) { num=Math.pow(num,1/3) return num; } </script> </head> <body> <script language="javascript"> var x=27 window.alert("27的立方根为:"+cuberoot(x)+",x="+x); </script> </body> </html> 5、变量的作用域 作用域是指定变量的存活范围,在JavaScript中,变量的作用域可分为过程级和页面级,其实质都是局部变量; 在函数中运用var定义的变量只在函数体内有效,如果出现同名则屏蔽函数外的变量; 如果未用var定义则使用函数外同名的变量,如果没有同名的函数外变量则此变量在函数外仍然有效。 举例: <script language="javascript">(chapter03/section2/ varrange.asp) var x=13,y=29; function test() { var num,y=10; //去掉num定义,则不会有错 num=x+y; x++ window.alert("内部的num的值为:"+num); //显示为23 } test(); window.alert("外部的num的值为:"+num); //显示错误 </script> 6、程序控制语句 条件分支语句:其中的条件取逻辑值,数值的0为false,字符的“”为false if (条件) { 语句体1; } else { 语句体2; } 举例:(chapter03/section2/ control_if.asp) <script language="javascript"> var a=3,b=4,c="",d="abc",e=true,f=0; if (a==b) { document.write("条件成立!"); //分别用其它变量来代替条件 } else { document.write("条件不成立!"); } </script> switch(表达式) { case 值: 语句 } 举例:(chapter03/section2/ control_switch.asp) <script language="javascript"> var curday=new Date(); switch(curday.getDay()) { case 1: document.write("星期一");break; case 2: document.write("星期二");break; case 3: document.write("星期三");break; case 4: document.write("星期四");break; case 5: document.write("星期五");break; case 6: document.write("<font color='FF0000'>星期六</font>");break; case 0: document.write("<font color='FF0000'>星期日</font>");break; } </script> 循环控制语句(chapter03/section2/ control_for.asp) for循环 <script language="javascript"> var s=0; for(var n=2;n<=100;n+=2) { s+=n; } document.write("1-100间偶数的累加和为:"+s); </script> while(chapter03/section2/ control_while.asp) <script language="javascript"> var n=1; while(n<=6) { document.write("<h"+n+">JavaScript</h"+n+"><br>"); n++; } </script> do while 7、内置对象与函数(chapter03/section3/ date_array.asp) JavaScript是一种基于对象的脚本语言,每一个对象均有自己的属性和方法,传统的字符串和数学函数变成有关对象的方法;常用的内置对象有string对象、math对象、array和Date String Var 实例名=new String(“字符串”); Var msg=”字符串”; 属性: msg.length 方法:charat()、indexof()等 Math 属性:数学常用的一些常量如:E、PI等 方法:数学常用的函数如:sin(a) 、cos(a)、abs()等; Array Var 数组名=new Array(); Var 数组名=new Array(初值1、初值2等) 数组的成员的编号从0开始, Date Var 实例名=new Date(); 方法: getyear()/getmonth()/getdate()/getday()/gethours()/getminutes()/getseconds() eval()函数(chapter03/section3/ eval.asp) 举例: <title>无标题文档</title> <script language="javascript"> function calculate(obj) { obj.result.value=eval(obj.expression.value); } </script> </head> <body> <form id="frmcalc" name="frmcalc" method="post" action=""> 请输入要计算的表达式 <input name="expression" type="text" id="expression" /> <br> 表达式的值为: <input name="result" type="text" id="result" /> <br> <input type="button" name="Submit" value="计算" onclick="calculate(frmcalc)"/> </p> </form> 课后问题: 1、使用JavaScript编程实现:根据时间段的不同,在网页中显示不同的问候语,若小时数在12点以前,则输出“早上好!”的问候语;若在12点至18点,则输出“下午好!”;18点以后输出“晚上好!”。 第四讲 浏览器对象 教学重点: 1、浏览器提供的对象; 2、JavaScript语言中的事件处理; 教学要求: 1、深刻认识浏览器的功能和其提供的各种对象,了解这些对象所提供的各种方法;熟练在Javascript编程调用浏览器中对象实现常用的功能的方法; 2、熟悉面向对象程序设计的工作原理,了解各类对象的事件响应从而实现动态交互式页面; 1、浏览器对象 JavaScript除了可以访问本身内置的各种对象外,还可以访问浏览器提供的对象,通过对这些对象的访问,可以得到当前网页以及浏览器本身的一些信息,并能完成有关的操作。 浏览器窗口与网页之间,网页与网页各组成部分之间并是一种从属关系,他们大关系如下 2、Window对象: 该对象位于最顶层,是其它对象的父对象,每一个window对象代表着一个浏览器窗口,访问其内部的其它对象:window可以省考略 Window.子对象1.子对象2.属性名或方法名 如:window.document.login.username.value=”guest”; 或document.login.username.value=”guest”; 属性:status <script language="javascript">(chapter03/section4/ windowstatus.asp) window.status="欢迎访问光临本站!"; </script> 方法:(chapter03/section4/ windowprompt.asp) alert方法,没有返回值! Confirm方法:返回逻辑值返回按“是”返回true,否则返回false Prompt:返回输入的值。 举例: <script language="javascript"> name=""; name=window.prompt("请输入你的姓名:",name); window.alert(name+"你好!下面要开始考试了!"); if (window.confirm("你确实准备好了吗?")){ window.location.href="exam.asp"; }; </script> open方法:(chapter03/section4/ windowopen.asp) 用法:winhwnd=window.open(url,windowname,paralist) <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>无标题文档</title> <script language="javascript"> function openwin(url) { var newwin=window.open(url,"winname","toolbar=no,directories=no,menubar=no,scrollbars=yes,rdsizable=no,width=500,height=360"); newwin.focus(); return(newwin); } </script> </head> <body> <a href="#" onClick="JavaScript:openwin('meintro.asp')">作者简介</a> </body> close方法:举例说明 <div align="center"><a href=# onClick="JavaScript:self.close()">关闭</a></div> setTimeout方法:创建定时器,经过指定的毫秒后,自动调用指定的语句; clearTimeout方法:清除定时器;(chapter03/section4/ clock.asp) <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>时钟</title> <script language="JavaScript"> var timer; function clock() { var timestr=""; var now=new Date(); var hours=now.getHours(); var minutes=now.getMinutes(); var seconds=now.getSeconds(); timestr+=hours; timestr+=((minutes<10)? ":0" : ":")+minutes; timestr+=((seconds<10)? ":0" : ":")+seconds; window.document.frmclock.txttime.value=timestr; timer=setTimeout('clock()',1000); //设置定时器 } function stopit() {clearTimeout(timer);} </script> </head> <body> <form action="" method="post" name="frmclock" id="frmclock"> <p> 当前时间: <input name="txttime" type="text" id="txttime"> </p> <p> <input type="button" name="Submit" value="启动始终" onclick="clock()"> <input type="button" name="Submit2" value="停止时钟" onclick="stopit()"> </p> </form> </body> </html> 将上述程序稍加更改,可以创建定时闹钟程序(chapter03/section4/ clertclock.asp) <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>时钟</title> <script language="JavaScript"> var timer; function clock() { var timestr=""; var now=new Date(); var hours=now.getHours(); var minutes=now.getMinutes(); var seconds=now.getSeconds(); timestr+=hours; timestr+=((minutes<10)? ":0" : ":")+minutes; timestr+=((seconds<10)? ":0" : ":")+seconds; window.document.frmclock.txttime.value=timestr; if (window.document.frmclock.settime.value==timestr) { window.alert("起床啦!"); } timer=setTimeout('clock()',1000); } function stopit() {clearTimeout(timer);} </script> </head> <body> <form action="" method="post" name="frmclock" id="frmclock"> <p> 当前时间: <input name="txttime" type="text" id="txttime"> </p> <p>设定闹钟: <input name="settime" type="text" id="settime"> </p> <p> <input type="button" name="Submit" value="启动始终" onclick="clock()"> <input type="button" name="Submit2" value="停止时钟" onclick="stopit()"> </p> </form> </body> </html> 3、location对象:该对象包含有当前网页的URL(统一资源定位器,即网址)。 属性:?href 用于指定导航到的网页(chapter03/section4/ frontpage.asp) 举例: <body> <a href=# onClick="Javascript:window.location.href='nextpage.asp'">按此处到下一个页面</a> </body> 4、history对象:该对象包含有最近10个网页的URL的地址。常用的方法为go(数值)方法,数值为负数往回,等价于浏览器中的“后退”。 举例: <body>(chapter03/section4/ nextpage.asp) <a href=# onClick="Javascript:window.history.go(-1)">该网页是跳转后的页面,请按此处回到上一个页面!</a> </body> 5、external对象:该对象有一个常用的addFavorite方法,利用该方法,可实现将指定的网页添加到收藏夹中 <body>(chapter03/section4/ externalpage.asp) 这是一个值得珍藏的网页!<a href=# onClick="Javascript:window.external.addFavorite('http://www.ahip.cn','安徽工业职业技术学院')">点击珍藏</a> </body> 6、document对象:代表当前网页,其常用方法为write用于在当前页面中输出HTML语句; <script language="javascript">(chapter03/section4/document.asp) var curday=new Date(); document.write("今天是:"); switch(curday.getDay()) { case 1: document.write("星期一");break; case 2: document.write("星期二");break; case 3: document.write("星期三");break; case 4: document.write("星期四");break; case 5: document.write("星期五");break; case 6: document.write("<font color='FF0000'>星期六</font>");break; case 0: document.write("<font color='FF0000'>星期日</font>");break; } </script> 7、JavaScript的事件处理 JavaScript采用了事件驱动的响应机制,用户在网页中的交互操作,将触发相应的事件,当事件发生时,系统会调用执行对应的事件处理函数。 事件:由系统预先定义好的,能被对象识别的一种动作。 事件的类别:系统事件(Load,Unload)和用户事件(MouseOver,MouseOut,MouseDowndown,Click,KeyDown,KeyUp等 事件的响应通过On与事件名称组成,比如Click事件,对应的事件为OnClick 事件句柄=事件处理函数()或语句 举例:(chapter03/section5/ eventwelcom.asp) <input Type=”button” value=”确定” OnClick=”Checkit()”> <body OnLoad=”poup()”> <body OnLoad=:alert(“欢迎光临本站”):> <body OnUnLoad=:alert(“谢谢光临本站”):> 表单对象的常用事件; 举例,完成表单数据的检验(chapter03/section5/ register.asp) <Script language="JavaScript"> function checkform() { if (document.login.username.value=="") { alert("请输入用户名!"); document.login.username.focus(); return false; } if (document.login.userkey1.value=="") { alert("请输入密码!"); document.login.userkey1.focus(); return false; } if (document.login.userkey1.value!=document.login.userkey2.value) { alert("两个密码不同!请请输入密码!"); document.login.userkey1.focus(); return false; } var email_str=document.login.email.value if (email_str.indexOf("@")==-1) { alert("电子邮件的格式不对!"); document.login.email.focus(); return false; } document.login.submit(); } </script> </head> <body> <form action="userlogin.asp" method="post" name="login" id="login"> <table border="0" bordercolor="#FF0000" > <tr> <td colspan="2" class="td1">用户注册</td> </tr> <tr> <td width="289" class="td2">用户名:</td> <td width="295" class="td2"><input name="username" type="text" id="username"></td> </tr> <tr> <td class="td2">密码:</td> <td class="td2"><input name="userkey1" type="password" id="userkey1"></td> </tr> <tr> <td class="td2">重复密码:</td> <td class="td2"><input name="userkey2" type="password" id="userkey2"></td> </tr> <tr> <td class="td2">性别:</td> <td class="td2"><input name="sex" type="radio" value="radiobutton" checked> 男 <input type="radio" name="sex" value="radiobutton"> 女 </td> </tr> <tr> <td class="td2">教育水平:</td> <td class="td2"><select name="edu" size="1" id="edu"> <option value="硕士以上">硕士以上</option> <option value="大学本科">大学本科</option> <option value="大专">大专</option> <option value="中专以下">中专以下</option> </select></td> </tr> <tr> <td class="td2">电子邮箱:</td> <td class="td2"><input name="email" type="text" id="email"></td> </tr> <tr> <td>&nbsp;</td> <td>&nbsp;</td> </tr> <tr> <td colspan="2" class="td3"><div align="center"> <input type="button" name="Submit" value="登陆" OnClick="checkform()"> <input type="reset" name="Submit2" value="全部重写"> </div></td> 课后问题: 1、运用JavaScript和windows对象setTimeout方法编程实现在网页中不断显示不同图片的动画效果; 2、运用JavaScript和windows对象status属性编程实现网站状态行跑马灯式文字效果的显示:“欢迎光临本站”。 第五讲 VBScript 教学重点: 1、常用函数和各种类型的表达式; 2、条件分支程序和循环控制程序以及过程与函数调用; 教学要求: 1、熟悉在ASP页面中使用VBScript,识记VBScript的数据类型和特点,了解各种数据类型常量的表示方法,变量的定义和作用域; 2、熟悉在运用VBScript中各种运算符号生成数学、字符、关系、逻辑表达式,以及运算规则; 3、识记VBScript中有关数学、字符、日期、类型转换等常用函数的名称、参数和返回值; 4、条件分支程序和循环控制程序以及过程与函数调用的概念和结构,应达到“领会”和“熟练应用”的层次; 5、熟悉数组的定义和使用,应达到“熟练应用”的层次。 教学内容: 1、VBScript简介;<% %> 2、数据类型(Boolean、Integer、Single、Date、String、Object等) 3、常量、变量与表达式;运用Dim定义变量(简单变量、数组变量) 4、变量的作用域:过程级和页面级 举例:(chapter04/section123/ varrange.asp) <% dim x,y x=2 y=5 sub testlocalvar() dim x,num x=9 num=y y=x+num end sub testlocalvar response.Write "x的值为:"& x & "y的值为:" & y //y的值更改 response.write "<br>num的值为:" & num //num已经消失 %> 5、运算符 数学运算:+、-、*、\、/、^ 结果:数值 字符连接运算:+(类型相同) &(转化为字符) 结果:字符 关系运算:>、>=、<、<=、<>、= 结果:逻辑值(ture、false) 逻辑运算:not、 and、 or、 xor 结果:逻辑值(ture、false) 6、常用函数 数学函数:Int()、round()、sql()、eval()、rnd() 字符函数:len()、space()、replace()、trim() 转换函数:asc()、chr()、cbool()、cint()、clng()、cstr() 测试函数:isempty()、isnumeric() 日期时间函数:now、time、year()、month()、day()、dateadd() 7、程序控制语句 IF分支语句(三种格式): 1)IF 条件表达式 THEN 只有一条语句 2)IF 条件表达式 THEN 语句体 END IF 3)IF 条件表达式 THEN 语句体1 ELSE 语句体2 END IF SELE CASE分支语句 SELECT CASE 测试表达式 CASE 表达式1 语句体1 CASE 表达式…… 语句体…… CASE 表达式n 语句体n CASE ELSE 语句体 END SELECT 循环语句: for counter=start to end [step increment] 语句体 exit for next do while 条件 语句体 exit do loop do 语句体 exit do loop while 条件 举例:注意格式(chapter04/section123/ autotable.asp) <table align="center" width="80%"> <% for rownum=1 to 7 if rownum mod 2=1 then %> <tr bgcolor="E7E9CF"> <%else %> <tr bgcolor="#F6F6F6"> <%end if for colnum=1 to 4 %> <td>&nbsp;</td> <%next%> </tr> <%next%> </table> 8、过程与函数的定义 sub 过程名(形式参数) 语句块 [exit sub] end sub funtion 函数名(形式参数) 语句块 [exit function] 函数名=函数的返回值 end funtion 举例: 1、利用VBScript在页面中输出当前的日期(chapter04/section456/ instruct1.asp) <%t=now response.Write (year(t)&"年"&month(t)&"月"&day(t)&"日") %> 2、试用VBScript编写一个求数n阶乘的函数Power,利用表单获得求阶乘的数,然后通过调用Power函数,实现阶的计算并输出结果(chapter04/section456/ instruct4.asp) <form name="form1" method="post" action="jieceng.asp"> <table width="400" border="0" align="center" cellpadding="0" cellspacing="0"> <tr> <td>请输入一个数:</td> <td><input name="data" type="text" id="data"></td> </tr> <tr> <td colspan="2"><div align="center"> <input type="submit" name="Submit" value="计算"> <input type="reset" name="Submit2" value="重置"> </div></td> </tr> </table> </form> jieceng.asp <% function power(m) s=1 for i=1 to m s=s*i next power=s end function n=request.Form("data") for j=1 to n response.Write cstr(power(j))+"<br>" next 课后问题: 1、试用VBScript编程,实现计算并输出100至500间的水仙化数。 2、试用VBScript的数组,结合编程实现在页面中输出100个随机基本键位的大写字母,要求每行显示20个字母,各字母间用一个空格分割。 第六讲 ASP内建对象 教学重点: 1、利用Response对象的属性、方法、和Cookies集合来控制和管理由服务器发送到浏览器的数据; 2、利用Request对象获得表单所提交的数据、Cookie的值以及服务器环境变量的值; 3、在globa.asa文件中使用Application对象和Session对象。 教学要求: 1、熟知Response对象的有关属性和方法及Cookies集,熟练掌握其功能和用法,应达到“简单应用”的层次; 2、熟知Request对象的属性和方法集合(Form、QueryString、Cookies、ServerVariables); 3、熟知Server对象的属性和方法(Server.CreateObject()、Mappath()); 4、熟练掌握会话级作用域的对象(Session)的属性和方法; 5、熟练掌握应用级作用域的对象(Application的属性和方法; 6、掌握在global.asa文件中使用Session和Application对象的属性、方法、事件等; 教学内容: 在ASP中内建了一些对象,通过这些对象,可以很容易地收集浏览器发送和请求的信息,以及与服务器和用户相关的信息。 1、Response对象 用于控制和管理由服务器发送到浏览器的数据(HTML普通文本、控制信息、Cookies),其功能主要通过该对象的属性、方法和Cookies集合来实现的。 Buffer属性:指定ASP页面创建的输出是否保存在IIS的缓冲区中,其取值为True或False。(chapter05/section1/ response_buffer.asp ) <%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%> <%response.Buffer=false%> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>无标题文档</title> </head> <body> <%for i=1 to 10 for j= 1 to 500000 '用于延迟 next response.Write(i&",") next %> </body> </html> contenttype属性:指定服务器响应的HTTP内容类型(chapter05/section1/ response.contentype.asp) <%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%> <%type0=response.contenttype%> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>无标题文档</title> </head> <body> <%response.Write type0%> </body> </html> charset属性(chapter05/section1/response_charset.asp) <%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%> <%response.charset="big5" response.charset="gb2312" %> <head> <meta http-equiv="Content-Type" content="text/html; /> <title></title> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /><meta http-equiv="Content-Type" content="text/html; " /></head> <body> 安徽工业职业技术学院 </body> </html> expires属性:用户设置网页过期的时间,以分钟为单位(chapter05/section1/ response_expires.asp) <%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%> <%response.expires=4%> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>无标题文档</title> </head> <body> 现在时间为:<%response.Write time%> </body> </html> status属性(chapter05/section1/ response_status.asp) <body> <%response.status="500 not found"%> </body> write方法:将字符写入HTTP响应流中(chapter05/section1/response_write.asp) binarywrite方法:以二进制的方式输入(chapter08/section6/ showpic.asp) redirct方法:转到其它页面,必须放在其它HTML标记和任何内容之前; <% if passflag=0 then response.Redirect "response_buffer.asp"%> (chapter08/section6/ response_redirct.asp) Reponse对象的cookies集:给客户端作一个标记;(chapter05/section1/ response_cookie.asp) <%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%> <% if request.Cookies("uservisit")("num")="" then response.Cookies("uservisit")("num")=1 else response.cookies("uservisit")("num")=request.Cookies("uservisit")("num")+1 end if response.Cookies("uservisit")("lastvisit")=now response.Cookies("uservisit").expires=dateadd("ww",1,Date) %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>无标题文档</title> </head> <body> <table width="400" border="0" cellspacing="0" cellpadding="0"> <tr> <td><%response.Write "访问次数为:"&request.cookies("uservisit")("num")&"<br>" %></td> <td><%response.write "最近访问时间" & request.Cookies("uservisit")("lastvisit")%></td> </tr> </table> </body> </html> 2、request对象 Request对象将客户端数据保存到内置的几个集合中,通过访问这些集合,便可获得表单所提交的数据、 cookie的值以及服务器环境的值 Request对象的集合:request.集合名(“成员名”) 集合名称 功能与用途  Form 获得用POST方法所提交的表单数据  Querystring 获得用GET方法提交的表单数据  Cookies 获得cookie的值  servervariables 获得HTTP头文件的相关信息和Web服务器的几个环境变量的值  Form集合(chapter05/section2/ myform.asp) Retdata=request.form(“表单界面对象名”)[(index)|.count] <form action="userlogin.asp" method="post" name="login" id="login"> <table border="0" bordercolor="#FF0000" > <tr> <td colspan="2" class="td1">用户注册</td> </tr> <tr> <td width="289" class="td2">用户名:</td> <td width="295" class="td2"><input name="username" type="text" id="username"></td> </tr> <tr> <td class="td2">密码:</td> <td class="td2"><input name="userkey1" type="password" id="userkey1"></td> </tr> <tr> <td class="td2">重复密码:</td> <td class="td2"><input name="userkey2" type="password" id="userkey2"></td> </tr> <tr> <td class="td2">性别:</td> <td class="td2"><input name="sex" type="radio" value="radiobutton" checked> 男 <input type="radio" name="sex" value="radiobutton"> 女 </td> </tr> <tr> <td class="td2">教育水平:</td> <td class="td2"><select name="edu" size="1" id="edu"> <option value="硕士以上">硕士以上</option> <option value="大学本科">大学本科</option> <option value="大专">大专</option> <option value="中专以下">中专以下</option> </select></td> </tr> <tr> <td class="td2">电子邮箱:</td> <td class="td2"><input name="email" type="text" id="email"></td> </tr> <tr> <td>&nbsp;</td> <td>&nbsp;</td> </tr> <tr> <td colspan="2" class="td3"><div align="center"> <input type="submit" name="Submit" value="登陆" OnClick="checkform()"> <input type="reset" name="Submit2" value="全部重写"> </div></td> </tr> <tr> <td>&nbsp;</td> <td>&nbsp;</td> </tr> </table> </form> userlogin.asp 注册的用户名为:<%=request.form("username")%><br> 第一次输入的密码为:<%=request.form("userkey1")%><br> 第二次输入的密码为:<%=request.form("userkey2")%><br> 性别为:<%=request.form("sex")%><br> 教育程度为:<%=request.form("edu")%> 电子邮箱为:<%=request.form("email")%> 对于复选框(chapter05/section2/ shijuan1.asp) <% num=request.form(“界面对象名”).count for n=1 to num answer=answer&request.form(“界面对象名”)(n) next %> 举例: <form name="form1" method="post" action="shijuancheck1.asp"> <table width="545" border="1" align="center"> <tr> <td>1、电子商务包括()两个方面:</td> </tr> <tr> <td><input name="choice1" type="checkbox" id="choice1" value="A"> A、电子商务</td> </tr> <tr> <td><input name="choice1" type="checkbox" id="choice1" value="B"> B、电子交易</td> </tr> <tr> <td><input name="choice1" type="checkbox" id="choice1" value="C"> C、自动化生产</td> </tr> <tr> <td><input name="choice1" type="checkbox" id="choice1" value="D"> D、专家管理系统</td> </tr> <tr> <td><div align="center"> <input type="submit" name="Submit" value="交卷"> <input type="reset" name="Submit2" value="重置"> </div></td> </tr> </table> </form> shijuancheck1.asp <%dim answer answer="" response.Write "你选择的答案是:" for n=1 to request.Form("choice1").count answer=answer & request.Form("choice1")(n) next response.Write(answer) %> querystring集合 该集合用于获取GET方法中提交的表单数据,其用法与form集合相同 表单在用get方式提交数据时,将表单数据附加在URL地址后面如: http://localhost/newtest.asp?txtusername=guest&txtpassword=123456 request.querystring(“txtusername”) request.querystring(“txtpassword”) cookies集合 retvalue=request.cookies(“cookiename”) 具体见上例 severvariables集合 用于检索服务器环境变量的值,以及客户端的一些信息,其用法为 retvalue=request.servervariables(“环境变量名”) 举例(chapter05/section2/ server_var.asp) <td><%pagename=server.MapPath(request.ServerVariables("script_name")) response.Write(pagename)%></td> <td><%servername=request.ServerVariables("server_name") response.Write(servername)%></td> <td><%serverport=request.ServerVariables("server_port") response.Write(serverport)%></td> <td> <%serverip=request.ServerVariables("local_addr") response.Write (serverip)%></td> 3、server对象 属性:server.scripttimeout=时间值 设置ASP页面的最大执行时间,以秒为单位 <%server.scripttimeout=50%> creatobject方法:在服务器上创建已注册对象的实例 set objvar=server.createobject(progid) 举例(chapter06/section1/ advertise.asp) myad=server.CreateObject("mswc.adrotator") //广告对象 set rs=server.createobject("adodb.recordset") //记录集对象 set fso=server.CreateObject("scripting.filesystemobject") //文件系统对象 mappath方法 用于将虚拟路径转换为真实的路径 举例(chapter08/section1/ data_show.asp) dsnpath=server.MapPath("/chapter08/database/教学管理.mdb") '打开数据源产生记录集 fhsql="select * from 教师表" connstr="provider=microsoft.jet.oledb.4.0;data source=" & dsnpath set rs=server.createobject("adodb.recordset") rs.open fhsql,connstr,adopendynamic,adlockpessimistic,adcmdtext transfer方法(chapter05/section3/ server_transfer.asp) 停止执行当前的页面,将执行控制权转到“URL”所指定的新页面 与response.redirct不同的是,其地址栏不变;不需要放在文件的最前面; 举例 <body> <% if passflag=0 then server.transfer("next.asp")%> </body> 4、Session 和Application对象 HTTP协议是无联系的协议,用户连接一个网络服务器,请求一个页面,接受一个页面然后脱离,所有对WEB请求被看作是唯一和独立的连接,与它之前的任何记录会话无任何关系。当用户从一个页面跳到另一个页面范围,系统无法跟踪其会话状态,变量的最大作用域是页面范围。举例:(chapter05/section4/ front.asp) 所以有了Session和Application对象 Session(“变量名”):用户级变量 Session对象的属性 Sessionid:启动浏览器,键入请求的网页,开始了一个新的会话。Sessionid也就确定了,用于标识会话,并作为cookie存储到用户的浏览器中;(chapter05/section4/ sessionid.asp) 服务器 浏览器 Timeout:以分钟为单位定义会话超时的时间期限;默认时间为20分钟;用户在规定的时间内没有刷新或请求页面,这结束会话;防止系统会话太多; 应用:页面的授权访问(chapter05/section4/ login.asp) 两个事件:(存放在global.asa文件中)(chapter05/section4/ webcounter.asp) onstart:启动会话时触发 onend:结束会话时出发 Application对象 Application(“ 变量名”):应用级变量,所有用户任何时候都可以访问; global.asa文件 <script language="vbscript" runat="server"> sub application_onstart() application("count")=1 application("online")=0 end sub sub session_onstart() application("count")=application("count")+1 application("online")=application("online")+1 end sub sub session_onend() application("online")=application("online")-1 end sub </script> webcounter.asp <table width="624" height="47" border="1"> <tr> <td width="159">访问次数:</td> <td width="449"><%=application("count")%></td> </tr> <tr> <td>在线人数:</td> <td><%=application("online")%></td> </tr> </table> 两个事件:(存放在global.asa文件中) onstart:第一个用户访问时触发,只触发一次 onend:web服务器关闭时触发 课后问题: 1、制作一个表单,用户可以选择不同的前景色和背景色,分别以cookie和会话(session)的功能实现当用户浏览本站的其它页面时就以该前景色和背景色显示; 2、用Fireworks工具制作0-9数字图形的图片,然后用这些图片来表示网站计数器的值; 第七讲 关系数据库标准语言SQL 教学重点: 1、在Access数据库管理系统中创建数据库、表,建立表之间的关系; 2、SQL的数据操纵语句(SELECT、INSERT、UPDATE、DELETE)完成数据的相关操作、SQL是结构化查询语言Structure Query Language的缩写。包括数据定义、数据操纵、数据控制等部分。 教学要求: 1、了解有关数据库的基础知识;熟悉在Access数据库管理系统中创建数据库、创建表; 2、熟悉SQL命令格式、SQL的运算符(算术、关系、逻辑)以及SQL函数; 3、熟悉SQL的数据操纵语句(SELECT、INSERT、UPDATE、DELETE),达到“简单应用”的层次; 4、了解SQL的数据定义语句(数据库的创建、删除、表结构的修改); 教学内容: 1、SQL语言的特点:1、一体化;2、非过程化;3语言简洁;4、交互使用; 2、SQL语言的组成部分: Select 查询的数据项 From 来自哪个表 Where 查询条件 Group by 分组汇总 Order by 排序 3、订货管理.mdb “订货管理”的概念模型: 1 m n n “订货管理”的关系模型: 仓库表 仓库号 城市 面积  WH1 北京 370  WH2 上海 500  WH3 广州 200  WH4 武汉 400   职工表 仓库号 职工号 工资  WH2 E1 1220  WH1 E3 1210  WH2 E4 1250  WH3 E6 1230  WH1 E7 1250   供应商表 供应商号 供应商名 地址  S3 振华电子厂 西安  S4 华通电子公司 北京  S6 607厂 郑州  S7 爱华电子厂 北京   订购单表 职工号 供应商号 订购单号 订购日期  E3 s7 OR67 2001-6-23  E1 S4 OR73 2001-7-28  E7 S4 OR76 2001-5-25  E6  OR77   E3 S4 OR79 2001-6-13  E1  OR80   E3  OR90   E3 S3 OR91 2001-7-13   4、查询举例 1、简单查询 SELECT 工资 from 职工表; SELECT * from 仓库表; 2、条件查询 SELECT 工资 from 职工表 where 工资>1230; SELECT * from 职工表 where 工资<1230 and (仓库号="WH1" or 仓库号="WH2"); SELECT * from 职工表 where 工资 between 1220 and 1240; SELECT * from 职工表 where 工资 not between 1220 and 1240; 3、排序查询 SELECT * from 职工表 order by 工资; 4、汇总计算查询 SELECT Count(*) AS 职工总数 FROM 职工表; SELECT sum(工资) AS 工资总额 FROM 职工表; SELECT avg(工资) AS 平均工资 FROM 职工表; 5、分组查询 SELECT 职工表.仓库号, Avg(职工表.工资) AS 平均工资 FROM 职工表 GROUP BY 职工表.仓库号; 6、操作查询 insert into 订购单表 values ("e7","s4","or01","2001-05-25"); delete from 订购单表 where 订购单号="or01"; update 订购单表 set 供应商号="s6" where 订购单号="or67"; 课后问题: 1、教材中的习题7 第八讲 利用ADO实现数据库的存取 教学重点: 1、用ODBC驱动程序或OLE DB链接字符串实现数据库访问与有关操作; 2、运用记录集对象的属性和方法实现记录集的分页显示; 3、图形的字段类型,图形上传与图形数据的获取方法;利用现有的原代码实现图像上传到数据库中;图形的显示。 教学要求: 1、熟悉在管理工具中创建ODBC数据源; 2、掌握ADO连接对象(ADODB.Connection)的Open方法、Close方法、Execute方法实现对数据库中数据的访问; 3、熟悉记录集对象的相关属性、相关方法、Fields集合、记录集内容的显示实现对数据库中数据的访问; 4、熟悉运用HTML表单界面,利用记录集方法(Addnew、Update、CancelUpdate、Delete)添加与编辑修改记录; 5、熟练掌握用ODBC驱动程序实现数据库访问、用纯代码实现图形上传到数据库; 教学内容: 1、ADO对象的简介:Activex Data Object的缩写,称为ActiveX数据对象;ADO是微软提供的新一代数据库存取访问技术,利用ADO对象,通过ODBC驱动程序或OLE DB链接字符串,可实现对任意数据库的存取和访问。 2、ODBC是Open DataBase Connectivity的缩写,称为开放式数据互联,包含了与数据库连接所需要的信息,有三种类型:分别是:用户数据源、系统数据源和文件数据源;文件DSN是存储在一个扩展名为.dsn的文本文件中,可以供多个用户访问和使用;有了ODBC驱动程序,就可实现用同样的方法,来存取和访问任何符合ODBC标准的关系型数据库(其中ODBC又有ODBC数据源和链接字符串两种形式)。 其格式分别为: ODBC数据源 dsnpath=server.MapPath("/chapter08/database/mydsn.dsn") set conn=server.CreateObject("adodb.connection") conn.open "filedsn=" & dsnpath ODBC链接字符串 dbpath=server.MapPath("/chapter08/database/教学管理.mdb") connstr="DBQ="+dbpath+";DRIVER={Microsoft Access Driver (*.mdb)};" set conn=server.CreateObject("adodb.connection") conn.Open connstr 3、OLE DB是微软用来替代ODBC的一种数据库访问技术。OLE DB则是一种对关系型数据库和非关系型数据库均有效的一种数据库访问技术。其格式为: OLE DB链接字符串 dsnpath=server.MapPath("/chapter08/database/教学管理.mdb") fhsql="select * from 教师表" connstr="provider=microsoft.jet.oledb.4.0;data source=" & dsnpath 4、ADO提供了7个对象:Connection、Command、Parameter、recordSet、Field、Property、Error;其中Connection、Command、recordSet对象是整个ADO的核心;除了Command对象可以执行查询外,另外,利用Connection对象的Execute方法和RecordSet对象的Open方法;返回一个记录集; 5、ADO连接对象(Connection) 连接对象在使用前必须创建该对象的实例,其创建方法为: 如:<% set conn=server.createobject(“adodb.connection”)%> set rs=conn.execute(fhsql) //执行命令,产生记录集对象 利用记录集对象所提供的方法可以移动记录指针,以改变当前记录,记录是由若干个字段构成的,所有字段的集合,构成字段集Fields,通过对字段的访问获得字段的当前值 相关属性:EOF BOF RecordCount AbslutePosition 相关方法:Movefirst movelast moveprevious movenext fields对象的属性:value name type size count rs.fields(字段名|字段顺序号).value (chapter08/section123/ data_show.asp) <% dsnpath=server.MapPath("/database/mydsn.dsn") //将虚拟路径转换为绝对路径 set conn=server.CreateObject("adodb.connection") //创建对象 conn.open "filedsn=" & dsnpath fhsql="select * from 学生表" set rs=conn.execute(fhsql) //执行命令,产生记录集对象 for num=0 to rs.fields.count-1 response.write rs.fields(num).name next response.write "<br>" do while not rs.eof for num=0 to rs.fields.count-1 response.write rs(num) next rs.movenext loop rs.close //关闭对象 conn.close set conn=nothing %> </body> </html> 执行SQL的操作性语句时,没有记录集的返回 连接对象.execute “SQL操作性语句”[,RecordAffected][,Option] 注:RecordAffected,放置一个变量,SQL语句执行后,所生效的记录数会存在该变量中; 举例:(chapter08/section123/ data_operation.asp) <% dsnpath=server.MapPath("/database/mydsn.dsn") set conn=server.CreateObject("adodb.connection") 'conn.connectionstring="filedsn=" & dsnpath conn.open "filedsn=" & dsnpath fhsql="insert into 学生表 values('0002','李四','机电')" conn.execute(fhsql),num response.write "有"&num&"条记录插入到表中" %> 连接对象的属性 commandtimecout 设置execute方法的最长时间 connectiontimeout 设置open方法的最长时间 connectionstring 设置连接对象的链接信息 6、Recordset对象 利用recordset对象来获得记录集 除了利用连接对象的execute方法可获得记录集外,也可以运用ADO的recordset对象来获得记录集;且该方法所获得的记录集,具有更灵活的控制性和更强的功能;在打开记录集之前,还可以详细设置记录集的游标和锁定类型。 VBScript中定义的符号常量文件位于: C:\Program Files\Common Files\System\ado\adovbs.inc 在需要用到符号常量的程序前加上: <!--#INCLUDE FILE=”ADOVBS.INC”> 创建recordset对象 如:set rs=server.createobject(“adodb.recordset”) 记录集的open方法 调用方法为: rs.open usersql,myconn,cursortype,locktype,option usersql:代表SQL查询语句 ; myconn:代表数据源名或数据库的链接字符串,文件数据源表达为“FILEDSN=数据源文件名”; cursortype:用于设置记录集的游标类型,为可选项。控制从服务器数据库取回数据的方式,从而决定可以对记录集进行怎样的操作。 符号常量 值 功能描述  adOpenForwardOnly 0 前项游标,默认值。只能向前移动;  AdOpenKeyset 1 可向前或向后移动游标,一个用户删除或改变一条记录后,记录集将反映出这个变化,若用户添加新记录,该新记录将不会出现在记录集中;  AdOpenDynamic 2 可向前或向后移动游标,其他用户的任何修改都将在记录集中立即反映出来;  adOpenStatic 3 静态游标。其他用户的任何修改都不在记录集中反映出来;服务器响应的数据与数据库已经分开;  Locatype属性:用于设置对记录集的锁定类型,锁定类型决定了当不止一个用户同时试图修改一个记录时,数据应如何处理。 符号常量 值 功能描述  adLockReadOnly 1 以只读方式打开,所以不能做任何更新;为默认值。  adLockPessimistic 2 在编辑修改记录时,立即锁定它;悲观加锁;  adLockOptimistic 3 在编辑修改记录时,并未加锁,只有在调用记录集的Update方法更新记录时,才锁定记录。即乐观加锁。  Option:该参数项用于指定usersql参数项的命令字符串的类型 符号常量 值 功能描述  adCmdText &H0001 被执行的字符串是一个命令文本  adCmdTable &H0002 被执行的字符串是一个表  adCmdStoredProc &H0004 被执行的字符串是一个存储过程  adCmdUnknown &H0008 不指定字符串的类型,即未知类型。此为默认值   记录的添加与编辑修改 利用记录集提供的一组方法,用于实现记录的添加、更新、删除 分别:Addnew、Delete、Update(详细操作见案例)(chapter08/section4/) 7、记录集的分页显示(chapter08/section5/ teacher.asp) 记录数据多需要分页显示:记录集提供了三个相关的属性,分别是: pagesize:用于设置每页的记录个数,默认值为10 pagecount:用于返回记录集的逻辑页数 absolutepage:用于设置或返回当前页 注意的地方: 数据库必须要用OLE DB链接字符串来访问数据库; 记录集的游标即cursortype只能是1或3; 代码实现图形上传到数据库,注意以下事项即可: 要(http://www.pcnetedu.com)下载一个upload.inc文件,包含在网页中 <!--#INCLUDE file="Upload.inc"-->使用其中的getupload函数; 使用Request.BinaryRead方法:获取表单提供的二进制流; 使用AppendChunk方法:将数据写入数据库中; 具体见案例:(chapter08/section6/ product_add.asp) 9、显示数据库中的图形,注意以下事项即可:(chapter08/section6/ product_show.asp) 利用GetChunk方法,从字段中获取数据; 利用Response.BinaryWrite方法输出二进制流; 具体见案例: 课后问题: 1、试编写一会员登陆页面(Login.htm)。若密码校验正确,则将页面导航到trade.asp;若密码错误,则输出秘密错误的提示信息;若数据表中无该用户,则提示用户注册,并产生注册的链接,用户单击该链接后,将页面导航到用户注册页面(register.htm)。另外,用户单击会员登陆页面中的“马上注册”按钮时,也将页面导航到用户注册页面。 第九讲 可安装的组件 教学重点: 1、Ad Rotator组件; 2、访问权限检测组件; 3、计数器组件 4、文件存取组件 5、Jmail组件对象的属性、方法; 教学要求: 1、熟悉将FAT32的文件格式转换为NTFS的文件格式的方法;熟练掌握利用权限检测组件实现对某些页面的权限进行判断; 2、了解使用Counter计数器和Page Counters计数对象实现页面访问次数的统计方法; 3、了解和掌握FileSystemObject文件存取对象实现文件、驱动器、文件夹的各类操作,应达到“简单应用”的层次; 4、熟练掌握利用Jmail组件对象的属性、方法实现电子邮件的收发方法; 教学内容 1、除内置对象外,ASP还提供了一些可安装组件供用户选择使用,以增强ASP的开发应用能力。可安装组件的应用,一般要经过以下步骤: 寻找和下载该组件,文件名为*.dll; 将此文件拷贝到c:\windows\system目录下; 使用命令:c:\windows\system>regsvr32 *.dll; 在注册表中查看组件是否注册成功; 在ASP页面中运用:server.createobject(“组件的名称”); 注:有些组件在ASP安装后就已经安装好了,直接使用即可;如广告组件:Ad Rotator组件; 2、常用组件 1、Ad Rotator(主要由以下几个文件组成) (chapter06/section1/ advertise.asp) <% set myad=server.CreateObject("mswc.adrotator") response.Write myad.getadvertisement("adort.txt") %> adort.txt edirect adredir.asp width 400 height 60 border 1 * adpic/press.gif http://localhost/chapter08/section5/teacher.asp 清华大学出版社 40 adpic/myschool.gif http://www.penctedu.cn 新思维网校 30 adpic/giga.gif http://www.gigabyte.com.cn 技嘉中文网站 30 adredir.asp <% response.Redirect(request.QueryString("url")) %> 还有几个广告图片文件 2、访问权限检测组件 在设计和维护网站时,常常需要限制用户对某些重要资源的访问,通常的做法是设计一个表单页面,要求用户输入用户名和密码;然后让专门的程序来访问用户数据库来检索输入的用户名和密码,并对是否具有访问某页面的权限进行判断,若有则允许访问,否则禁止访问。 也可以在访问某页面时,弹出网络密码输入窗口,强制用户登录到服务器的系统中,可以运用访问权限检测组件对输入的用户名和密码身份验证通过后,才允许访问和使用网站的资源。这种方式要求文件系统是NTFS格式; 1>windows 2000多用户多任务的系统:FAT32、NTFS 2>NTFS的特点: 文件加密,它极大地增强了安全性。 可以对单个文件设置权限,而不仅仅是对文件夹进行设置。 磁盘活动恢复记录,可帮助您在断电或发生其他系统问题时,尽快地还原信息。 磁盘配额,可用来监视和控制单个用户使用的磁盘空间量。 可更好地支持大驱动器,NTFS 支持的最大驱动容量比 FAT 支持的容量大得多,但随着驱动器容量得增大,NTFS 的性能并不随之降低,而 FAT 的性能却急速下降。 将FAT32文件格式转化为NTFS格式:c:\>convert e: /fs:ntfs 举例:(chapter06/section2/ mainpage.asp) 站点中有一个manager.asp页面需要授权访问,仅允许用户名为:“03soft”用户,密码为:“123”的登陆用户访问。 实现的步骤与方法: 在系统中创建用户名03soft,设置帐户密码:123 设置manager.asp只有03soft用户可以访问 设置一个mainpage.asp其中存放访问权限检测组件,只有Administrator和03soft用户可以访问; 在IIS中,设置mainpage.asp页面的验证方式为“集成Windows验证”; 具体见案例: 3、计数器组件(chapter06/section2 / pagecounter.asp) <% set mypagecounter=server.CreateObject("mswc.pagecounter") mypagecounter.pagehit if mypagecounter.hits=20 then response.Write "<script language='javascript'>alert('恭喜你成为第20位访问者')</script>" end if response.Write "访问次数:" & mypagecounter.hits %> 4、文件存取组件(更多操作见案例) <% set fso=server.CreateObject("scripting.filesystemobject") filename=server.MapPath("counter.txt") set txtstream=fso.createtextfile(filename) txtstream.writeline("this is a test") txtstream.close set fso=nothing response.Write("文件创建成功!") %> 5、Jmail组件对象(邮件的收发) 邮件表单 <form method=post action=sendmail.asp> 请填写以下资料并按寄出键即可 <br> <br> 姓  名: <input type=text size=20 name=name> <font color=#FF0000>*</font><br><br> 电子邮件: <input type=text size=20 name=email> <font color=#FF0000>*</font><br><br> 联系方式: <input type=text size=40 name=other><br><br> 主  题: <input type=text size=40 name=subject> <br><br> 正  文 <br> <textarea name=body cols=50 rows=12 wrap=PHYSICAL></textarea> <font color=#FF0000>*</font><br> <input type=submit value=寄出> </form></td> 发送程序 <%@LANGUAGE = VBscript%> <html> <body> <%recipient ="info@123.com" '此为收信人电子邮箱 ' 取得表单资料 name = Request.Form("name") senderEmail = Request.Form("email") other=request.Form("other") subject ="Re:" & Request.Form("subject") body = Request.Form("body") if name <>"" and senderEmail <>"" and body<>"" then set msg = Server.CreateOBject("JMail.Message") ' 建立 JMail 组件 msg.Logging = true ' 设定将寄信的过程记录下来 msg.silent = true ' 中文编码设定 msg.Charset ="gb2312" msg.From = senderEmail ' 将表单资料存入组件中 msg.FromName = name ' smtp认证的关键 msg.mailserverusername="info@123.com" '邮箱账户,需完整地址 msg.mailserverpassword="password" '输入你的邮箱密码 msg.AddRecipient recipien ' 将收信人的资料加入组件 msg.Subject = subject ' 设定信件的主题 msg.body = body & "vbcrlf" & "vbcrlf" & "其他联系方式:" & other ' 设定信件的主体内容 if not msg.Send("mail.123.com") then '送出表单资料为电子邮件 ,并指定发信服务器 SMTP Response.write "<pre>" & msg.log & "</pre>" else Response.write "信件成功寄出,谢谢您的留言!!" Response.write "<a href=javascript:history.go(-1)>返回</a>" end msg.Close set msg=nothing else response.write "请将内容填写完整!!" end if %> </body> </html> 课后问题: 1、试编写一页面,运行后弹出网络密码输入框,密码验证通过后,在客户端输出用户所输入的用户名和密码。 2、用文件系统对象,在C盘根目录下创建一个名为test.bat的文件,并写如以下内容: @echo off echo 利用文件系统对象进行的写文件测试 echo echo 按任意键继续... pause>nul smartdrv dir c:/p clse echo on 然后将该文件设置为只读。注意:在使用GetFile方法获得test.bat文件所对应的文件对象时,应先关闭该文件; 3、利用文件系统对象和ADO对象分别写两个页面计数程序; 第十讲 ASP应用实例——留言本 留言本又称为留言簿或留言板,是目前网站中使用交为广泛的一种与用户沟通、交流的方式。通过留言本,可收集来自用户的意见或需求信息,并可作出相应的回复,从而实现网站与客户之间的交流与沟通。从功能上主要是完成留言的书写与保存、留言的读取与显示以及留言的管理。系统整体结构比较简单、规模较小;涉及到的各类技术要求并不复杂、无特殊要求;可以直接进入系统的详细设计阶段,其复杂性主要体现在对界面的美化和功能的完善方面; 系统的详细设计 功能设计(功能模块的划分): 留言的签写; 留言的显示; 留言的回复; 留言本的管理(管理员的登录、编辑留言、留言的删除、系统资料的修改); 回复以及对留言的管理 界面设计: 1)整体效果 区域分配:留言本可视为由顶部的标题和功能菜单显示区、中间的数据显示区和底部的版权信息显示区; 风格的设计:主题轻松、明快、活泼,其主色彩基调以暖色调橘红色为主; 2)主界面(留言的显示)的设计 LOGO的设计:网站的徽标; 标题:网站的名称运用特效文字处理(阴影文字、发光、动画) 功能菜单:主要有“返回首页”、“签写留言”、“管理留言”、“加入收藏”等;为了增添页面的活泼气氛和页面的美感可以在菜单前面加入形象的小图标; 客户信息:根据需要设置如发表时间、IP地址、Email、QQ号等; 留言信息:显示用户留言与回复;本信息的“回复”的界面的链接; 版权信息显示区:显示版权号和版本号、主管单位、联系方式等 3)签写留言模块的界面设计: 顶部的标题和功能菜单显示区、底部的版权信息显示区同上述的主界面 数据显示区:是一个表单,用表格规划,内有两个“确定”,“返回”按钮 留言内容:是表单中多行文本 客户信息:表单中的用户名、Email、QQ号、主页等 表情动画图片:表单中的单选按钮; 4)留言的回复模块的主界面 顶部的标题和功能菜单显示区、底部的版权信息显示区同上述的主界面 数据显示区域:表单,回复的用户名和内容,采用多行文本域控件; 5)留言本的管理 顶部的标题和功能菜单显示区:功能菜单显示区需要增加“修改资料”和“管理退出”两个按钮; 管理员的登录界面 数据显示区域:表单中填写管理员的帐号、密码,采用单行文本域控件; 编辑留言 当点击“编辑”按钮时,弹出留言的编辑页面,点击“删除”按钮时,弹出删除确认页面; 系统资料的修改 数据显示区:表单,显示系统资料的信息并进行编辑修改; 数据库设计 数据库管理系统采用:Microsoft Access 2000 数据库取名为:leftword.mdb其中有两个表: systemdate表:用于存放系统资料和管理员信息的表,表结构如下: 字段名 字段类型 宽度 字段属性 说明  Admin_name 文本 8 不允许空字符串 管理员帐号  Password 文本 15 不允许空字符串 管理员密码  Name 文本 8 允许空 版主姓名  Homepage 文本 40 允许空 主页地址  Email 文本 40 允许空 Email地址  Pagesize 数字 整数 必填字段 每页显示的留言数  Logo 文本 12 不允许空字符串 保存logo图文件名  Bulletin 文本 50 允许空字符串 公告信息   message表:用于保存具体的留言信息 字段名 字段类型 宽度 字段属性 说明  ID 自动变号  主键   Username 文本 15 不允许空字符串 留言用户名  Message 备注  允许空字符串 留言内容  Qq 文本 25 允许空字符串 留言者QQ号  Email 文本 30 允许空字符串 留言者Email  Homepage 文本 40 允许空字符串 留言者个人主页  From_address 文本 15 允许空字符串 留言者IP地址  leavetime 文本 20 允许空字符串 留言时间  Pic 文本 12 允许空字符串 表情图形对应的文件名  处理过程设计(两种方案) 第一种方案: 各个独立功能模块彼此独立,分别实现不同的功能,将页面分成 “顶部的标题和功能菜单显示”页面文件(普通用户和管理用户): topmenu.asp、M_topmenu.asp “中间的数据显示” 页面文件(留言显示、签写留言、回复留言、资料管理等) showmsg.asp、writemsg、reply.asp、edit.asp等 “底部的版权信息显示” 页面文件: copyright.asp; 在不同的功能模块文件中包含以上这些文件;如: <!__#include file=”inc/topmenu.asp”> <!__#include file=”inc/showmsg.asp”> <!__#include file=”inc/copyright.asp”> 第二种方案: 可将实现的各项功能的代码,分别定义为不同的过程,并保存在各自独立的ASP的页面。然后编写一个系统总控页面index.asp将所要实现的功能,通过action查询变量传递给index.asp页面,在index.asp页面中,获取该变量的值后,利用条件判断语句,将实现对应功能的页面包含进来。 5、站点设计 在站点根目录下(e:\mysite)创建一个mybbs目录,用于保存留言本的的所有文件,然后在mybbs下分别创建database(用于存放数据库和数据源)、css(用于存放css样式表文件)、inc(用户存放所有的模块的文件)、images(用于存放所有图片文件)、logo(存放logo徽标图形)文件夹; 6、程序设计 conn.asp <% dim conn dim connstr dim db db="database/leftword.mdb" Set conn = Server.CreateObject("ADODB.Connection") '数据库连接 connstr="driver={Microsoft Access Driver (*.mdb)};dbq=" & Server.MapPath(""&db&"") conn.Open connstr sub endConnection() conn.close set conn=nothing end sub '结束 %> topmenu.asp <%sub tablefirst() %> <TABLE cellSpacing=0 cellPadding=0 width="99%" border=0 align="center"> <TBODY> <TR> <TD bgcolor="#FFFFFF"> <%end sub%> <%sub tablelast() %> </TD> </TR> </TBODY> </TABLE> <%end sub%> <% function table(content) tablefirst() %> <%=content%> <% tablelast() end function%> <% sub urltomyself() %> <table border="0" width="100%" cellpadding="0" height="12"> <tr> <td width="100%" height="6" class=white> <p align="center"> <img src="image/homepage.gif" width="16" height="16" align="absmiddle"><a href="<%=homeurl%>" target="_blank">首页</a> <img src="image/post.gif" width="15" height="16" border="0" align="absmiddle"><a href="?user=<%=admin%>&action=write">签写留言</a> <%if session("user")=admin then%> <img src="image/userlist.gif" width="16" height="16" align="absmiddle"><a href="?action=administrator&user=<%=admin%>" >用户管理</a> <img src="image/logout.gif" width="14" height="12" align="texttop"><a href="?action=logout&user=<%=admin%>" >管理退出</a> <%else%> <img src="image/registration.gif" width="16" height="16" align="absmiddle"><a href="?action=registration&user=<%=admin%>">免费申请</a> <img src="image/manage.gif" width="16" height="16" align="absmiddle"><a href="?action=isadmin&user=<%=admin%>">管理留言</a> <%end if%> <img src="image/fav_add.gif" width="16" height="15" align="absmiddle" border="0"><a href="javascript:{window.external.addFavorite('<%=homepage%>','<%=homename%>')}">加入收藏</a> </td> </tr> </table> <% end sub %> <%sub toptablefirst()%> <table style="BORDER-COLLAPSE: collapse" bordercolor=#111111 cellspacing=0 cellpadding=0 width="550" align=center border=0> <tbody> <tr> <td width=168 height=65 background="css/<%=css_name%>/<%=TopLeft%>"> <table border="0" cellpadding="0" cellspacing="0" width="168"> <tr> <td rowspan="3" width="9" height="65">&nbsp;</td> <td width="48" height="9"></td> <td rowspan="3" width="111" height="65"> <table width="111" border="0" cellspacing="0" cellpadding="0" style="TABLE-LAYOUT: fixed"> <tr> <td width="10"></td> <td width="91" style="LEFT: 0px; WIDTH: 100%; WORD-WRAP: break-word" height="20" class=xpshadow> <a href="<%=homepage%>" target="_blank"><font color="#FFFFFF"><%if myhome<>"" then response.write myhome end if %></font></a> </td> </tr> </table> </td> </tr> <tr> <td><span class=xpshadow><img src="<%if logo<>"" then response.write logo else response.write("logos/public.gif") end if %>" width="48" height="48" border="0"></span></td> </tr> <tr> <td width="48" height="8"></td> </tr> </table> </td> <td background="css/<%=css_name%>/<%=TopMid%>" width="442" align="right"> <%end sub%> <%sub toptablelast()%> </td> <td width=10><img height=65 src="css/<%=css_name%>/<%=TopRight%>" width=36></td> </tr> </tbody> </table> <font size=2><font color=#FFFFFF> </font></font> <%end sub%> <%sub show() %> <%toptablefirst()%> <% if request("user")="" then urltomyself() %> <%toptablelast()%> <% else sql_user="select userid,user,homepage,homename from user where user='"&request("user")&"'" set rs_user=conn.execute(sql_user) if not rs_user.bof and not rs_user.eof then %> <table border="0" width="100%" cellpadding="0" height="12"> <tr> <td width="100%" height="6" class=white> <p align="center"> <img src="image/homepage.gif" width="16" height="16" align="absmiddle"><a href="<%=rs_user("homepage")%>" target="_blank">首页</a> <img src="image/post.gif" width="16" height="16" border="0" align="absmiddle"><a href="?user=<%=rs_user("user")%>&action=write">签写留言</a> <%if session("user")<>"" then%> <img src="image/myinfo.gif" width="16" height="16" align="absmiddle"><a href="?action=modify&user=<%=request("user")%>" >修改资料</a> <img src="image/logout.gif" width="14" height="12" align="texttop"><a href="?action=logout&user=<%=request("user")%>" >管理退出</a> <%else%> <img src="image/registration.gif" width="16" height="16" align="absmiddle"><a href="?action=registration&user=<%=admin%>" >免费申请</a> <img src="image/manage.gif" width="16" height="16" align="absmiddle"><a href="?action=isadmin&user=<%=request("user")%>" >管理留言</a> <%end if%> <img src="image/fav_add.gif" width="16" height="16" align="absmiddle" border="0"><a href="javascript:{window.external.addFavorite('<%=homepage%>','<%=homename%>')}">加入收藏</a> </td> </tr> </table> <%toptablelast()%> <% else urltomyself() %> <%toptablelast()%> <% end if end if end sub %>