跳转至内容

活动服务器页面/条件语句和循环

来自 Wikibooks,开放世界中的开放书籍
上一页:表达式 索引 下一页:函数和子程序

在本节中,我们将介绍在活动服务器页面中可用的基本程序流程控制语句。这包括条件语句和循环结构。学习完本节后,您应该能够很好地理解如何使用活动服务器页面根据表达式做出决策。您还应该了解如何根据您定义的条件重复一段程序代码。

条件语句用于程序做出决策并确定程序接下来应该做什么。例如,通过将输入的密码与正确的密码进行比较,来判断用户是否输入了网站的正确密码。如果用户通过测试,则将其发送到其帐户管理网页。如果失败,则将其发送回登录屏幕,并显示错误信息“密码无效”。

这种决策在所有编程语言中都很常见。为了编写动态 Web 应用程序,您需要掌握活动服务器页面的这一方面。

另一个重要的概念是循环。循环简单来说就是重复执行相同的代码块多次。由于您遍历代码一次,然后返回到开头并再次重复,因此程序执行的方向看起来像一个循环(或一个圆圈),这就是我们称之为循环的原因。我们将在本章中向您介绍所有可用的循环方法。

程序流程

[编辑 | 编辑源代码]

通常,程序流程从页面的最顶部开始,并一直向下执行,就像阅读书籍一样。所有页面在 ASP 中都是这样执行的,这使得代码非常易于理解,直到您遇到条件语句和循环结构。

由于程序的逻辑流程,因此很容易跟踪程序代码并输出调试信息,以查看脚本在 ASP 解释器处理时正在执行什么操作。通过使用Response.End语句,您可以在脚本中放置断点以在特定点停止执行。稍后将详细讨论此内容。

本节不会介绍的主题是过程和对象方法调用。我们将在后面的章节中讨论这些内容。

条件语句

[编辑 | 编辑源代码]

条件语句是指对表达式进行评估,并根据结果执行一个或多个操作的语句。这允许您检查特定条件,并在满足或不满足条件时采取所需的特定操作。

If-Then 语句

[编辑 | 编辑源代码]

"If-Then" 语句是最基本的条件语句。当放在一行时,此语句表示“如果条件满足,则执行此操作”。例如,我们可以测试某人是否已达到投票年龄:

 If nAge > 18 Then Response.Write "Yes, you can vote!"

您也可以创建包含语句块的If-Then语句。语句块意味着多个语句组合在一起。在这种情况下,只有在条件满足时才会执行整个语句块。我们在此使用缩进以帮助我们阅读代码并确定块的开始和结束位置。

 If nAge > 18 Then
     Response.Write "Yes, you can vote!"
     bCanVote = true
 End If

如您在此程序块中所见,If Then语句定义了程序块的开始,而End If语句定义了程序块的结束。程序块缩进是为了更容易匹配块的开始和结束位置。此程序块中的所有语句只有在满足条件语句(nAge > 18)时才会执行。不满足时,不会执行任何操作。

If-Then-Else

[编辑 | 编辑源代码]

If Then语句很好用,但如果要执行两个不同的操作怎么办?一个操作是在条件满足时执行,另一个操作是在条件不满足时执行。这就是创建If Then Else语句的目的。它基本上表示:“如果条件满足,则执行此操作,否则执行此操作”。

 If nAge > 18 Then bCanVote = true Else bCanVote = False

从上面的示例可以看出,您可以将整个If Then Else语句放在一行中。在许多情况下,您可能希望避免这种情况,因为它往往会使行变得非常长。相反,您可能希望使用如下所示的程序块形式

 If nAge > 18 Then
     Response.Write "Yes, you can vote!"
     bCanVote = true
 Else
     Response.Write "No, you can not vote."
     bCanVote = false
 End If

在这种情况下,只会执行两个程序块中的一个。第一个在条件满足时执行。第二个在条件不满足时执行。因此,您可以将If Then Else语句理解为“一个或另一个,但不是两者”。

尽管我们在上面显示的程序块中使用了多个语句,但您也可以在每个程序块中放入单个语句。出于调试目的,您甚至可以在程序块中根本不包含任何语句。这允许您注释掉程序块中的所有语句,并且您的脚本仍然可以正常运行。

您会注意到,在If Then语句的条件表达式中,我们不必用括号“(”和“)”括起来条件。您可以始终使用括号将表达式组合在一起,但它们不需要括起来条件语句。

Select Case

[编辑 | 编辑源代码]

如果只是评估“真”或“假”条件,If Then语句就非常棒。但是,如果要评估布尔值以外的表达式并根据结果采取某些操作,则需要其他机制。这就是 ASP 语言包含Select Case语句的原因。这允许您基本上从多个案例列表中“选择”要执行的操作。

Select Case的案例都是文字原始值。您必须具有“完全匹配”才能匹配“案例”。您可以包含多个要匹配的值,但不能定义要匹配的值范围,也不能定义要匹配的模式。

 Select Case nAge
     Case 15, 16
         Response.Write "You are almost old enough to vote"
     Case 17
         Response.Write "You might want to register to vote"
     Case 18 
         Response.Write "Yes, you can vote!"
     Case Default
         Response.Write "Catch-all for all other ages"
 End Select

此选择语句有点误导,因为它只会告诉您,如果年龄是 18 岁且只有 18 岁,则可以投票。如果年龄大于 18 岁,则不会匹配任何特定案例。相反,当年龄大于 18 岁时,将执行可选的万能案例(Case Default)。

当然,如果您不需要Case Default,则无需包含它。通过将其省略,您基本上是在说“如果找不到案例的精确匹配,则不执行任何操作”。

只要Select Case表达式计算结果为原始类型,您就可以使用任何表达式。您不能使用对象表达式,因为不存在可以与之比较的对象文字。但是,您可以调用返回原始类型的方法,并将其用作表达式。

在上面显示的示例中,您可以看到我们正在使用回车符将Case与要执行的块隔开。无需终止此类型的程序块。它由下一个案例的实例或End Select终止。您还可以通过使用冒号(:)作为语句分隔符将案例和要执行的操作放在同一行

 Select Case nAge
     Case 15, 16 : Response.Write "You are almost old enough to vote"
     Case 17 : Response.Write "You might want to register to vote"
     Case 18 : Response.Write "Yes, you can vote!"
     Case Default : Response.Write "Catch-all for all other ages"
 End Select

循环结构

[编辑 | 编辑源代码]

循环结构用于重复执行相同的步骤。使用循环可能有许多原因。在数据库驱动的 Web 应用程序中,您通常会使用循环来迭代记录集中返回的每个记录。

For Next 循环

[编辑 | 编辑源代码]

“for next”循环允许你使用增量计数器重复一段代码。计数器在循环开始时初始化,并在循环结束时递增。在每次重复开始时,都会检查计数器是否已超过结束值。这最好用一个例子来解释。

 For I = 1 To 10
     Response.Write "I = " & I & "<br>"
 Next

在这个例子中,我们创建了一个重复10次的循环。我们知道它正好执行十次,因为你可以将语句理解为“对于从1到10的每个整数,执行此操作”。

变量“I”被初始化为1,程序块(缩进)的第一次重复被执行。输出将是“I = 1”。不用担心“<br>”部分,这只是HTML代码,用于在网页上创建换行符。

第二次循环时,计数器(I)递增并取值为2。所以这个块输出的第二行是“I = 2”。这个过程会重复,I每次递增1,直到计数器超过结束值。所以在这种情况下,最后打印的行将是“I = 10”。

在一个更高级的例子中,我们可以改变索引递增的方式。如果我们希望计数器每次递增2,我们将这样编写For Next循环。

 For I = 1 To 10 Step 2
     Response.Write "I = " & I & "&lt;br&gt;"
 Next

这段代码的输出将是

 I = 1
 I = 3
 I = 5
 I = 7
 I = 9

这次我们只得到了循环输出的五个值。这是因为我们使计数器每次递增2而不是1(默认值)。注意,我们不必以结束值(10)结束。在将计数器从9递增到11之后,循环检查我们是否已超过结束值(10)并退出循环。

你也可以像这样倒着计数

 For I = 10 To 1 Step -1
     Response.Write "I = " & I & "&lt;br&gt;"
 Next

当然,你可以用表达式和变量来替换起始值、结束值,甚至循环的“步长”

 For I = nX + nY To YourFunc(nZ) Step nStep
     Response.Write "I = " & I & "&lt;br&gt;"
 Next

另一个循环结构是Do While循环,只要条件满足,它就会重复一段程序代码。这有点像If Then条件语句,因为它期望一个布尔表达式。以下是它的样子

 I = 1
 bFound = False
 Do While I < 10
     Response.Write "I = " & I & "&lt;br&gt;"
     I = I + 1
 Loop

这里我们有一个循环,它与上一节中显示的For Next示例执行完全相同的事情。为什么你要使用这种结构而不是“for next”?当不容易确定需要执行多少次循环时,问题就变得很明显了。

 X = 239821.33
 Do While X > 1
     Response.Write "X = " & X & "&lt;br&gt;"
     X = X / 2
 Loop

在这种情况下,我们不知道必须将X的值除以2多少次才能得到小于或等于1的值。所以我们只需使用Do While循环来处理我们的逻辑。

Do UntilDo While循环结构几乎相同。它的工作原理完全相同,只是它重复程序块直到条件评估为“true”。你基本上可以通过用Not (expr)括起你的表达式来用“Do While”做同样的事情,但是ASP的创建者意识到使用这个更符合逻辑的语句会使代码更简洁。

 X = 239821.33
 Do Until X <= 1
     Response.Write "X = " & X & "&lt;br&gt;"
     X = X / 2
 Loop

这里,我们创建了一个循环,它与我们的“do while”执行完全相同的事情。我们只是反转了条件语句的逻辑并更改了关键字为Do Until。在这种情况下,它并没有使代码更易于阅读。但正如我们稍后将看到的,在某些情况下,你确实需要使用Do Until

While循环的工作原理与Do While完全相同,只是它的结构稍微短一些。请阅读“Do While”部分以了解此循环结构的工作原理。

 X = 239821.33
 While X > 1
     Response.Write "X = " & X & "&lt;br&gt;"
     X = X / 2
 Wend

与“Do”循环不同,While循环程序块以Wend语句结束。

Active Server Pages 有许多不同的控制流语句来处理ASP页面执行。条件语句有:If ThenIf Then ElseSelect Case。循环结构有For NextDo WhileDo UntilWhile。ASP中的条件表达式不需要用括号(“(”和“)”)括起来。

For Next循环操作一个计数器,并重复程序块直到计数器超过结束值。Do WhileDo UntilWhile循环根据布尔表达式的评估结果重复(意味着表达式结果为“true”或“false”)。

复习题

[编辑 | 编辑源代码]
  • ASP中有哪些类型的条件语句?
  • ASP中有哪些类型的循环结构?
  • For Next循环的三个参数是什么?
  • 如何使用For Next循环倒着计数?
  • 使用哪个循环重复直到满足条件?
  • 使用哪个循环重复当满足条件时?
  • 如何终止Do While循环的程序块?
  • 如何终止While循环的程序块?
  • 创建一个For Next循环,输出从10到100且能被10整除的整数。
上一页:表达式 索引 下一页:函数和子程序
华夏公益教科书