大家好,欢迎来到IT知识分享网。
本文还有配套的精品资源,点击获取
简介:ASP是微软开发的服务器端脚本环境,用于动态网页内容生成。本教程精选100个实例,全面讲解ASP基础、核心概念和应用,通过实践加深学习。涵盖服务器端脚本、ASP组件、脚本语言、ASP指令、内置对象、数据库连接、错误处理、ASP与HTML结合及具体实例应用等多个方面。学完后,你能独立搭建动态网站,处理用户交互,管理数据,并提高网页功能。
1. ASP基础知识概述
ASP,即Active Server Pages,是微软公司开发的一种服务器端脚本环境,用于创建动态交互式网页。它允许开发者直接将HTML代码与VBScript或JScript脚本混合起来,从而构建出能够与数据库等后端技术交互的应用程序。ASP的工作原理是通过Web服务器(如IIS)解析,将客户端请求的ASP页面转换成HTML内容,然后发送给用户浏览器。
ASP页面通常以 .asp
为文件扩展名,当这些文件被请求时,服务器就会执行其中的脚本代码,并将结果转换为标准的HTML格式返回给客户端。在这一章节中,我们将简要回顾ASP的历史地位、优势以及如何搭建基本的开发环境。接下来的章节,我们将深入探讨ASP核心组件的使用、脚本语言选择、内置对象的操作以及数据库的高效操作等进阶话题。
2. ASP核心组件深入解析
2.1 ASP核心组件概览
ASP的核心组件,包括Request、Response、Session、Application和Server对象,为开发动态网页提供了丰富的功能支持。本节将深入解析Request和Response对象,它们是ASP网页开发中不可或缺的组件,涉及到网页请求的接收和响应的发送。
2.1.1 Request对象的使用与原理
Request对象允许ASP页面接收客户端发送的请求信息,如表单数据、查询字符串和客户端信息等。它是服务器与客户端交流的数据桥梁。
示例代码
<% Dim strUserName, strUserAgent strUserName = Request.Form("UserName") '从表单获取用户名 strUserAgent = Request.ServerVariables("HTTP_USER_AGENT") '获取用户浏览器信息 Response.Write("用户提交的用户名是:" & strUserName) Response.Write("<br>使用的浏览器:" & strUserAgent) %>
以上代码展示了如何使用Request对象从表单和HTTP请求头中获取数据。 Request.Form
用于获取表单数据,而 Request.ServerVariables
用于获取特定的HTTP请求头信息。
代码解析与参数说明
-
Request.Form
: 用于访问由POST方法发送的表单数据。 -
Request.ServerVariables
: 提供访问服务器和客户端环境变量的能力,比如用户浏览器类型(HTTP_USER_AGENT
)、请求的URI(REQUEST_URI
)等。
2.1.2 Response对象的作用与技巧
Response对象用于向客户端发送数据和控制网页行为,如重定向、设置cookies、处理输出缓冲区等。它提供了灵活的方式来管理服务器响应。
示例代码
<%
Response.Buffer = True '启用响应缓冲
Response.ContentType = "text/html" '设置内容类型为HTML
Response.Write("<html><head><title>示例页面</title></head><body>")
Response.Write("<h1>这是一个ASP页面标题</h1>")
Response.Write("</body></html>")
Response.End '结束响应输出
%>
上述代码利用Response对象输出了一个简单的HTML页面,并通过启用响应缓冲来优化输出控制。
代码解析与参数说明
-
Response.Buffer
: 通过设置为True
启用输出缓冲,这有助于在数据完全准备好之前,先暂存起来,然后一次性发送给客户端。 -
Response.ContentType
: 用来告诉浏览器服务器发送的数据类型是什么,比如text/html
、application/json
等。 -
Response.Write
: 这是发送数据到客户端的主要方法。 -
Response.End
: 此方法用于结束响应的发送,并终止脚本的进一步执行。
2.2 高级组件应用
ASP的高级组件包括Session、Application和Server对象,它们提供了更高级的会话状态管理和服务器端操作功能。
2.2.1 Session对象的状态管理
Session对象用于跟踪单个用户会话。它为每个用户创建一个独立的会话空间,存储特定用户的信息。
示例代码
<% Session("CustomerID") = "C1001" '存储客户ID Session("CustomerName") = "张三" '存储客户姓名 Response.Write("欢迎 " & Session("CustomerName") & " ,您的客户ID是:" & Session("CustomerID")) %>
在上述代码中,我们使用Session对象保存了用户的ID和姓名,然后在页面上显示出来。
代码解析与参数说明
-
Session("变量名")
: 通过键名来存储或检索会话变量中的值。
2.2.2 Application对象在多用户环境下的应用
Application对象提供了在多用户环境下共享数据的能力,适用于网站计数器、消息广播等功能。
示例代码
<% Application.Lock '锁定应用程序对象 Application("SiteVisitors") = Application("SiteVisitors") + 1 '访问次数加1 Application.Unlock '解锁应用程序对象 Response.Write("本站总访问次数:" & Application("SiteVisitors")) %>
此代码演示了如何使用Application对象来追踪和更新网站的访问次数。
代码解析与参数说明
-
Application.Lock
和Application.Unlock
: 这些方法用来锁定和解锁应用程序对象,以确保在多用户操作时数据的一致性。 -
Application("变量名")
: 同样是通过键名来访问和修改存储在Application对象中的变量。
2.2.3 Server对象的服务器端功能详解
Server对象提供了执行服务器端操作的功能,例如执行URL的重写、映射虚拟路径到物理路径等。
示例代码
<% Dim strPhysicalPath strPhysicalPath = Server.MapPath("~/images/profile Pic.jpg") '将虚拟路径映射为物理路径 Response.Write("图片的物理路径是:" & strPhysicalPath) %>
在这段示例代码中,我们使用Server对象的 MapPath
方法将虚拟路径映射为服务器上的物理路径。
代码解析与参数说明
-
Server.MapPath
: 此方法用于将虚拟路径转换为服务器上的物理路径,这对文件操作非常有用。
以上章节只是ASP核心组件深入解析的开端,每一部分都包含着丰富的知识和实用的技巧。通过掌握这些组件的使用,ASP开发者可以构建更为复杂和功能丰富的Web应用程序。
3. ASP脚本语言选择与应用
3.1 VBScript语言基础
3.1.1 VBScript语法结构与编程实例
VBScript(Visual Basic Scripting Edition)是一种轻量级的脚本语言,由微软开发,它与Visual Basic有着密切的关系。VBScript经常被用来编写ASP(Active Server Pages)网页中的服务器端脚本,因为它易于学习,与ASP的兼容性好。
VBScript语法结构的介绍需要从变量声明开始,然后是数据类型、控制语句、循环结构等。在ASP中使用VBScript,可以通过 <% %>
标签内嵌入代码,或者使用 <script runat="server">
来执行服务器端脚本。如下是一个简单的VBScript语法结构示例:
<% Dim myVar myVar = "Hello World" Response.Write "Variable value is " & myVar %>
在这个例子中,声明了一个名为 myVar
的变量,并给它赋予了一个字符串值 "Hello World"
。接着使用 Response.Write
方法将这个变量的值输出到浏览器上。
3.1.2 VBScript的控制语句和函数
VBScript提供了多种控制语句,包括条件语句(如 If...Then...Else
)、循环语句(如 For...Next
、 While...Wend
、 Do...Loop
)等,这些控制语句允许开发者进行逻辑判断和循环操作。在ASP开发中,这些语句用于控制页面流程,例如对用户输入进行验证,或者处理数据库查询结果。
<% Dim i For i = 1 To 10 Response.Write "Number " & i & "<br />" Next %>
上面的代码段使用 For...Next
循环输出了从1到10的数字。
VBScript同样提供了一系列内置函数,包括字符串处理、日期时间处理、数学计算等。比如, Trim
函数可以用来去除字符串两端的空白, Date
函数返回当前日期。下面的例子使用了 Trim
函数:
<% Dim myString myString = " Hello, World! " Response.Write "Original String: " & myString & "<br />" Response.Write "Trimmed String: " & Trim(myString) %>
在这个例子中, Trim
函数移除了字符串 myString
两端的空格,并通过 Response.Write
输出结果。
3.2 JScript与ASP的结合技巧
3.2.1 JScript在ASP中的使用场景
JScript是微软对JavaScript的实现,它也经常在ASP中使用。相较于VBScript,JScript在处理复杂的逻辑和数据操作时更加灵活,特别是在正则表达式处理方面表现更优。JScript可以与VBScript混合使用,这为开发者提供了灵活的语言选择。例如,在一些计算密集型或者需要复杂的字符串处理的场景下,JScript可能是一个更好的选择。
<% var myString = "Hello, World!"; var myReplacedString = myString.replace("Hello", "Goodbye"); Response.Write("Replaced String: " + myReplacedString); %>
上面的代码使用JScript的 replace
方法来替换字符串中的内容,并将结果输出。
3.2.2 JScript与VBScript的交互方法
JScript和VBScript可以互相调用对方的代码。一个常见的交互方式是在VBScript中调用JScript函数,或者反过来。为了在ASP中实现这一点,开发者需要使用 <SCRIPT LANGUAGE="JScript">
标签来声明JScript代码块。
一个混合使用JScript和VBScript的示例:
<!--METADATA TYPE="typelib" FILE="C:\Program Files\Common Files\System\ado\msado15.dll"--> <% ' VBScript part Dim objConn, objRs Set objConn = Server.CreateObject("ADODB.Connection") objConn.Open "your_connection_string" ' JScript part var sql = "SELECT * FROM your_table"; objConn.Execute(sql); ' VBScript part again Set objRs = objConn.Execute(sql) While Not objRs.EOF Response.Write("Name: " + objRs("Name") + "<br />") objRs.MoveNext Wend objRs.Close objConn.Close Set objRs = Nothing Set objConn = Nothing %>
在这个例子中,我们首先使用VBScript创建了一个数据库连接,然后在JScript中编写了SQL查询。之后,回到VBScript代码中执行查询,并将结果输出到页面上。
总结
在ASP开发中,合理选择和运用脚本语言对于开发效率和代码质量有着重要影响。VBScript以其简单的语法和与ASP的良好集成,适用于快速开发和简单应用,而JScript则在处理复杂的逻辑运算和字符串操作时显得更为强大。两者之间的灵活交互使得开发者可以根据不同场景的需求选择合适的工具,从而提升开发的灵活性和效率。
4. ASP指令与内置对象的运用
ASP(Active Server Pages)是微软公司开发的一种服务器端脚本环境,用于创建动态交互式网页。本章节将深入探讨ASP指令和内置对象,解析它们的作用和应用,以及如何在实际开发中高效运用这些功能。
4.1 ASP指令的作用与应用
ASP指令用于配置页面指令和控制页面的执行方式。最常见的ASP指令包括 #include
、 #language
和 #config
等。它们允许开发者在页面顶部设置特定的参数,从而控制页面的特定行为。
4.1.1 代码块嵌入与表达式输出
在ASP页面中, <% %>
标记用于嵌入服务器端脚本代码。开发者可以在这些标记内执行任何有效的VBScript或JScript代码,并通过 Response.Write
方法输出表达式结果。
<% Dim myVar myVar = "Hello, World!" Response.Write("The value of myVar is: " & myVar) %>
在上述代码块中,首先声明了一个名为 myVar
的变量,并将其赋予字符串值”Hello, World!”。然后,通过 Response.Write
方法输出变量的值。这个过程是在服务器端执行的,客户端接收到的HTML源码会包含变量 myVar
的值。
4.1.2 数据绑定技巧与实际操作
数据绑定是指将数据源中的数据绑定到HTML元素的过程。在ASP中,可以使用 <%# %>
标记来实现数据绑定,通常结合ADO对象(ActiveX Data Objects)来动态填充Web页面上的数据。
<!--#include file="connection.asp"--> <% Dim rs Set rs = Server.CreateObject("ADODB.Recordset") sql = "SELECT * FROM Users" rs.Open sql, conn, adOpenStatic, adLockReadOnly Do While Not rs.EOF Response.Write("<p>User: " & rs("UserName") & "</p>") Response.Write("<p>Email: " & rs("UserEmail") & "</p>") rs.MoveNext Loop %>
在这个例子中,首先包含了数据库连接文件 connection.asp
,然后创建了一个Recordset对象 rs
用于执行SQL查询,并打开了一个记录集。之后通过一个循环遍历记录集,并使用 Response.Write
输出每个用户的用户名和电子邮件。
4.2 内置对象的功能与实现
ASP提供了多个内置对象,帮助开发者在不编写额外代码的情况下执行常见的Web开发任务。这些内置对象包括 Request
、 Response
、 Session
、 Application
、 Server
和 Cookies
等。
4.2.1 Cookies对象的应用
Cookies是一种在客户端存储少量信息的机制。在ASP中,可以通过Cookies对象来存储和检索客户端浏览器上的信息。
<% If Request.Cookies("VisitCount") = "" Then Response.Cookies("VisitCount") = 1 Else Response.Cookies("VisitCount") = Request.Cookies("VisitCount") + 1 End If Response.Write("This is your " & Response.Cookies("VisitCount") & " visit to our website.") %>
在这个例子中,代码首先检查名为”VisitCount”的Cookie是否存在。如果不存在,则创建一个新的Cookie并将其值设置为1。如果已经存在,则增加其值。最后,输出用户访问网站的次数。
4.2.2 ServerVariables对象的深入解析
ServerVariables对象用于获取与当前请求相关联的环境变量和服务器特定的信息。这些信息包括客户端IP地址、用户代理字符串、服务器名称等。
<% Dim varName varName = "HTTP_REFERER" Response.Write("The referrer page is: " & ServerVariables(varName)) %>
在上面的代码中,通过 ServerVariables
对象获取了名为”HTTP_REFERER”的环境变量值,它通常用于获取前一个页面的URL地址,这对于分析用户访问路径很有帮助。
ASP指令和内置对象是构建动态Web页面的强大工具。了解如何有效地使用它们,可以显著提高Web应用的性能和用户体验。本章详细介绍了ASP指令的基本用法,以及如何利用内置对象来实现常见的Web开发任务。在下一章节中,我们将进一步探讨ASP在数据库操作和错误处理方面的高级应用。
5. ASP数据库操作与错误处理
数据库操作是ASP应用程序中不可或缺的一部分,它允许开发者从服务器端脚本对数据库进行查询、更新、插入和删除等操作。错误处理则确保应用程序的稳定运行,提供用户体验的连续性。本章节将详细介绍数据库操作的技术细节以及如何有效地处理错误。
5.1 数据库连接与操作
在ASP中,主要使用ActiveX Data Objects (ADO) 来进行数据库操作。ADO提供了一套简单的接口,能够访问诸如SQL Server、Oracle或Access等不同的数据源。下面将详细探讨ADODB对象模型的构建与应用,以及SQL查询的优化与安全实践。
5.1.1 ADODB对象模型的构建与应用
ADODB(ActiveX Data Objects Database)是一个连接和操作数据库的对象集合。它包括了多个对象如Connection、Command、Recordset和Error等,这些对象提供了创建、读取、更新和删除(CRUD)数据库记录的方法。
下面是一个简单的示例代码,展示了如何使用ADODB对象模型来连接到一个数据库并执行一个查询操作:
<% ' 创建ADODB.Connection对象 Set objConn = Server.CreateObject("ADODB.Connection") ' 定义数据库连接字符串 strConn = "Provider=sqloledb;Data Source=服务器名称;Initial Catalog=数据库名称;User Id=用户名;Password=密码;" ' 打开数据库连接 objConn.Open strConn ' 创建*mand对象 Set objCmd = Server.CreateObject("*mand") ' 设置Command对象的属性 objCmd.ActiveConnection = * *mandText = "SELECT * FROM 表名" ' SQL查询语句 *mandType = adCmdText ' 执行查询,返回Recordset对象 Set objRs = objCmd.Execute ' 遍历Recordset Do While Not objRs.EOF ' 输出数据 Response.Write objRs("字段名") & "<br>" objRs.MoveNext Loop ' 清理资源 objRs.Close Set objRs = Nothing objCmd.Close Set objCmd = Nothing objConn.Close Set objConn = Nothing %>
在上述代码中,首先创建了一个ADODB.Connection对象来建立到数据库的连接。之后,通过设置 Connection
对象的 Provider
、 Data Source
、 Initial Catalog
、 User Id
和 Password
等属性定义了连接字符串。 Command
对象用于执行SQL命令,通过 ActiveConnection
属性将其与已打开的连接关联,并通过 CommandText
属性设置要执行的SQL查询语句。执行该命令后, Command
对象返回一个 Recordset
对象,允许我们遍历查询结果。最后,代码通过关闭这些对象以释放资源。
5.1.2 SQL查询优化与安全实践
编写高效的SQL查询对于提高ASP应用程序性能至关重要。优化涉及减少查询执行时间,如使用索引来加速查找,以及优化查询逻辑,例如避免使用SELECT *等。安全实践则涉及防止SQL注入等攻击,确保应用程序不会暴露于恶意攻击之下。
参数化查询 是一种有效的安全实践,它能防止SQL注入攻击。使用参数化查询时,可以使用问号(?)作为占位符,然后通过 Parameters
集合来传递具体的参数值:
' 定义查询命令 strCmdText = "SELECT * FROM 表名 WHERE 字段名 = ?" Set objCmd = Server.CreateObject("*mand") *mandText = * *mandType = adCmdText ' 添加参数 objCmd.Parameters.Append objCmd.CreateParameter("param1", adVariant, adParamInput, 255, "参数值") ' 执行命令 Set objRs = objCmd.Execute
在上述代码中, CreateParameter
方法用于创建一个新的参数对象,其中“255”指定了参数的数据类型(在这个例子中是字符串类型),并将其追加到 Command
对象的 Parameters
集合中。这样,在执行查询时,任何对SQL命令的修改都是通过参数值进行的,而不是直接修改SQL语句,从而减少注入攻击的风险。
5.2 错误处理与调试技巧
5.2.1 常见错误类型与预防措施
ASP应用程序中常见的错误类型包括语法错误、运行时错误和逻辑错误。为了预防这些错误,开发者可以采用以下措施:
- 编写高质量的代码: 遵循编码标准,进行彻底的代码审查和单元测试。
- 使用try-catch块: 封装可能失败的代码部分,以捕获和处理异常。
- 输入验证: 检查并确保输入数据符合预期格式,并处理不符合要求的输入。
5.2.2 调试工具的使用与错误追踪
ASP提供了内置的调试工具,如 Err
对象,可以帮助开发者捕捉和处理错误。 Err
对象包含有关错误的信息,如 Err.Number
和 Err.Description
。在代码中适时检查 Err
对象,可以在发生错误时提供更多的上下文信息。
On Error Resume Next ' 开启错误处理 ' 执行可能发生错误的代码 ' ... If Err.Number <> 0 Then Response.Write("发生错误: " & Err.Description) End If On Error Goto 0 ' 关闭错误处理
在上面的代码段中,通过 On Error Resume Next
指令,如果在后续代码中发生错误,ASP不会中断脚本的执行,而是继续执行下一条语句。 Err.Number
和 Err.Description
用于检索错误代码和描述。如果捕捉到错误,则可以适当地处理它,比如显示错误信息,记录到日志文件中等。最后, On Error Goto 0
指令将错误处理关闭,这是良好编程习惯的一部分。
为了更深入地调试,开发者还可以使用ASP内置的调试工具,如 Response.Write
语句输出调试信息,或者使用Visual InterDev等IDE来逐步跟踪和调试代码。
在本章节中,我们深入探讨了ASP中数据库操作的技术细节以及如何有效地处理错误。通过实例演示了如何利用ADODB对象模型进行数据库连接和查询操作,并分析了SQL查询优化与安全实践。此外,我们还介绍了ASP错误处理的方法和调试技巧,以及如何使用内置调试工具和 Err
对象来追踪和处理应用程序中的错误。
6. ASP高级应用与实例分析
ASP(Active Server Pages)是一种服务器端的脚本环境,用于创建动态交互式网页。本章将探讨ASP与HTML的结合,以及通过实例分析来掌握ASP的实际应用。
6.1 ASP与HTML的完美结合
ASP和HTML结合是Web开发中的一个核心概念,它们相辅相成,使得开发者能够创建功能丰富的动态网页。
6.1.1 动态页面生成技术
动态页面能够根据用户的请求或服务器端的数据变化来生成不同的页面内容。ASP通过服务器端脚本与HTML的结合,实现了这一点。
<!-- HTML部分 -->
<html>
<head>
<title>动态内容示例</title>
</head>
<body>
<h1>欢迎页面</h1>
<p>这是通过ASP生成的动态内容示例。</p>
<%
' ASP部分
Dim currentTime
currentTime = Time()
Response.Write("当前服务器时间为:" & currentTime)
%>
</body>
</html>
在上面的示例中,ASP代码块 <% ... %>
用于输出当前服务器时间,当页面被请求时,该时间会被动态地插入到HTML页面中。
6.1.2 表单数据处理流程与方法
表单是网页中收集用户信息的常见手段,ASP能够处理这些表单数据。
<!-- HTML部分 --> <form action="process_form.asp" method="post"> <label for="name">姓名:</label> <input type="text" id="name" name="name"> <input type="submit" value="提交"> </form>
处理表单数据的ASP页面(process_form.asp)可能如下所示:
<!-- ASP部分 --> <% Dim userName userName = Request.Form("name") Response.Write("您输入的名字是:" & userName) %>
在这个例子中,我们通过 Request.Form
方法获取了表单中名为”name”的输入字段的值。
6.2 实例应用的实战演练
在本小节中,我们将通过构建一个用户登录系统,深入学习ASP的高级应用。
6.2.1 用户登录系统的构建过程
用户登录系统涉及到身份验证、会话管理等关键功能。
<!-- login.asp -->
<html>
<head>
<title>用户登录</title>
</head>
<body>
<h2>用户登录</h2>
<form action="login_process.asp" method="post">
<label for="username">用户名:</label>
<input type="text" id="username" name="username">
<label for="password">密码:</label>
<input type="password" id="password" name="password">
<input type="submit" value="登录">
</form>
</body>
</html>
登录处理页面(login_process.asp)示例如下:
<!-- login_process.asp --> <% Dim username, password username = Request.Form("username") password = Request.Form("password") ' 这里应该有验证用户名和密码的代码,这里仅展示如何获取值。 Response.Write("尝试登录的用户名是:" & username) %>
6.2.2 数据表的动态展示技术
在ASP中,展示数据库中的数据表可以通过Recordset对象来实现。
<!-- show_table.asp --> <% Dim conn, rs Set conn = Server.CreateObject("ADODB.Connection") Set rs = Server.CreateObject("ADODB.Recordset") ' 连接数据库的代码(省略) ' 查询数据库的SQL语句(省略) rs.Open SQL, conn If Not rs.EOF Then Response.Write("<table>") Response.Write("<tr><th>列名1</th><th>列名2</th></tr>") Do While Not rs.EOF Response.Write("<tr>") Response.Write("<td>" & rs("列名1") & "</td>") Response.Write("<td>" & rs("列名2") & "</td>") Response.Write("</tr>") rs.MoveNext Loop Response.Write("</table>") End If rs.Close Set rs = Nothing Set conn = Nothing %>
6.2.3 动态内容生成的案例分析
动态内容生成的一个常见应用是根据用户偏好显示不同的内容。例如,我们可以根据用户的登录状态,动态地展示个性化的欢迎信息。
<!-- welcome.asp --> <% Dim welcomeMessage If Session("logged_in") = True Then welcomeMessage = "欢迎回来," & Session("username") & "!" Else welcomeMessage = "欢迎访问我们的网站。请登录。" End If Response.Write(welcomeMessage) %>
在上述示例中,ASP使用Session对象来判断用户是否登录,并据此显示不同的欢迎信息。
通过本章的实例分析,读者应该能够了解ASP如何与HTML结合,并在Web开发中实现动态内容生成和表单数据处理。这些技巧对于构建功能丰富的Web应用至关重要。在下一章,我们将探讨ASP的安全性及其最佳实践。
本文还有配套的精品资源,点击获取
简介:ASP是微软开发的服务器端脚本环境,用于动态网页内容生成。本教程精选100个实例,全面讲解ASP基础、核心概念和应用,通过实践加深学习。涵盖服务器端脚本、ASP组件、脚本语言、ASP指令、内置对象、数据库连接、错误处理、ASP与HTML结合及具体实例应用等多个方面。学完后,你能独立搭建动态网站,处理用户交互,管理数据,并提高网页功能。
本文还有配套的精品资源,点击获取
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/127052.html