Microsoft Visual InterDev Tutorial

Web based School

Chapter 11

Extending Your Application Through Active Server Script

A key design goal of Visual InterDev is to provide a tool that facilitates the construction of dynamic, Web-based applications. Visual InterDev accomplishes this objective through the use of Active Server Pages.

During the last few Chapters, you have learned about server side topics such as integrating a database into your application. This lesson continues with that theme and introduces you to another component that resides on the server: Active Server Pages. Active Server Pages enable you to combine HTML and script code on the server to build dynamic and highly interactive web pages. On Chapter 7, "Extending Your Web Page Through Client-Side Script," you learned about the use of scripting languages within the context of the browser on the client machine. For toChapter's lesson, you will learn how to apply the power of script code on the server.

First, you receive a brief introduction to making the server an active part of your Web-based application. Next, you will discover what makes Active Server Pages so dynamic and powerful. The lesson provides a closer look at the client-server picture. In exploring the conceptual architecture for a Web-based application, the lesson explains how Active Server Pages fit into the big picture, helping you understand how to use Active Server Pages within the scope of your application. At the end of the Chapter, you will create your first Active Server Page.

Throughout the Chapter, I will provide examples of Active Server Pages and dissect the meaning of the code. You learned during the first week that Active Server Pages support the use of scripting languages such as VBScript and JScript. VBScript code examples are used throughout the lesson. The principles that you will learn, though, apply to either scripting language.

Making the Server Come Alive

The Web has been transformed into a place of interaction. Users don't just want to browse a web page; they want to experience a web site. Using the server to provide this exciting experience for your users is a very important concept to master. Active Server Pages enable you to easily integrate server-side logic into your application. You may have used CGI or APIs in the past to provide this logic. With both of these methods, you have to create an executable program on the server that involves a development process different from your web page development.

Active Server Pages add an intriguing alternative to your choices for server-side development. You can design and develop Active Server Pages in a way similar to the process that you use for your web page development. Active Server Pages consist of HTML and script that reside on the server. The same popular scripting languages that you use on the client, including VBScript and JScript, are supported by Active Server Pages. The main benefit is that you can leverage the investment you make learning HTML and a scripting language on the client to your development for the server.

What Makes Active Server Pages So Dynamic?

Active Server Pages can be used as the main hub to control your server activity. You can code application-specific logic directly into an Active Server Page. This logic could be HTML as well as script code that changes the format of your web pages.

Within an Active Server Page you also can include ActiveX and Design-time ActiveX controls that are built specifically to execute on the server. Active Server Pages can be integrated with Active Server Components to provide robust application processing on the server. For example, you could build an Active Server Component with Visual Basic or Visual C++ that processes financial data and then returns the results through the Active Server Page. You also can place your database connections in Active Server Pages.

The development paradigm for Active Server Pages differs slightly from programming script on the client. If you remember from the lesson on client-side script during the first week, the script that you develop for the client is embedded within the web page that is sent to the brow-ser. This script is then executed by the browser based on system and user events. The browser must support the use of the particular scripting language to execute the code. If the browser doesn't recognize the script language, it will ignore the code. With Active Server Pages, all of the script is processed on the server by the ActiveX Server scripting engine. The results are returned to the client in a standard HTML format that is universally recognized by the browser.

Taking a Closer Look at the Process

This section explores how a browser interacts with an Active Server Page. First, the web page references an Active Server Page (ASP) within the context of the application. Active Server Pages contain the file name extension of .asp. The following line of code demonstrates an example of calling an Active Server Page:

<FORM METHOD= "POST" ACTION="ProcessForm.asp">

When the browser requests the ASP, the file is first processed by the server. The ASP may contain both HTML and scripting code. Any HTML code is passed directly to the browser as well as any client-side script. The server then searches for any server-side script. Similar to script on the client, server-side script is denoted by the symbols <% and %>. Upon locating the server-side code, the server processes the script and returns the results to the browser in the form of HTML. The server processes the script based on the current conditions and events. This model gives your application its unique and dynamic nature. The web page that is formatted is based on conditions that are dynamic and changing, instead of a static HTML file that resides on the server. These conditions could be based on user input as well as information that is contained in a database.

Exploring the Client-Server Picture

Active Server Pages are an important part of your application. You can use Active Server Pages to create more intelligent server processing that handles the needs of your application. Active Server Pages are a central figure in the client-server model for your application. Figure 11.1 demonstrates the role of an Active Server Page in the overall scheme of your application.

Figure 11.1.

Playing an active part of the client-server picture.

As you can see, Active Server Pages reside on the web server and play an active part in the functionality of your application. Active Server Pages are based on the ActiveX Server scripting engine first introduced with Internet Information Server 3.0. First, you can return dynamic web pages to the client based on the preferences entered by the user. The ASP also can interface through the Component Object Model (COM) with Active Server Components. These components are applications that you develop using a more robust language such as Visual Basic or Visual C++. These components are compiled as executable (EXE) or dynamic link library (DLL) programs that handle the detailed processing of the application. You learn more about working with and developing these components on Chapter 17, "Using Active Server Components to Create Multitier Applications."

In Figure 11.1, you should also notice the database component of the application. You can use Active Server Pages to directly interface with the database. The other alternative is to use an Active Server Component that is called from an ASP to handle the database processing. For database-intensive processes and transaction processing, you will probably want to use the power of a language like Visual Basic or Visual C++ for these activities.

Understanding Active Server Pages

Active Server Pages can contain both script and HTML. Visual InterDev supports the use of VBScript, JScript, JavaScript, and LiveScript. The scripting engines for VBScript and JScript are included with Visual InterDev. You can choose the scripting language by selecting the Tools menu and choosing Options from the list of menu items. The Options dialog window displays, enabling you to specify a default scripting language for your Active Server Pages. Figure 11.2 depicts the Options dialog window.

Figure 11.2.

Choosing a default scripting language.

Once you specify a default scripting language, the chosen language is used when you create new Active Server Pages. Visual InterDev formats a line of your ASP to denote the type of scripting language that is being used, similar to the way that client-side script is recognized in an HTML file. The following code example demonstrates an ASP that uses VBScript for the scripting language:

<%@LANGUAGE="VBSCRIPT"%>

You can include both client- and server-side script in an Active Server Page. The client-side script is passed to the client along with the HTML and executes within the context of the browser. The HTML also may contain references to intrinsic controls as well as ActiveX controls.

The Active Server Page Object Model

Active Server Pages use a robust object model that enables you to develop the correct logic to handle your application needs. This object model resembles object models that are used in Visual Basic. The following list outlines the five basic objects that are available in an ASP:

1. Request object

2. Response object

3
. Session object

4. Application object

5. Server object

Each of these objects is covered in detail in the following sections.

The Request Object

The Request object enables you to obtain information from a user. This object is useful when you're trying to discover preferences specified by the user. Also, you can use this object to retrieve information that is entered on a form. A Guest guide is a good example where the user enters information into an initial form that is then later used by the application.

The Request object consists of five collections. The concept of collections was first mentioned on Chapter 8, "Communicating with a Database." A collection is a set of related objects that are accessed using the same method. An object uses a collection to access variables that define certain attributes and characteristics about the object. Table 11.1 lists the types of Request collections and their purposes.

Table 11.1. The Request collections.

Collection Purpose
ClientCertificate Retrieves certification fields from the browser request
Cookies Retrieves the value of cookies in the request
Form Retrieves the values of a form using POST command
QueryString Retrieves the values of a query string
ServerVariables Retrieves the value of environment variables

You can access the information contained in a collection using the following syntax:

Request.CollectionName("variable name")

CollectionName is the name of the collection and variable name is the name of the collec-tion variable containing the desired information. You can use the following method as an alternative:

Request.("variable name")


NOTE: If you use the alternate method, you must ensure that different collections contain unique variable names. You should explicitly use the collection name method to access a variable if you have collection variables with the same name.

As indicated previously, the Request object can be used to get information from the user. The following sections demonstrate how to use this object to accomplish this task.

Using the Cookies Collection

You have probably used cookies in developing previous Web-based applications. A cookie represents information about the user session that is stored on a client machine. You can use cookies to maintain information about the user across the scope of your application. A cookie can be sent by the browser to the server or from the server to the client machine. You can use Active Server Pages to both populate and retrieve values for your cookies. The syntax for the Cookies collection is as follows:

Request.Cookies(cookie)[(key)].attribute]

cookie specifies the value of the cookie to be retrieved, key indicates an optional parameter that is used to retrieve sub key values of the cookie, and attribute contains information about the cookie. The attribute parameter can be used to determine if a cookie contains multiple key values as in the following code example:

<%Request.Cookies("MyCookie").HasKeys%>

If MyCookie contains multiple key values, the preceding code statement returns a value of True. A value of False is returned if the cookie only contains a single value.

The following code sample shows how to retrieve the value of a cookie named User that contains only one value of Male:

<%Request.Cookies("User")%>

If the HTTP request from the browser contains multiple key values for the User cookie, as in

Gender=Male&Age=30

then the code to return the value of this cookie is

<%Request.Cookies("User")("Age")%>

This code statement returns the value of 30. As you can see from the examples, key values are used to contain type and subtype information about the user.

The Cookies collection can be used as an alternate method to store information about the user. This method is sometimes disputed, because information about the user is being stored on the local machine and distributed to the server without the user's knowledge. You should be careful not to store sensitive information within a cookie to ensure the security of your application and your users.

Using the Form Collection

The Form collection contains the values of a form that are submitted via the POST method. The syntax for using the Form collection is

Request.Form(parameter)[(index)].Count]

where parameter is the name of the form element that contains a value. The optional index attribute enables you to access the specific value of a parameter that can contain multiple values. The Count attribute denotes the number of possible values for a parameter in the form. The value of the index can be an integer between one and the value of the Count attribute.

The following examples exhibit how you can use the Form collection in an ASP file to retrieve information from the user. Both examples use HTML forms as the basic user interface. You may already be familiar with working with HTML forms. You learn about developing HTML forms during tomorrow's lesson (Chapter 12, "Using Basic and Advanced HTML Form Controls"). It isn't important to understand the development of the form for purposes of these examples. For now, focus on the logic contained in the ASP and how the ASP is used to process the needs of the application.

The first example involves a basic HTML form that retrieves the user name and favorite type of coffee drink. Figure 11.3 illustrates the layout of this form.

The HTML form in this example contains a text field for the user name, along with a drop-down listbox that contains a list of choices of different coffee drinks. The form also contains a Submit button for the user to click the preferences have been entered. When the users enter their preferences and press the Submit button, the form is submitted to the Active Server Page. Listing 11.1 displays the code for the HTML file that contains the layout of the form.

Figure 11.3.

Retrieving the user preferences.

Listing 11.1. User Preferences Form.

<HTML>
<HEAD>
<TITLE>User Preferences Form</TITLE>
<H2>Please enter your preferences in the form below: </H2>
</HEAD>
<BODY>
<form action="/ASProject/scripts/submit.asp" method="post">
<p>Your first name: <input name="firstname" size=48>
<p>What is your favorite coffee drink: <select name="drink">
<option>Cappuccino <option>Espresso <option>Latte <option>Mocha
</select>
<p><input type=submit>
</form>
</BODY>
</HTML>

As you can see from Listing 11.1, an ASP file is referenced in the form action line. Those of you familiar with CGI scripts should notice that this line is different from the typical way you have processed your forms in the past. You're probably used to specifying a CGI script in this line of code. This method is a basic difference with Active Server Pages. The ASP file is used to process the form instead of the CGI script. The Submit.asp file retrieves the information that is entered and displays the preferences in a new page to the user with a welcome message. Listing 11.2 shows the code for the Submit ASP.

Listing 11.2. Processing the users preference.

Welcome, <%= Request.Form("firstname")%>.

Your favorite coffee drink is <%= Request.Form("drink")%>!

This ASP shows how you can combine HTML with script code to construct a dynamic web page. The Form collection is used to obtain the firstname as well as the drink parameter. Figure 11.4 demonstrates a sample user entry.

Figure 11.4.

Entering the user preference.

Based on the user preference entered above, Figure 11.5 depicts how the new page will be formatted by the Submit ASP.

In this example, the ASP used the Form collection to process the user preference and create a new web page based on these values. You may have a need to send results back to the same form that submitted the user preference. For example, you may need to confirm that the user entered a valid character in a field before the value can be stored in the database. If the form parameter value is incorrect, the server needs to send the message to the user within the context of the user form, so that the user can correct the mistake on that form.

Figure 11.5.

Displaying the user's preference.

The other alternative is to send a message to the user on a new page indicating that a field was incorrect on the form. The user would then have to navigate to the form and correct the field. The better alternative is to develop an ASP that both creates and processes a form to handle this case and present the message within the proper context of your application.

The following example illustrates the use of an ASP to create this dynamic form. Figure 11.6 shows a sample form to obtain a user name and e-mail address.

Figure 11.6.

Entering an e-mail address.

This form is constructed using the ASP file that is shown in Listing 11.3.

Listing 11.3. Creating a dynamic web page.

<HTML>
<!-- This is GetEmail.asp -->
<%
If IsEmpty(Request("Email")) Then
Msg = "Please enter your email address."
ElseIf InStr(Request("Email"), "@") = 0 Then
Msg = "Please enter an email address" & _
" in the form username@location."
Else
Msg = "This script could process the " & _
"valid Email address now."
End If
%><FORM METHOD="POST" ACTION="GetEmail.asp">
<PRE>
<p>Name: <input name="firstname" size=48 VALUE= "
<%=Request("firstname")
%>">
<p>Email: <INPUT TYPE="TEXT" NAME="Email" SIZE=30 VALUE= "
<%= Request("Email")
%>">
<%= Msg %><P>
<INPUT TYPE="SUBMIT" VALUE="Submit">
</PRE>
</FORM>
</HTML>

This code listing demonstrates the effective combination of HTML and script to construct a dynamic web page. Also, this example shows how you can properly handle the needs of your application. You learned earlier toChapter that HTML contained in an ASP file is initially sent to the browser. The HTML form contained in the GetEmail.asp file is, therefore, created first. After the user submits the information, the ASP script processes the form using the Request object and Form collection. The e-mail field is validated to ensure that an @ sign was included in the e-mail address. If this character isn't in the e-mail address, the ASP sends an error message and the original form to the browser, so that the user can correct the mistake. Figure 11.7 shows the page that is formatted by the ASP.

Figure 11.7.

Displaying the form and a message.

As you can see, this method provides an effective way to process user input. The Form col-lection is an invaluable tool for handling the values of the form.

Using the Server

Variables Collection

You can use the ServerVariables collection to retrieve environment variables that pertain to the browser request. The syntax for this collection is

Request.ServerVariables(variable)

where variable references the name of the server environment variable to retrieve. NOTE: There are many variables that exist for the ServerVariables collection. It is beyond the scope of this lesson to exhaustively cover each of the variables that you can access. Refer to the Visual InterDev documentation for a comprehensive list and description of each of the possible variables for the ServerVariables collection.

I am going to cover two of the more useful variables for the ServerVariables collection in the following section. These examples should provide you with a good idea of how to use other ServerVariables for your application needs.

Two of the more useful server variables that you can access with this collection include the REQUEST_METHOD and the SERVER_NAME. The REQUEST_METHOD variable indicates the method with which a page has been requested. The following example demonstrates how to capture the value of the REQUEST_METHOD server variable:

RequestMethod = Request.ServerVariables("REQUEST_METHOD")

The value of this variable will be POST when the page has been referenced by another form and GET when the user has specifically requested the form.

In the previous section, you learned about the use of Active Server Pages to process HTML forms. The ACTION parameter was formatted with a value of POST when the user submitted the form. If the page is called by any other method, the REQUEST_METHOD value is equal to GET. You can use this variable to provide validation for the page based on the access method. For the form example, if a user refreshes an Active Server Page or enters the URL directly without completing the user preferences form, the page may not contain the proper values to dynamically format the page. For both of these requests, the REQUEST_METHOD is equal to the value of GET. You can add validation logic to confirm the access method for the page and then process the page based on this value. Listing 11.4 displays sample validation logic for the user preferences form.

Listing 11.4. Verifying the request method for a page.

<HTML>
<HEAD>
<TITLE>Your Personal Preferences </TITLE>
</HEAD>
<BODY>
<%
DIM RequestMethod
` Captures the request method for the page
RequestMethod = Request.ServerVariables("REQUEST_METHOD")
` Validate the value of the request method
If RequestMethod = "GET" then
` The user has refreshed the ASP - Display error message
%>
<P>You have chosen to refresh this page. If you want to change the value of
your preferences to display on this page, go back to the User Preferences form
and enter your choices. After you change your preferences and click Submit,
this page will display the results of your new preferences.
<%
Else
%>
Welcome, <%= Request.Form("firstname")%>.
Your favorite coffee drink is <%= Request.Form("drink")%>
<%
End If
%>
</BODY>
</HTML>

In the code listing, the script uses an If...Then...Else statement to determine the value of the REQUEST_METHOD. Based on the value of this variable, the appropriate code block is executed. Within an ASP, you will see a combination of HTML and script. Many times, the HTML and script will be intermingled, as shown in Listing 11.4. This coding standard is different from the method that you learned concerning client-side script. With client-side script, the recommendation is to use a strict split between the HTML and script code. The dynamic nature of Active Server Pages dictates that a combination coding convention be used instead of a strict split between HTML and script. Figure 11.8 demonstrates what happens when a user refreshes an Active Server Page using the new validation logic.

Figure 11.8.

Displaying an error message.

The SERVER_NAME is another server variable that can be used to provide valuable information to your application. The SERVER_NAME variable contains the server's host name, DNS alias, or IP address that is used in self-referencing URL addresses. This variable can be used to format a URL link to another page in your application. The following code sample demonstrates the use of this variable:

<A HREF = "http://<%= Request.ServerVariables("SERVER_NAME") %>

/ASProject/scripts/MyPage.asp">Link to MyPage.asp</A>

In this example, the ServerVariables collection is used to retrieve the value of the host server name. This value is used to format the prefix of the URL link to an Active Server Page. Figure 11.9 illustrates the results of executing this code sample.

Figure 11.9.

Creating a dynamic link.

Using the QueryString Collection

The QueryString collection enables you to access the values of the variables in an HTTP query string. These values are located after the question mark in an HTTP request. The QueryString collection provides an easy method to access the value of these variables, because you can reference the variables by name. The syntax for the QueryString collection is as follows:

Request.QueryString(variable)[(index)].Count

variable is the name of the desired variable in the HTTP query string and index is an optional parameter that enables you to retrieve the value of a variable that contains multiple values. The index can contain an integer between one and the value of the Count attribute.

Take a look at the User Preferences Form again. You could use an ASP that contains the QueryString collection to process the user input. Listing 11.5 demonstrates an example of using the QueryString to display the name and coffee drink preference for a particular user.

Listing 11.5. Using the QueryString collection to process the users preference.

Welcome, <%= Request.QueryString("firstname")%>.

Your favorite coffee drink is <%= Request.QueryString("drink")%>

Figure 11.10 displays the page that is produced from the ASP code.

Figure 11.10.

The results of the QueryString.

For variables that contain multiple values, the QueryString collection creates a new collection instance with the number of values that are passed to the ASP. For example, if the User Preferences form is changed to allow multiple names to be passed to the server, the QueryString creates a new collection instance called firstname. If three names are passed to the ASP, firstname contains three values. The index attribute can be used to reference each value within the firstname variable. The following example illustrates how the firstname values would be accessed by the QueryString. For the sake of example, suppose that the following values are passed to the ASP from a client request:

/scripts/submit.asp?firstname=Mike&firstname=Matt&firstname=Chris

The following QueryString statements

Request.QueryString("firstname")(1)

Request.QueryString("firstname")(2)

Request.QueryString("firstname")(3)

would produce the values of

Mike

Matt

Chris

respectively. The Count attribute would be three for the firstname collection instance. You also could reference the firstname collection using the following statement:

Request.QueryString("firstname")

This statement would produce a comma-delimited value of

Mike,Matt,Chris

The QueryString can be used with forms that use both the GET and POST action commands. If you use the QueryString collection with a form that uses GET, the collection will contain all of the information contained on the form. If the ASP is requested using the POST statement, the QueryString collection will contain all of the information that is passed as a parameter to the ASP.

The Response Object

You can use the Response object to send information to the user. You can format HTML to be sent to the client as well as manipulate state and session information. Some examples include redirecting the user to another URL address and formatting the value of a cookie on the server. The Response object supplies several properties and methods needed to accomplish these tasks. A property defines characteristics about the object that it represents, and a method indicates an action that the object can execute. Properties and methods are thoroughly explored during the lessons on Chapter 13, "Interacting with Objects and ActiveX Controls," and Chapter 15, "Integrating Objects into Your Applications."

The Cookies collection is the single collection of the Response object. You can use this collection to set the values of cookies. Table 11.2 defines the properties that are available for the Response object.

Table 11.2. The Response properties.

Property Description
Buffer Indicates whether the page is buffered
ContentType Defines the content type for the response
Expires Indicates the length of time before the expiration of a page that has been cached by the browser
ExpiresAbsolute Indicates date and time of the expiration of a page that has been cached by the browser
Status Indicates the status line value returned by the server

These properties can be used with the Response object methods to send the proper in-formation to the user. Table 11.3 lists the methods that are available for the Response object.

Table 11.3. The Response methods.

Method Description
AddHeader Defines a name for the HTML header
AppendToLog Adds a string of text to the web server log
BinaryWrite Writes the output to the HTTP response without converting the characters
Clear Erases all HTML output that has been buffered
End Terminates ASP processing and returns the result
Flush Sends buffered output immediately to the client
Redirect Redirects the user to another URL address
Write Writes the output to the HTTP response as a string

The next few sections explore some of the more powerful properties and methods of the Response object that you can use to enhance the functionality of your Active Server Pages.

Using the Cookies Collection

The Cookies collection for the Response object provides a way to set the value of a cookie on the server. You can create new cookies as well as change the value of existing cookies. The syntax for using the Cookies collection for the Response object is similar to the format that you used for the Request object. To use the Cookies collection for the Response object, type the following:

Response.Cookies(cookie)[(key).attribute] = value

cookie is the name of the cookie. The key is an optional parameter used to define a cookie that contains multiple key values. The attribute parameter describes information about the cookie. The value parameter can be used to set the values of the key and attribute parameters. You also can use the HasKeys attribute to determine if the cookie contains key values. Table 11.4 provides a complete listing of the attributes for the Cookies collection.

Table 11.4. The Cookies collection attributes.

Attribute Description
HasKeys Determines if the cookie contains key values
Expires Indicates expiration date for the cookie
Domain Defines the domain for which cookies are distributed
Path Defines the path for which cookies are distributed
Secure Indicates whether the cookie is secure

You can update the value for all of the attributes of the Cookies collection except HasKeys, which is read-only. The HasKeys attribute evaluates to a value of True to indicate that the cookie contains key values or False to specify that the cookie does not contain key values.

Listing 11.6 demonstrates several methods for populating the value of cookies.

Listing 11.6. Setting the value of cookies.

<%

`Sets the value of cookie

Response.Cookies("Name") = "Mike"

`Sets the value of cookie with key values

Response.Cookies("MyCookie")("FirstName") = "Mike"

Response.Cookies("MyCookie")("LastName") = "Van Hoozer"

`Changes the cookie to a non-key value cookie and sets the new value

Response.Cookies("MyCookie") = "Mike"

`Sets the value of a cookie and its attributes

Response.Cookies("StdCookie") = "User"

Response.Cookies("StdCookie").Expires = "December 31, 1997"

Response.Cookies("StdCookie").Domain = "mydomain.com"

Response.Cookies("StdCookie").Path = "/www/home/"

Response.Cookies("StdCookie").Secure = "TRUE"

%>

The code example in Listing 11.6 sets the value of the Name cookie to Mike. The next example creates a cookie called MyCookie and sets the key values of FirstName and LastName. The third code example demonstrates how you can change the type for the cookie as well as its value. This example changes MyCookie to a non-key value cookie. The values that were previously stored in this cookie are discarded, and the new value of Mike is assigned to MyCookie. The final code example shows how to set both the value of a cookie as well as its attributes.

Using the Buffer Property to Process Your Script

You were introduced to the properties of the Response object. The properties help describe the characteristics for an object. The basic syntax to reference a Response object property is

Response.PropertyName

PropertyName is the name of the property.

The Buffer property defines whether the page results are buffered. You can use the Buffer property to process all of the script code in your ASP before the results are sent to the client. The syntax for the Buffer property is as follows:

Response.Buffer = flag

flag contains the value of True or False to indicate whether or not to buffer the page output. If you set the value of the flag parameter to True, the page output is buffered, and the script code is processed before distributing the results to the browser. The default value for the flag parameter is False.

You cannot set the value of the Buffer property if your ASP has previously sent output to the client. If you are going to process your script before sending the results to the client, you should assign the value of the Buffer property in the first line of your ASP to prevent this situation from happening.

There are two methods that can be used to halt the processing of the script code in your ASP. You can use either the Flush or the End method to stop the script processing and send the results to the client. The syntax for these two methods is

Response.Flush

and

Response.End

You should balance the need to process your script versus the length of time that it takes to process your script. For long scripts, you may want to send intermediate results to the user while your script continues to process. In these situations, you won't want to set the value of the Buffer property to True.

Using the Write Method to Send Output to the User

You can use the Write method to format a string of text to send to the user. The syntax for the Write method is

Response.Write variant

variant represents the data to be written. The variant parameter can contain any value that is supported by the VBScript variant data type, including characters, strings, and integers.

The Write method is commonly used to format HTML to be sent to the client browser. The following code example shows how to use the Write method to format the User Preferences Form:

Welcome, <% Response.Write Request.Form("firstname")%>.

Your favorite coffee drink is <% Response.Write Request.Form("drink")%>

Notice that this example differs from the previous ASP code that was used to format the User Preferences Form. Instead of using the = Request.Form statement, the equal sign is replaced by the Response.Write method. Figure 11.11 displays the results of using the Write method.

Figure 11.11.

Using the Write method to format the page.

You also could use the Write method to create a dynamic header for your web page, based on the user ID that is entered. For new users, you could display an initial greeting that is different from the greeting for return visitors to your site. Listing 11.7 demonstrates the use of the Write method in an Active Server Page to create this type of greeting.

Listing 11.7. Creating a dynamic greeting.

<%

If NewUser Then

Response.Write "<H3 ALIGN=CENTER>Welcome to the Overview Page</H3>"

Else

Response.Write "<H3 ALIGN=CENTER>Welcome Back to the Overview Page</H3>"

End If

%>

In this code listing, the NewUser variable is used to designate whether the ID represents a new or existing user. If NewUser is True, the initial welcome message is displayed. If this user is a return visitor, the welcome back message is displayed. Notice that the text is formatted using the header HTML tags. You could use this code with a procedure that verifies user IDs against those IDs stored in your database.

Using the Redirect Method

The Redirect method can be used to redirect the user to another URL address. The syntax for using the Redirect method is as follows:

Response.Redirect URL

URL is the URL address location to redirect the browser.


NOTE: You cannot use this method from an ASP if results have already been distributed to the client.

This method is helpful for ensuring that users follow a specific path when using your application. For example, an order entry application may require that a user enter basic order header information like name and address before selecting the items that will be ordered. If a user attempts to access the order detail page to order an item, you can use the following code sample in Listing 11.9 to redirect them to the initial page of your application.

Listing 11.9. Guiding the users path.

<%

If NOT Session("OrderHeaderPage") Then

Response.Redirect "OrderHeader.asp"

End If

%>

This code example uses the Session object, which will be covered in a later section. You can use this object to store variables for a user session. In this example, a variable is used to verify that the user has entered the application from the Order Header page. If this variable isn't true, the browser will be redirected to the ASP to process the Order Header page.

Specifying the Type of Content

You can use the ContentType property to designate the type of content that is located in the response for the page. The syntax for this property is

Response.ContentType = content type

content type represents the type of content for the page. This value is a string that conforms to the MIME standards for a web page. The content type defines the type and subtype of information that's contained in the response that is sent to the client. The type describes the general category of the information, while the subtype specifically defines the content type. The default value for the ContentType property is "text/HTML". This value defines the content type for a response as text and the content subtype as HTML. The following code samples demonstrate how to use this property:

Response.ContentType = "text/HTML"

Response.ContentType = "image/GIF"

Response.ContentType = "text/plain"

The Session Object

You can use the Session object to store and retrieve information during a specific session for a user. The information contained in the Session object persists for the entire time that the user interacts with your application. You can use and access this information across the web pages in your application.

A Session object is automatically created by the web server when a user accesses a web page in your application. The user session persists until the user leaves the application, the session times out, or the session is explicitly abandoned. To access the Session properties, the syntax for referencing the Session object is

Session.property

and it is

Session.method

to access the Session methods. The Session object consists of two defined properties and one defined method.

The SessionID property returns the Session ID for a user. The web server creates a unique identifier as it creates each user session. The value of this identifier is a LONG data type. The syntax to reference the SessionID property is

Session.SessionID


NOTE: The Session ID that is generated is stored as a Session cookie. If the user's browser doesn't support the use of cookies, the Active Server engine examines the URL references on the page. The Active Server Engine determines which URL links reference another page in your application and append the Session ID to each of these references. In this way, the Session ID remains available within the user session scope of the application.

The other property of the Session object is the Timeout property. You can use the Timeout property to identify the maximum length of time before the session will end, or time out, for a user. This property is measured in minutes. If there is no user activity such as refreshing or requesting a page before the timeout period, the session terminates. The syntax for using this property is

Session.Timeout = nMinutes

nMinutes indicates the number of minutes for the timeout period. The default value for the timeout period is 20 minutes.

The Abandon method is the sole method for the Session object. You can use the Abandon method to explicitly terminate a session and destroy all of the information stored in the session object. The syntax for calling the Abandon method is

Session.Abandon

After you call the Abandon method, the page processes any remaining script and then terminates the session.

Working with the Session Object

You can create additional properties and variables for the Session object to store information about a user session. Examples include user preferences as well as global information to be shared between the pages for a particular user session. Another example would involve storing data to be used to calculate the grand total for an order. The following example shows how to store variables in the Session object:

Session("UserName") = "John Smith"

Session("Email") = "JSmith@msn.com"

Session("CoffeeDrink") = "Latte"

Session("Age") = 32

These examples show how you can store various types of information using the Session object. The information contained in these variables can then be accessed and referenced throughout the scope of this user's session.

You also can use the pre-defined properties and methods of the Session object. For example, if you want to change the timeout period for a user session, you can alter the value in the Timeout property. The following code sample changes the timeout period from the default of 20 minutes to 30 minutes:

Session.Timeout = 30

Listing 11.10 demonstrates how to use a Session object variable to dynamically format a page based on the user preferences that were entered on an initial User Preferences Form.

Listing 11.10. Using a new variable in the Session object.

<HTML>
<% If Session("CoffeeDrink") = "Latte" Then %>
<IMG SRC="/MyApp/images/latte.GIF" WIDTH="85"
<% Else %>
<IMG SRC="/MyApp/images/Cappuccino.GIF" WIDTH="85"
<%End If%>
</HTML>

In this code example, the ASP checks the value of the user's coffee drink preference, which is stored in the Session object. If the preference is a Latte, then the page is formatted with an image of a Cafe Latte. If the user specified something other than a Latte, the page is formatted with an image of a Cappuccino. This code again demonstrates the dynamic nature of Active Server Pages.

Working with the Session Events

The Session object is related to two events that are unique to an Active Server Page. The Session_OnStart and Session_OnEnd events can be used to execute script when a session is initially created and when the session is terminated. These events are contained in the global.asa file. You were first introduced to the global.asa and these events during Chapter 4, "Creating Your First Visual InterDev Project."

The Session_OnStart event is triggered when the server creates the new session. The Session_OnStart script is the initial code that is processed for a new user session. In other words, the script that you place in the procedure for this event is processed before the request for the page is executed. You can access all of the objects for an ASP, including the Application, Session, Server, Request, and Response objects during this event. The Session_OnEnd event occurs when the user session is abandoned or times out. The only ASP objects available during the Session_OnEnd event include the Application, Server, and Session objects.

An example of using the Session_OnStart event involves the Redirect method for the Response object that you learned earlier toChapter. I used the example of redirecting a user to a defined start page for the application. Listing 11.11 demonstrates an expansion of this example used within the context of the Session_OnStart event.

Listing 11.11. Starting the user off right.

<SCRIPT RUNAT=Server Language=VBScript>
Sub Session_OnStart
` Sets the value of the Order Header start page
OrderHeaderPage = "/MyApp/OrderHeader.asp"
` Sets the value of the current user page
CurrentPage = Request.ServerVariables("SCRIPT_NAME")
` Do a case-insensitive compare on the pages. If they
` don't match, send the user to the Order Header page.
If strcomp(currentPage,OrderHeaderPage,1) then
Response.Redirect(OrderHeaderPage)
End If
End Sub
</SCRIPT>

Because the code in the listing executes when a user session is initiated, the Session_OnStart is a perfect place to verify that the user is beginning with the proper page in your application. This code example combines several of the concepts that you have learned toChapter to demonstrate their value within the context of an application.

The Application Object

The Application object enables you to share information across all users of the ASP-based application. While the Session object is limited to a single user, this information is globally available for all users of the application. The Application object is created when the application is initiated. Upon initial creation, the Application object is then available to each additional user who accesses your application. The syntax for accessing the Application object is as follows:

Application.method

method is the name of the method for the Application object. The Application object supports two defined methods. The Lock and Unlock methods provide a way to prevent contention between multiple users. The Lock method enables you to prevent other users from modifying an Application object that has been accessed by a user. The Unlock method enables you to then unlock the Application object once it has been released by the user. When you use the Unlock method, other users are then able to modify the Application object's properties and variable information.

A great example of using the Application object involves calculating the number of visits to your web site. Almost all web sites track this information. For commercial sites, the number of people that visit a web site continues to be a very important number. This number is used to justify the existence of the web site as well as to determine how much to charge advertisers that place a banner on the web page. The code in Listing 11.12 demonstrates how to use the Application object to determine the number of hits for a web site.

Listing 11.12. Determining the number of web site visitors.

<%
` Locks the Application object
Application.Lock
` Increments the number of visits by one
Application("NumVisits") = Application("NumVisits") + 1
` Unlocks the Application object
Application.Unlock
%>
` Displays the number of visitors for the application
This application page has been visited
<%= Application("NumVisits") %> times!

In this code example, the NumVisits variable is created the first time the code is executed. The variable is initialized to zero. The NumVisits is then incremented each additional time the code is executed, and the value is stored in the Application object.

The values that are stored in the Application object are contained in persistent storage. For this reason, you can access the values of these variables even if you have to stop and restart your server. You can, therefore, create and use variables for your application that need to be consistently maintained. You want to use good judgment about the kind of values that you store in the Application object. You should store simple rather than complex information.

Working with the Application Events

The Application object has two associated events that are contained in the global.asa. You were first introduced to the global.asa and these Application events during Chapter 4.

The Application_OnStart event is triggered when the first user accesses a web page within the application. This event occurs before the Session_OnStart event. The Application_OnEnd event is activated when the application terminates. The Application_OnEnd occurs after the Session_OnEnd event. The Server and the Application objects are the only objects that are available during both the Application_OnStart and the Application_OnEnd events.

The Server Object

The Server object enables you to interface with Active Server Components, also called OLE Automation Components. These components provide robust application processing on the server. Active Server Pages include the following five Active Server Components:

1. Database Access Component


2
AdRotator Component


3
Browser Capabilities Component


4
File Access Component


5.
Content Linking Component

These components are included with Visual InterDev and enable you to accomplish certain tasks within the context of an ASP. You also can create custom Active Server Components for your Active Server Pages. You learn how to interact with these components as well as build your own custom Active Server Component on Chapter 17.

The syntax for referencing the Server object is as follows:

Server.method

method is the name of the method for the Server object. The methods for the Server object are outlined in Table 11.5.

Table 11.5. The Server object methods.

Method Description
CreateObject Creates an instance of an object
HTMLEncode Applies HTML encoding to a string
MapPath Maps the virtual path to a physical path
URLEncode Applies URL encoding to a string

The Server object also contains one property that can be accessed. The ScriptTimeout property defines the length of time for a script to be able to run. The syntax for this property is as follows:

Server.ScriptTimeout = NumofSeconds

NumofSeconds represents the number of seconds before the script times out and terminates its processing. The default value for this property is 90 seconds. The ScriptTimeout property only applies to the processing of the script code. A script won't time out based on this property while a server component is processing. You set the value of this property as well as retrieve its value to store in a variable within your application. For example, if you wanted to find out the timeout period for the server script, you could execute the following code:

<% TimeoutForScript = Server.ScriptTimeout %>

This code sample would retrieve the value of the timeout period for the server script and store the value in the variable TimeoutForScript.

You will typically interact with the Server object by using the pre-defined server components for Active Server Pages as well as your own custom ActiveX Server Components. The following sections explain how to create and work with an instance of an object.

Creating a Server Object Instance

The CreateObject method is the most widely used method for the Server object. You can use this method to create an instance of a particular object that can then be used by your application. The syntax for calling this method is as follows:

Server.CreateObject progID

progID indicates the type of object to create. The syntax for the progID parameter is

Vendor.Component.Version

Vendor is the author of the component, Component is the name of the component, and Version is the version number of the component.

When you use this method to create an instance of an object, the scope of the object exists for the lifetime of the ASP. For example, if you execute this method in a typical ASP within your application, the component only exists while your ASP script is processed. The object is destroyed when the ASP completes its processing. Listing 11.13 demonstrates an object that is created for the lifetime of an ASP.

Listing 11.13. An object with limited existence.

<%
` Creates an instance of the Browser Capabilities object
Set bc = Server.CreateObject("MSWC.BrowserType")
` Check to see if the browser supports VBScript
If bc.vbscript = "True" Then %>
` Format a friendly confirmation message
Your Browser supports VBScript!
<%Else %>
` Format another message
Your Browser is very limited!?!

In this code example, the object that is created can only be referenced for the lifetime of the ASP. After the script executes the last line of code to format a message to display on the browser page, the object is destroyed. Any references to the object after the ASP has completed result in a runtime error, as shown in Figure 11.12.

Figure 11.12.

Referencing an object that has died.

You can extend the life of your objects by calling the CreateObject method and storing its value in a Session or Application object variable. For example, you could execute the following line of code to store an object in an Application object variable:

<% Set Application("BrowserCapabilities") = Server.CreateObject("MSWC.BrowserType") %>

In this example, an instance of the BrowserType object is created and stored in an Application object variable named BrowserCapabilities. The BrowserType object, also referred to as the Browser Capabilities component, enables you to determine the capabilities of the current browser. Because an Application object variable is used to store this object, the object and its methods and properties can be referenced for the lifetime of the application.


NOTE: In the previous code example, notice the Set statement used to store the component in the Application object variable. The use of this word differs from the normal convention that you learned earlier. You must use the Set keyword to store object variables.

You have now learned two methods for storing an instance of an object. When naming a variable to store an instance of the object, you cannot choose a name of a pre-defined object. For example, the following line of code would result in an error.

<% Set Application = Server.CreateObject("Application") %>

You also can use the <OBJECT> declaration to create an instance of an object in the global.asa file. You must declare these objects to contain either Application or Session scope. The syntax for using the <OBJECT> tag is as follows:

<OBJECT RUNAT=Server SCOPE=Scope id=Identifier

{PROGid=ProgID|CLASSid=ClassID}>

Scope indicates the scope of the object. This value of this parameter will be either Session or Application. The Identifier parameter designates a name for the object. The ProgID parameter was discussed previously. The ClassID parameter represents a unique class identifier for an OLE class object. You must enter either the ProgID or the ClassID parameter. Listing 11.14 demonstrates a global.asa file that declares an object with Session scope.

Listing 11.14. Using the <OBJECT> tag to extend the life of an object.

<SCRIPT LANGUAGE="VBScript" RUNAT="Server">
<%
If ProgramID Then
` Declare an object with Session scope using the PROGID
<OBJECT RUNAT=Server SCOPE=Session id=MyConnection
PROGid="ADODB.Connection">
Else
` Declare an object with Session scope using the CLASSID
<OBJECT RUNAT=Server SCOPE=Session id=MyConnection
CLASSid="Clsid:8AD3067A-B3FC-11CF-A560-00A0C9081C21">
</OBJECT>

Both the PROGID and CLASSID formats are used in this code example for the purpose of illustration. You will typically use either one format or the other, depending on the object that is being declared. This code listing shows an example of a database connection that is declared in a global.asa file. You could then reference characteristics about this connection object throughout the lifetime of a user session.


TIP: The lesson has outlined the different lifetimes of an object based on when and where it is created. If you're ruthless and want to kill the object yourself, you can accomplish this task by using the Nothing key- word. To destroy an object, set the object variable equal to Nothing. For example, to destroy the bc object instance, execute (pardon the pun) the code: <%Set bc = Nothing %>. This code will destroy the instance of the BrowserType object that has been stored in the variable bc. This is the only tip that you get on how to destroy something. The lesson will not provide any tips on how to destroy your coworker's house or property.

Creating Your First Active Server Page

Now that you have learned about all of the benefits and features of Active Server Pages, you're probably wondering how to create an ASP. As you would expect, Microsoft has included a template within Visual InterDev to make this process easy.

From the File menu, select the New menu item. You are probably very familiar with the New tabbed dialog window by now. Figure 11.13 displays the Files tab within the New dialog window.

From this window, you can select the Active Server Page option from the list. You need to enter a name for the ASP and click OK. The ASP is created with the name that you specify and added to the current project. Figure 11.14 shows a newly created ASP.

Notice that the scripting language is denoted at the top of the ASP. This language is based on the default scripting language that you selected for your ASP. You learned how to change the default scripting language earlier in toChapter's lesson.

Figure 11.13.

Creating an Active Server Page.

Figure 11.14.

A sample Active Server Page.

You're now ready to add processing logic to your ASP. An ASP is very similar to the HTML files that you created with Visual InterDev during the first week. The Active Server Page contains a place to put your HTML. You also can add your scripting code to the ASP. You can use most of the same options that are available for creating an HTML page, including HTML layouts and ActiveX and Design-time ActiveX controls. To add these features to your ASP, right-click the mouse in the ASP to display the shortcut menu for the ASP, as seen in Figure 11.15.

Figure 11.15.

Adding additional features to your ASP.

You can then choose an option to insert into your ASP.

Summary

Active Server Pages provide an excellent method for constructing interactive applications. ToChapter's lesson has provided you with a thorough overview of Active Server Pages. Visual InterDev enables you to easily implement Active Server Pages within your application. You now understand how Active Server Pages derived their name--an ASP represents the difference between a passive, dull site and a site that truly comes alive, thereby providing a rich and rewarding experience for the user.

During toChapter's lesson, you first received an explanation of a server that is alive and active, then learned about the features and benefits of Active Server Pages. During this part of the lesson, you learned the characteristics of Active Server Pages that give them their dynamic nature. The lesson then provided an overview of the client-server picture of a Web-based application. The role of an Active Server Page was outlined within the context of the application components.

You learned about the types of scripting languages that are used within an Active Server Page. You also learned how Visual InterDev assigns the scripting language for an ASP and how you can change the default language for your Active Server Pages. A majority of the lesson covered the various objects that can be used with Active Server Pages. You learned about the five types of ASP objects. You also received an exhaustive discourse on the collections, methods, and properties of these objects. The lesson provided detailed examples of how to access and reference these objects. Throughout the lesson, you received relevant examples of scripting logic that can be used to meet the needs of your application.

At the end of the Chapter, you received an overview of how to create your first Active Server Page. You were able to view the format of an ASP. Finally, you learned about the Active Server Page's additional features such as ActiveX controls and Design-time ActiveX controls that can be added to an ASP.

Q&A

Q What is the main difference between an HTML web page and an Active Server Page?

A An HTML web page consists of HTML, limited client-side script, ActiveX controls, and other objects that help to format the look of the web page. All of the logic included within an HTML file is executed within the context of the client browser. An ASP, on the other hand, can include all of the aforementioned items as well as robust server-side script. This server-side script executes on the server and can interact with Active Server Components that are also on the server. An ASP can dynamically generate formatted HTML back to the client, based on both client and server conditions. The dynamic nature of an ASP is what distinguishes it from a regular HTML web page.


Q Can I use an Active Server Page instead of an HTML file to create my web pages?

A Definitely, yes. In fact, I think you will appreciate the dynamic nature of Active Server Pages so much that you won't want to go back to using HTML files. Of course, there still may be situations where you need to use an HTML web page instead of an Active Server Page.

Workshop

ToChapter's workshop will enable you to explore the development of an Active Server Page. You're going to use the template that you created during the last section of the lesson to add your application logic. Choose some of your favorite objects and examples from toChapter's lesson, and experiment using these objects and the examples that were provided to create a sample application of your own. This application should use Active Server Pages to create a dynamic experience for the user. You should also extend the functionality of the examples to include your own ideas. For example, you may want to extend the functionality of the User Preferences Form to include other preferences besides name and favorite type of coffee drink.

You should practice using the ASP concepts explained in toChapter's lesson to develop your application. You also should experiment using different scenarios for your ASP and your application. An example would be to experiment creating your objects in different places, including creating an object in a regular ASP as well as in the global.asa file. Finally, you should practice using variables that contain different scopes, such as Application versus Session versus Page.

Quiz

1. Name the five types of ASP objects.


2
Which object supports a method to write HTML back to the client?


3
Which object contains a collection which enables you to access the object values on a form?


4
Explain the difference between Session and Application scope.


5
Given the following code for an Active Server Page, what is displayed as the value of the NumofVisits variable for user C after users A and B access the application?

<%

Session("NumofVisits") = Application("NumofVisits") + 1

%>

This application page has been visited

<%= Session("NumofVisits") %> times!

Quiz Answers

1. The five types of ASP objects are:

Request object

Response object

Session object

Application object

Server object

2. The Response object

3. The Request object

4. Session scope of a variable extends for the lifetime of a user session, and information stored in a Session variable is only available to the specified user. As long as the user interacts with your application, this information is available to the user. Application scope refers to a variable that is available to all users of your application.

5. The answer is 1. A Session variable was used instead of an Application variable. The developer of this code was attempting to track the number of visitors to the web site application. As you discovered from correctly answering Quiz question number 4, the Application variable would have provided access to all users of the application. If an Application variable had been used, the code would have reflected the accurate number of people who had visited the site--3.

BACKFORWARDTOC