这个教程将涵盖 ASP 的核心概念,包括:
- 基本语法和输出
- 表单数据处理 (
Request对象) - 数据库操作 (
ADO) - 会话管理 (
Session对象) - 完整的增删改查流程
准备工作:环境搭建
在学习代码之前,您需要一个运行 ASP 的环境,ASP 通常与 IIS (Internet Information Services) 和 Microsoft Access 或 SQL Server 数据库一起使用。
- 操作系统: Windows 10/11 或 Windows Server。
- Web 服务器: 安装 IIS,您可以在 "控制面板" -> "程序" -> "启用或关闭 Windows 功能" 中勾选 "Internet Information Services"。
- 数据库: 我们将使用 Microsoft Access,因为它简单且无需额外安装服务器,您只需安装 Office 或 Access Runtime 即可。
- 开发工具: 任何文本编辑器(如 VS Code, Notepad++)或专业的 IDE(如 Visual Studio),对于 ASP 经典,一个简单的文本编辑器就足够了。
基础语法与输出
这是所有编程语言的入门第一步,用于验证环境是否配置正确。
目标: 在浏览器中显示 "Hello, World!"。
代码 (hello.asp)
<%@ Language=VBScript %>
<%
' 这是一个 VBScript 注释
' 使用 Response 对象向客户端输出内容
Response.Write "<!DOCTYPE html>"
Response.Write "<html lang='zh-CN'>"
Response.Write "<head>"
Response.Write " <meta charset='UTF-8'>"
Response.Write " <title>ASP Hello World</title>"
Response.Write "</head>"
Response.Write "<body>"
Response.Write " <h1>你好,ASP 世界!</h1>"
Response.Write " <p>当前时间是: " & Now() & "</p>" ' 使用 & 符号连接字符串
Response.Write "</body>"
Response.Write "</html>"
%>
代码解析:
<%@ Language=VBScript %>: 声明此页面使用的脚本语言是 VBScript。<% ... %>: 这是 ASP 的脚本定界符,定界符内的代码将在服务器端执行。Response.Write: 最常用的 ASP 对象方法,用于将内容发送到浏览器。Now(): VBScript 的一个内置函数,返回当前的日期和时间。&: 字符串连接符。
如何运行:
- 将上述代码保存为
hello.asp。 - 将此文件放置到您 IIS 的网站根目录下(通常是
C:\inetpub\wwwroot)。 - 在浏览器中访问
http://localhost/hello.asp。
如果一切正常,您将看到一个显示 "你好,ASP 世界!" 和当前时间的网页。
简易留言板
这是一个功能完整的 CRUD (Create, Read, Update, Delete) 应用,我们将分步实现它。
步骤 1:准备数据库
我们将使用 Microsoft Access 创建一个数据库。
- 打开 Microsoft Access。
- 创建一个空白数据库,命名为
guestbook.mdb。 - 在数据库中,创建一个新表,命名为
messages。 - 为
messages表设计以下字段:
| 字段名称 | 数据类型 | 说明 |
|---|---|---|
id |
自动编号 | 主键,唯一标识每条留言 |
author |
文本 | 留言人姓名 |
content |
备注 | |
post_time |
日期/时间 | 留言时间,设置为“默认值”为 Now() |
- 保存并关闭
guestbook.mdb,将这个.mdb文件也复制到 IIS 网站的根目录下。
步骤 2:显示留言列表 (Read)
这个页面负责从数据库中读取所有留言并显示出来。
代码 (list.asp)
<%@ Language=VBScript %>
<%
' --- 数据库连接字符串 ---
' Provider=Microsoft.Jet.OLEDB.4.0 是较旧的版本,适用于 Office 2007 及更早版本
' 如果您使用 Office 2010 或更高版本,可能需要 Provider=Microsoft.ACE.OLEDB.12.0
' Data Source 必须是服务器上的物理路径
Dim connStr
connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("guestbook.mdb")
' --- 创建数据库连接对象 ---
Dim conn, rs
Set conn = Server.CreateObject("ADODB.Connection")
Set rs = Server.CreateObject("ADODB.Recordset")
' --- 打开连接并执行查询 ---
conn.Open connStr
rs.Open "SELECT * FROM messages ORDER BY post_time DESC", conn, 1, 1 ' 1,1 表示只读、向前游标
%>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">留言板 - 列表</title>
<style>
body { font-family: Arial, sans-serif; margin: 20px; }
.message-box { border: 1px solid #ccc; padding: 10px; margin-bottom: 10px; border-radius: 5px; }
.message-author { font-weight: bold; color: #0056b3; }
.message-time { color: #888; font-size: 0.8em; margin-left: 10px; }
.message-content { margin-top: 5px; }
</style>
</head>
<body>
<h1>访客留言</h1>
<a href="add.asp">发表新留言</a>
<hr>
<%
' --- 遍历记录集并显示数据 ---
If rs.EOF And rs.BOF Then
' 如果记录集为空
Response.Write "<p>还没有留言,快来抢沙发吧!</p>"
Else
Do While Not rs.EOF
%>
<div class="message-box">
<div>
<span class="message-author"><%= rs("author") %></span>
<span class="message-time"><%= rs("post_time") %></span>
</div>
<div class="message-content"><%= rs("content") %></div>
<div>
<a href="edit.asp?id=<%= rs("id") %>">编辑</a> |
<a href="delete.asp?id=<%= rs("id") %>" onclick="return confirm('确定要删除这条留言吗?')">删除</a>
</div>
</div>
<%
rs.MoveNext ' 移动到下一条记录
Loop
End If
%>
<hr>
<a href="list.asp">刷新列表</a>
</body>
</html>
<%
' --- 关闭并释放对象 ---
rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
%>
步骤 3:添加新留言 (Create)
这个页面包含一个表单,用于提交新留言。
代码 (add.asp)
<%@ Language=VBScript %>
<%
' 如果是通过表单提交,则处理数据
If Request.ServerVariables("REQUEST_METHOD") = "POST" Then
Dim author, content, conn, connStr, sql
author = Trim(Request.Form("author"))
content = Trim(Request.Form("content"))
' 简单的验证
If author = "" Or content = "" Then
Response.Write "<script>alert('姓名和内容不能为空!'); history.back();</script>"
Response.End
End If
' 连接数据库
connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("guestbook.mdb")
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open connStr
' 使用参数化查询防止SQL注入
sql = "INSERT INTO messages (author, content) VALUES (?, ?)"
Dim cmd
Set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = conn
cmd.CommandText = sql
cmd.Parameters.Append cmd.CreateParameter("author", 200, 1, 255, author) ' 200=adVarWChar, 1=adParamInput
cmd.Parameters.Append cmd.CreateParameter("content", 203, 1, -1, content) ' 203=adLongVarWChar
cmd.Execute
' 关闭连接
conn.Close
Set cmd = Nothing
Set conn = Nothing
' 重定向到列表页
Response.Redirect "list.asp"
End If
%>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">留言板 - 添加留言</title>
<style>
body { font-family: Arial, sans-serif; margin: 20px; }
form { margin-top: 20px; }
input[type="text"], textarea { width: 300px; padding: 5px; margin-bottom: 10px; }
input[type="submit"], input[type="button"] { padding: 5px 15px; cursor: pointer; }
</style>
</head>
<body>
<h1>发表新留言</h1>
<form action="add.asp" method="post">
<p>
<label for="author">姓名:</label><br>
<input type="text" id="author" name="author" required>
</p>
<p>
<label for="content">内容:</label><br>
<textarea id="content" name="content" rows="5" required></textarea>
</p>
<p>
<input type="submit" value="提交">
<input type="button" value="返回" onclick="window.location.href='list.asp'">
</p>
</form>
</body>
</html>
步骤 4:编辑留言 (Update)
这个页面用于修改已有的留言。
代码 (edit.asp)
<%@ Language=VBScript %>
<%
Dim id, conn, connStr, rs, sql
id = Request.QueryString("id")
If id = "" Or Not IsNumeric(id) Then
Response.Write "无效的留言ID!"
Response.End
End If
connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("guestbook.mdb")
Set conn = Server.CreateObject("ADODB.Connection")
Set rs = Server.CreateObject("ADODB.Recordset")
conn.Open connStr
' 查找要编辑的留言
sql = "SELECT * FROM messages WHERE id = " & id
rs.Open sql, conn, 1, 3 ' 1,3 表示可读写、可自由移动的游标
If rs.EOF Then
Response.Write "找不到指定的留言!"
rs.Close
conn.Close
Response.End
End If
' 如果是通过表单提交,则更新数据
If Request.ServerVariables("REQUEST_METHOD") = "POST" Then
rs("author") = Trim(Request.Form("author"))
rs("content") = Trim(Request.Form("content"))
rs.Update
rs.Close
conn.Close
Response.Redirect "list.asp"
End If
%>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">留言板 - 编辑留言</title>
<style>
body { font-family: Arial, sans-serif; margin: 20px; }
form { margin-top: 20px; }
input[type="text"], textarea { width: 300px; padding: 5px; margin-bottom: 10px; }
input[type="submit"], input[type="button"] { padding: 5px 15px; cursor: pointer; }
</style>
</head>
<body>
<h1>编辑留言</h1>
<form action="edit.asp?id=<%= id %>" method="post">
<p>
<label for="author">姓名:</label><br>
<input type="text" id="author" name="author" value="<%= rs("author") %>" required>
</p>
<p>
<label for="content">内容:</label><br>
<textarea id="content" name="content" rows="5" required><%= rs("content") %></textarea>
</p>
<p>
<input type="submit" value="保存修改">
<input type="button" value="返回" onclick="window.location.href='list.asp'">
</p>
</form>
<%
rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
%>
</body>
</html>
步骤 5:删除留言 (Delete)
这个页面负责删除指定的留言。
代码 (delete.asp)
<%@ Language=VBScript %>
<%
Dim id, conn, connStr, sql
' 从 URL 获取要删除的留言 ID
id = Request.QueryString("id")
If id = "" Or Not IsNumeric(id) Then
Response.Write "无效的留言ID!"
Response.End
End If
' 连接数据库
connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("guestbook.mdb")
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open connStr
' 执行删除操作
sql = "DELETE FROM messages WHERE id = " & id
conn.Execute sql
' 关闭连接
conn.Close
Set conn = Nothing
' 重定向回列表页
Response.Redirect "list.asp"
%>
进阶概念:使用 Session 对象
Session 对象用于存储特定用户会话所需的信息,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量不会丢失。
示例: 在用户登录后,存储其用户名。
代码 (login.asp)
<%@ Language=VBScript %>
<%
' 模拟一个简单的登录逻辑
Dim username, password
username = Request.Form("username")
password = Request.Form("password")
If username = "admin" And password = "password" Then
' 登录成功,将用户名存入 Session
Session("LoggedInUser") = username
Response.Write "欢迎, " & username & "!"
Response.Write "<br><a href='profile.asp'>查看我的资料</a>"
Else
' 登录失败
Session("LoggedInUser") = "" ' 清除可能存在的旧Session
Response.Write "用户名或密码错误。<a href='javascript:history.back()'>返回重试</a>"
End If
%>
代码 (profile.asp)
<%@ Language=VBScript %>
<%
' 检查用户是否已登录
If Session("LoggedInUser") = "" Then
' 如果未登录,则重定向到登录页
Response.Redirect "login.asp"
Response.End
End If
' 如果已登录,则显示用户信息
Dim currentUser
currentUser = Session("LoggedInUser")
%>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">用户资料</title>
</head>
<body>
<h1>用户资料页面</h1>
<p>欢迎回来, <strong><%= currentUser %></strong>!</p>
<p>这是一个受保护的页面,只有登录用户才能看到。</p>
<a href="logout.asp">退出登录</a>
</body>
</html>
代码 (logout.asp)
<%@ Language=VBScript %>
<%
' 清除 Session
Session.Abandon()
Response.Write "您已成功退出。<a href='login.asp'>重新登录</a>"
%>
总结与重要提示
-
安全性:
- SQL 注入: 永远不要直接将用户输入拼接到 SQL 语句中,像
add.asp中那样使用 参数化查询 是最佳实践。 - XSS (跨站脚本攻击): 在输出用户到页面的内容时,使用
Server.HTMLEncode()进行转义。Response.Write Server.HTMLEncode(rs("content"))。 - 文件路径: 使用
Server.MapPath()来获取服务器上的物理路径,而不是硬编码。
- SQL 注入: 永远不要直接将用户输入拼接到 SQL 语句中,像
-
性能:
- 数据库连接是昂贵的资源,确保在代码的最后总是关闭并释放连接 (
Set conn = Nothing)。 - 对于大型应用,考虑使用连接池。
- 数据库连接是昂贵的资源,确保在代码的最后总是关闭并释放连接 (
-
ASP 经典的现状:
- ASP 经典是一个非常古老的技术,不再被微软推荐用于新项目,它存在许多安全和性能上的局限。
- 现代开发应转向 ASP.NET (C# 或 VB.NET)、PHP、Node.js、Python (Django/Flask) 等更现代、更强大、更安全的平台。
- 学习这个案例教程主要是为了理解 Web 开发的基本原理(客户端/服务器、数据库交互、会话管理等),这些概念在所有现代技术中都是通用的。
希望这个详细的 ASP 案例教程对您有帮助!祝您学习愉快!
