这个教程将涵盖 ASP 的核心概念,包括:

  • 基本语法和输出
  • 表单数据处理 (Request 对象)
  • 数据库操作 (ADO)
  • 会话管理 (Session 对象)
  • 完整的增删改查流程

准备工作:环境搭建

在学习代码之前,您需要一个运行 ASP 的环境,ASP 通常与 IIS (Internet Information Services) 和 Microsoft Access 或 SQL Server 数据库一起使用。

  1. 操作系统: Windows 10/11 或 Windows Server。
  2. Web 服务器: 安装 IIS,您可以在 "控制面板" -> "程序" -> "启用或关闭 Windows 功能" 中勾选 "Internet Information Services"。
  3. 数据库: 我们将使用 Microsoft Access,因为它简单且无需额外安装服务器,您只需安装 Office 或 Access Runtime 即可。
  4. 开发工具: 任何文本编辑器(如 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 的一个内置函数,返回当前的日期和时间。
  • &: 字符串连接符。

如何运行:

  1. 将上述代码保存为 hello.asp
  2. 将此文件放置到您 IIS 的网站根目录下(通常是 C:\inetpub\wwwroot)。
  3. 在浏览器中访问 http://localhost/hello.asp

如果一切正常,您将看到一个显示 "你好,ASP 世界!" 和当前时间的网页。


简易留言板

这是一个功能完整的 CRUD (Create, Read, Update, Delete) 应用,我们将分步实现它。

步骤 1:准备数据库

我们将使用 Microsoft Access 创建一个数据库。

  1. 打开 Microsoft Access。
  2. 创建一个空白数据库,命名为 guestbook.mdb
  3. 在数据库中,创建一个新表,命名为 messages
  4. messages 表设计以下字段:
字段名称 数据类型 说明
id 自动编号 主键,唯一标识每条留言
author 文本 留言人姓名
content 备注
post_time 日期/时间 留言时间,设置为“默认值”为 Now()
  1. 保存并关闭 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>"
%>

总结与重要提示

  1. 安全性:

    • SQL 注入: 永远不要直接将用户输入拼接到 SQL 语句中,像 add.asp 中那样使用 参数化查询 是最佳实践。
    • XSS (跨站脚本攻击): 在输出用户到页面的内容时,使用 Server.HTMLEncode() 进行转义。Response.Write Server.HTMLEncode(rs("content"))
    • 文件路径: 使用 Server.MapPath() 来获取服务器上的物理路径,而不是硬编码。
  2. 性能:

    • 数据库连接是昂贵的资源,确保在代码的最后总是关闭并释放连接 (Set conn = Nothing)。
    • 对于大型应用,考虑使用连接池。
  3. ASP 经典的现状:

    • ASP 经典是一个非常古老的技术,不再被微软推荐用于新项目,它存在许多安全和性能上的局限。
    • 现代开发应转向 ASP.NET (C# 或 VB.NET)、PHPNode.jsPython (Django/Flask) 等更现代、更强大、更安全的平台。
    • 学习这个案例教程主要是为了理解 Web 开发的基本原理(客户端/服务器、数据库交互、会话管理等),这些概念在所有现代技术中都是通用的。

希望这个详细的 ASP 案例教程对您有帮助!祝您学习愉快!