mark dixon page 1 19 – passing data between pages: forms, sessions, & query strings

41
Mark Dixon Page 1 19 – Passing Data between pages: Forms, Sessions, & Query Strings

Upload: luke-hubbard

Post on 11-Jan-2016

227 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Mark Dixon Page 1 19 – Passing Data between pages: Forms, Sessions, & Query Strings

Mark Dixon Page 1

19 – Passing Data between pages:Forms, Sessions, & Query Strings

Page 2: Mark Dixon Page 1 19 – Passing Data between pages: Forms, Sessions, & Query Strings

Mark Dixon Page 2

Session Aims & Objectives• Aims

– To introduce the fundamental ideas involved in passing data between pages

– Highlight modular design techniques, and demonstrate them in ASP

• Objectives,by end of this week’s sessions, you should be able to:

– pass data between pages, using:• Self Posting• Query Strings• Session Variables

– use procedures, functions, parameters, and modules (shared VB script files) in ASP

Page 3: Mark Dixon Page 1 19 – Passing Data between pages: Forms, Sessions, & Query Strings

Mark Dixon Page 3

Example: Logon v2 (design)• Restrict access to

home page

Page 4: Mark Dixon Page 1 19 – Passing Data between pages: Forms, Sessions, & Query Strings

Mark Dixon Page 4

Example: Logon v2 (code)<script language="VB" runat="server"> Sub Page_Load() Dim un As String Dim pw As String If Request.Form("btnLogon") > "" Then un = txtUserName.Value pw = txtPassWord.Value If un = "mark" And pw = "soft131" Then Response.Redirect("home.htm") Else msg.innerText = "Login details incorrect." End If End If End Sub</script>

<html> <head><title></title></head> <body> <form runat="server"> Please logon:<br /> <input id="txtUserName" type="text" runat="server" /><br /> <input id="txtPassWord" type="text" runat="server" /><br /> <input id="btnLogon" type="submit" value="Logon" runat="server" /> <p id="msg" runat="server"></p> </form> </body></html>

Logon.aspx

<html> <head><title>My Home page</title></head> <body> <p> Welcome to my home page.<br /> <img src="YouAreHere.jpg" /> </p> </body></html>

Home.htm

Page 5: Mark Dixon Page 1 19 – Passing Data between pages: Forms, Sessions, & Query Strings

Mark Dixon Page 5

Example: Logon (Fixed Problem)• View Source – shows client-side script:

No server-side code

Page 6: Mark Dixon Page 1 19 – Passing Data between pages: Forms, Sessions, & Query Strings

Mark Dixon Page 6

Example: Logon (Problem 2)• User can type home page url (address)

directly (bypassing logon page)

Page 7: Mark Dixon Page 1 19 – Passing Data between pages: Forms, Sessions, & Query Strings

Mark Dixon Page 7

Solution• Need way for:

– password page to tell home page

– that user logged in OK

Page 8: Mark Dixon Page 1 19 – Passing Data between pages: Forms, Sessions, & Query Strings

Mark Dixon Page 8

Technique: Dead-Drop Variables• 2 Spies wish to pass message between

each other without actually meeting

• Arrange a dead-drop location– one spy leaves message at location– other spy visits location later to pick up

message

• Variables used as dead-drop containers

Page 9: Mark Dixon Page 1 19 – Passing Data between pages: Forms, Sessions, & Query Strings

Mark Dixon Page 9

Example: Logon v3 (code)<script language="VB" runat="server">Dim LogonOK As Boolean Sub Page_Load() Dim un As String Dim pw As String LogonOK = False If Request.Form("btnLogon") > "" Then un = txtUserName.Value pw = txtPassWord.Value If un = "mark" And pw = "soft131" Then LogonOK = True Response.Redirect("home3.htm") Else msg.innerText = "Login details incorrect." End If End If End Sub</script>

<html> <head><title></title></head> <body> <form runat="server"> Please logon:<br /> <input id="txtUserName" type="text" runat="server" /><br /> <input id="txtPassWord" type="text" runat="server" /><br /> <input id="btnLogon" type="submit" value="Logon" runat="server" /> <p id="msg" runat="server"></p> </form> </body></html>

Logon3.aspx

<script runat="server" language="VB">Dim LogonOK As Boolean Sub Page_Load() If LogonOK = False Then Response.Redirect("Logon3.aspx") End If End Sub</script>

<html> <head><title>My Home page</title></head> <body> <p> Welcome to my home page.<br /> <img src="YouAreHere.jpg" /> </p> </body></html>

Home3.aspx

• Does not work: always redirect to logon

LogonOKTrue

Page 10: Mark Dixon Page 1 19 – Passing Data between pages: Forms, Sessions, & Query Strings

Mark Dixon Page 10

Example: Logon v3 (Error)• Variables – don't persist between pages

Page 11: Mark Dixon Page 1 19 – Passing Data between pages: Forms, Sessions, & Query Strings

Mark Dixon Page 11

Passing Data (temporary)

• Session object– used to pass information between pages:

– exists for current session– persist between pages– clears if user closes browser– clears after 20 mins of inactivity– no need for declaration

Session("Thing") = 91

Put 91 into Thing

Page 12: Mark Dixon Page 1 19 – Passing Data between pages: Forms, Sessions, & Query Strings

Mark Dixon Page 12

Maintaining State: Session Object<script runat="server" language="VB"> Sub Page_Load() If Request.Form("btnSend") > "" Then Session("MSG") = "Meet in BGB202" ElseIf Request.Form("btnClear") > "" Then Session.Abandon() End If End Sub</script>

<html> <head><title></title></head> <body> <form runat="server"> <input id="btnSend" type="submit" value="Send" runat="server" /> <input id="btnClear" type="submit" value="Clear" runat="server" /> <p><a href="Display.aspx">Display</a></p> </form> </body></html>

Send.aspx

• Session variable– all strings– no declaration

• Abandon method– deletes all

session variables

Page 13: Mark Dixon Page 1 19 – Passing Data between pages: Forms, Sessions, & Query Strings

Mark Dixon Page 13

Maintaining State: Session Object

<script runat="server" language="VB"> Sub Page_Load() parMsg.InnerText = Session("MSG") End Sub</script>

<html> <head><title></title></head> <body> <p id="parMsg" runat="server"></p> </body></html>

Display.aspx

• read session variable, and display in parMsg

Page 14: Mark Dixon Page 1 19 – Passing Data between pages: Forms, Sessions, & Query Strings

Mark Dixon Page 14

Example: Message• Using Session variable:

<script runat="server" language="VB"> Sub Page_Load() If Request.Form("btnSend") > "" Then Session("MSG") = "Meet in BGB202" ElseIf Request.Form("btnClear") > "" Then Session.Abandon() End If End Sub</script>

<html> <head><title></title></head> <body> <form runat="server"> <input id="btnSend" type="submit" value="Send" runat="server" /> <input id="btnClear" type="submit" value="Clear" runat="server" /> <p><a href="Display.aspx">Display</a></p> </form> </body></html>

Send.aspx

<script runat="server" language="VB"> Sub Page_Load() parMsg.InnerText = Session("MSG") End Sub</script>

<html> <head><title></title></head> <body> <p id="parMsg" runat="server"></p> </body></html>

Display.aspx

MSGMeet in BGB202

Page 15: Mark Dixon Page 1 19 – Passing Data between pages: Forms, Sessions, & Query Strings

Mark Dixon Page 15

Questions: Session Variables• Write a line of VB code to put the number 74

into a session variable called id.

• Write VB code that displays 'Hello' in parMsg if the session variable called id is equal to 74

Session("id") = 74

If Session("id") = 74 Then

parMsg.InnerText = "Hello"

End If

Page 16: Mark Dixon Page 1 19 – Passing Data between pages: Forms, Sessions, & Query Strings

Mark Dixon Page 16

Passing Data (temporary)

• Query Strings– Useful for passing information between pages

via links

Page 17: Mark Dixon Page 1 19 – Passing Data between pages: Forms, Sessions, & Query Strings

Mark Dixon Page 17

Maintaining State: Query Strings• Data added to end of URL (address):

http://localhost/page.asp?Surname=Bob

• ASP code can use this data:– Request.QueryString("Surname")

• would return the value "Bob"

• Form method=get– data automatically added to query string

Query String

Page 18: Mark Dixon Page 1 19 – Passing Data between pages: Forms, Sessions, & Query Strings

Mark Dixon Page 18

Example: Date-Time<html> <head> </head> <body> <p>What background colour do you want for you date information? <br><a href=DateTime.aspx?Colour=yellow>Yellow</a> <br><a href=DateTime.aspx?Colour=cyan>Light Blue</a> </body></html>

Menu.aspx

<html> <head> </head> <body bgcolor=<%=request.querystring("Colour")%>> <p>The date is <%=Format(Now(), "D")%>. <p>The time is <%=Format(Now(), "T")%>. </body></html>

DateTime.aspx

Page 19: Mark Dixon Page 1 19 – Passing Data between pages: Forms, Sessions, & Query Strings

Mark Dixon Page 19

Reference: Server Object Model• Request object: calling web page

– Form: used to get form data from page– QueryString: used to get data from address (?)

• Response object: web page sent back– Write: used to put text into web page– Redirect: used to navigate to other page– Clear: erases all HTML in web page

• Session object: store data between pages– Abandon: clears session data

Page 20: Mark Dixon Page 1 19 – Passing Data between pages: Forms, Sessions, & Query Strings

Mark Dixon Page 20

Passing Data (persistent)

• Cookies (not covered in this module)– stored on users’ (client) hard drive– persists between sessions

• Database/file (covered in later lectures)– stored on server hard drive– persists between sessions

Page 21: Mark Dixon Page 1 19 – Passing Data between pages: Forms, Sessions, & Query Strings

Mark Dixon Page 21

Example: Apples (analysis)SPECIFICATION

• User Requirements – help young children learn to count from 1 to 10

• Software Requirements– Functional:

–computer selects number between 1 and 10–computer displays that number of apples–user (child) types digits–computer compares digits to number of apples

– Non-functionalshould be easy to use and interesting

Page 22: Mark Dixon Page 1 19 – Passing Data between pages: Forms, Sessions, & Query Strings

Mark Dixon Page 22

Example: Apples v2 (design)• Functionality:

• computer selects number between 1 and 10• computer displays that number of apples• user types digits• computer compares digits to number of apples

Page 23: Mark Dixon Page 1 19 – Passing Data between pages: Forms, Sessions, & Query Strings

Mark Dixon Page 23

Example: Apples v2 (code)Dim n As Long

Sub Page_Load() Dim html As String Dim a As Long If Request.Form("btnStart") > "" Then n = 1 + Int(Rnd() * 9) html = "How many apples are there?<br />" For a = 1 To n html = html & "<img src=Apple.gif>" Next quest.InnerHtml = html Session("NumApples") = n msg.InnerHtml = "" txtAns.Value = "" btnStart.Disabled = True btnCheck.Disabled = False ElseIf Request.Form("btnCheck") > "" Then n = Session("NumApples") If CInt(txtAns.Value) = CInt(n) Then msg.InnerHtml = "Correct, well done!" Else msg.InnerHtml = "Sorry, please try again." End If btnStart.Disabled = False btnCheck.Disabled = True End If End Sub

Apples.aspxDim n As Long

Sub Page_Load() Dim html As String Dim a As Long If Request.Form("btnStart") > "" Then n = 1 + Int(Rnd() * 9) html = "How many apples are there?<br />" For a = 1 To n html = html & "<img src=Apple.gif>" Next quest.InnerHtml = html Session("NumApples") = n msg.InnerHtml = "" txtAns.Value = "" btnStart.Disabled = True btnCheck.Disabled = False

Page 24: Mark Dixon Page 1 19 – Passing Data between pages: Forms, Sessions, & Query Strings

Mark Dixon Page 24

Example: Apples v2 (code)Dim n As Long

Sub Page_Load() Dim html As String Dim a As Long If Request.Form("btnStart") > "" Then n = 1 + Int(Rnd() * 9) html = "How many apples are there?<br />" For a = 1 To n html = html & "<img src=Apple.gif>" Next quest.InnerHtml = html Session("NumApples") = n msg.InnerHtml = "" txtAns.Value = "" btnStart.Disabled = True btnCheck.Disabled = False ElseIf Request.Form("btnCheck") > "" Then n = Session("NumApples") If CInt(txtAns.Value) = CInt(n) Then msg.InnerHtml = "Correct, well done!" Else msg.InnerHtml = "Sorry, please try again." End If btnStart.Disabled = False btnCheck.Disabled = True End If End Sub

Apples.aspx

ElseIf Request.Form("btnCheck") > "" Then n = Session("NumApples") If CInt(txtAns.Value) = CInt(n) Then msg.InnerHtml = "Correct, well done!" Else msg.InnerHtml = "Sorry, please try again." End If btnStart.Disabled = False btnCheck.Disabled = True End If End Sub

Page 25: Mark Dixon Page 1 19 – Passing Data between pages: Forms, Sessions, & Query Strings

Mark Dixon Page 25

Problem Solving Strategies• bottom-up

– Create a detailed solution first– Then look for best solution– refactoring – process of:

• changing internal design of code,• without altering what it does

• top-down– plan overall design– fill in details

in practice mixed – novices favour bot-up, experts top-down

Page 26: Mark Dixon Page 1 19 – Passing Data between pages: Forms, Sessions, & Query Strings

Mark Dixon Page 26

Example: Apples (Dependencies)• Difficult to see

dependencies for lines far apart

Dim n As Long

Sub Page_Load() Dim html As String Dim a As Long If Request.Form("btnStart") > "" Then n = 1 + Int(Rnd() * 9) html = "How many apples are there?<br />" For a = 1 To n html = html & "<img src=Apple.gif>" Next quest.InnerHtml = html Session("NumApples") = n msg.InnerHtml = "" txtAns.Value = "" btnStart.Disabled = True btnCheck.Disabled = False

Page 27: Mark Dixon Page 1 19 – Passing Data between pages: Forms, Sessions, & Query Strings

Mark Dixon Page 27

Example: Apples (Dependencies)• Put dependent

lines close together

Dim n As Long

Sub Page_Load() Dim html As String Dim a As Long If Request.Form("btnStart") > "" Then n = 1 + Int(Rnd() * 9) Session("NumApples") = n html = "How many apples are there?<br />" For a = 1 To n html = html & "<img src=Apple.gif>" Next quest.InnerHtml = html msg.InnerHtml = "" txtAns.Value = "" btnStart.Disabled = True btnCheck.Disabled = False

Page 28: Mark Dixon Page 1 19 – Passing Data between pages: Forms, Sessions, & Query Strings

Mark Dixon Page 28

Example: Apples v3 (design)• Functionality:

• computer selects number between 1 and 10• computer displays that number of apples• user types digits

• computer compares digits to number of apples

and displays number of apples typed by user

Page 29: Mark Dixon Page 1 19 – Passing Data between pages: Forms, Sessions, & Query Strings

Mark Dixon Page 29

Example: Apples v3 (code)Dim n As Long

Sub Page_Load() Dim html As String Dim msg As String Dim a As Long If Request.Form("btnStart") > "" Then n = 1 + Int(Rnd() * 9) Session("NumApples") = n html = "How many apples are there?<br />" For a = 1 To n html = html & "<img src=Apple.gif>" Next parQuest.InnerHtml = html parMsg.InnerHtml = "" txtAns.Value = "" btnStart.Disabled = True btnCheck.Disabled = False ElseIf Request.Form("btnCheck") > "" Then n = Session("NumApples") msg = "" For a = 1 To txtAns.Value msg = msg & "<img src=Apple.gif>" Next If CInt(txtAns.Value) = CInt(n) Then msg = msg & "Correct, well done!" Else msg = msg & "Sorry, please try again." End If parMsg.InnerHtml = msg btnStart.Disabled = False btnCheck.Disabled = True End If End Sub

Apples.aspx

ElseIf Request.Form("btnCheck") > "" Then n = Session("NumApples") msg = "" For a = 1 To txtAns.Value msg = msg & "<img src=Apple.gif>" Next If CInt(txtAns.Value) = CInt(n) Then msg = msg & "Correct, well done!" Else msg = msg & "Sorry, please try again." End If parMsg.InnerHtml = msg btnStart.Disabled = False btnCheck.Disabled = True End If End Sub

• copy + paste

Page 30: Mark Dixon Page 1 19 – Passing Data between pages: Forms, Sessions, & Query Strings

Mark Dixon Page 30

Modular Design• What do lines do (group summary)?

n = 1 + Int(Rnd() * 9) Session("NumApples") = n html = "How many apples are there?<br />" For a = 1 To n html = html & "<img src=Apple.gif>" Next parQuest.InnerHtml = html parMsg.InnerHtml = "" txtAns.Value = "" btnStart.Disabled = True btnCheck.Disabled = False

Pick Num. of Apples

Display Question

Prepare for Response

Page 31: Mark Dixon Page 1 19 – Passing Data between pages: Forms, Sessions, & Query Strings

Mark Dixon Page 31

Modular Design (top level)• Top level reads like English algorithm:

Dim n As LongDim html As StringDim msg As StringDim a As Long

Sub Page_Load() If Request.Form("btnStart") > "" Then PickRandomNumberOfApples DisplayApplesQuest PrepareForResponse ElseIf Request.Form("btnCheck") > "" Then n = Session("NumApples") DisplayApplesUser DisplayFeedback PrepareForQuest End If End Sub

Page 32: Mark Dixon Page 1 19 – Passing Data between pages: Forms, Sessions, & Query Strings

Mark Dixon Page 32

Modular Design (detail)• Procedures contain (hide) detail:

Sub PickRandomNumberOfApples() n = 1 + Int(Rnd() * 9) Session("NumApples") = n End Sub Sub DisplayApplesQuest() Dim html As String html = "How many apples are there?<br />" For a = 1 To n html = html & "<img src=Apple.gif>" Next parQuest.InnerHtml = html End Sub Sub DisplayApplesUser() msg = "" For a = 1 To txtAns.Value msg = msg & "<img src=Apple.gif>" Next End Sub Sub DisplayFeedback() If CInt(txtAns.Value) = CInt(n) Then msg = msg & "Correct, well done!" Else msg = msg & "Sorry, please try again." End If parMsg.InnerHtml = msg End Sub Sub PrepareForResponse() parMsg.InnerHtml = "" txtAns.Value = "" btnStart.Disabled = True btnCheck.Disabled = False End Sub Sub PrepareForQuest() btnStart.Disabled = False btnCheck.Disabled = True End Sub

Sub DisplayApplesQuest() html = "How many apples are there?<br />" For a = 1 To n html = html & "<img src=Apple.gif>" Next parQuest.InnerHtml = html End Sub Sub DisplayApplesUser() msg = "" For a = 1 To txtAns.Value msg = msg & "<img src=Apple.gif>" Next End Sub

Page 33: Mark Dixon Page 1 19 – Passing Data between pages: Forms, Sessions, & Query Strings

Mark Dixon Page 33

Routines: Self-Contained• Good design principle:

– routines (functions and procedures)should be self-contained(easier to re-use in other programs)

Dim u As Long u = Twice(4)

Function Twice(a As Long) Return a * 2End Function

Dim u As LongDim a As Long a = 4 u = Twice()

Function Twice() Return a * 2End Function

Page 34: Mark Dixon Page 1 19 – Passing Data between pages: Forms, Sessions, & Query Strings

Mark Dixon Page 34

Question: Self-Contained Routines

• Are the following routines self contained?Dim num1

Dim num2

Dim diff

Sub Compare()

diff = num1 - num2

End Sub

Function Half(num As Double) As Double

Return num / 2

End Function

Page 35: Mark Dixon Page 1 19 – Passing Data between pages: Forms, Sessions, & Query Strings

Mark Dixon Page 35

Problem Solving: 9 dots• Join all 9 dots

– with straight continuous lines

Page 36: Mark Dixon Page 1 19 – Passing Data between pages: Forms, Sessions, & Query Strings

Mark Dixon Page 36

Problem Solving Process (Name Split)

• Problem: a variable exists called n. This contains a person's full name (forename, then surname ). It needs to be split into two separate variables.

Dim n As String

n = "Ruth Jones"

• Solution Process:– What do I do to solve this manually (on paper)?– How do I know where the forename ends and the

surname begins?– The space is the key:

• Find the space• everything before the space is the forename• everything after the space is the surname

Page 37: Mark Dixon Page 1 19 – Passing Data between pages: Forms, Sessions, & Query Strings

Mark Dixon Page 37

Tutorial Exercise: Apples• LEARNING OBJECTIVE:

identify dependencies between lines of coderefactor code: dependent lines closerrefactor code: split into routines (procedures and functions)refactor code: make routines self-contained

• Task 1: Get the Apples v3 example (from the lecture) working• Task 2: Modify your page to keep a score.

HINT: Try to identify the routines first, then fill in the code.

Page 38: Mark Dixon Page 1 19 – Passing Data between pages: Forms, Sessions, & Query Strings

Mark Dixon Page 38

Tutorial Exercise: Message• LEARNING OBJECTIVE:

pass data between pages using session variables, and (form) self-posting

• Task 1: Get the message example working (from the lecture)• Task 2: Change the send.aspx page so that when you click the buttons

it gives some feedback as to what has happened. hint: add a paragraph

Page 39: Mark Dixon Page 1 19 – Passing Data between pages: Forms, Sessions, & Query Strings

Mark Dixon Page 39

Tutorial Exercise: Apples• LEARNING OBJECTIVE:

pass data between pages using session variables, and (form) self-posting

• Task 1: Type in the code for the Apples example (from the lecture)• Task 2: Modify this to use a session variable to 'remember' the random

number, so that it works properly.• Task 3: Change it so that it disables the buttons appropriately• Task 4: Change it so that it clears the text box and feedback as a new

question begins• Task 5: Add a score facility.

– when the page loads, the score should be 0– when the answer is correct, the score should increase by 1– when the score goes over 10, a congratulations message should

be shown, and the score reset to 0

Page 40: Mark Dixon Page 1 19 – Passing Data between pages: Forms, Sessions, & Query Strings

Mark Dixon Page 40

Tutorial Exercise: Logon• LEARNING OBJECTIVE:

pass data between pages using session variables, and (form) self-posting

• Task 1: Type in the code for the Logon v3 example (from the lecture) NOTE: this will not work properly (variables do not persist between pages)

• Task 2: Modify this to use a session variable to 'remember' whether the logon was successful. Note: It should not be possible to view the source code Note: It should not be possible to bypass the logon

Page 41: Mark Dixon Page 1 19 – Passing Data between pages: Forms, Sessions, & Query Strings

Mark Dixon Page 41

Tutorial Exercise: Date• LEARNING OBJECTIVE:

pass data between pages using query strings

• Task 1: Get the Date-Time example (from the lecture) working• Task 2: Modify your page to provide another choice of background

colour.