6 Feb 2002PL Day1 Programming Interactive Web Scripts Matthias Felleisen PLT
6 Feb 2002PL Day2 PLT principles of program design –introductory –script development principles of programming languages –design –analysis –correctness programming environments & tools
6 Feb 2002PL Day3 PLT: First Session principles of program design –introductory –script development: dynamic Web content principles of programming languages –design –analysis –correctness programming environments & tools
6 Feb 2002PL Day4 Dynamic Web Content USA Today says: “… more than half the pages on the Web are generated on demand.” (July 2000) Why? –connection to up-to-date database –determining consumer information –on-line experiments –games
6 Feb 2002PL Day5 Dynamic Web Content Technology: Programming, Contents Programming first: –CGI –Java Servlets Contents first –Active Server Pages –Java Server Pages
6 Feb 2002PL Day6 Dynamic Web Content What is a CGI script? a servlet? How do they work? Why is it difficult to design interactive ones? Can we automate their development? What does this teach us about GUI dialogues in general?
6 Feb 2002PL Day7 The Common Gateway Interface
6 Feb 2002PL Day8
6 Feb 2002PL Day9 Interactive Web Scripts Some URLs point to programs. The server invokes the program, which writes a page to the standard output port and then terminates. The server sents the page to the client that requested the URL.
6 Feb 2002PL Day10 Interactive Web Scripts: Hello World (printf "My First CGI Page~n”) (printf "Hello World") Plain Program (output-http-headers) (write-xml/content (xexpr->xml '(html (title "My First CGI Page") (body "Hello World")))) Web Script
6 Feb 2002PL Day11 Interactive Web Scripts: Server Status (output-http-headers) (write-xml/content (xexpr->xml `(html (title "Server Status") (body,(read-line (first (process "uptime"))))))) (printf "Server Status: ~a~n" (read-line (first (process "uptime")))))))
6 Feb 2002PL Day12 Interactive Web Scripts: Multiply-by-10.com (output-http-headers) (define (get-number) (get-binding ‘NUM (bindings))) (write-xml/content (xexpr->xml `(html (title "Multiply-by-10.com") (body "the result is: ",(* (get-number) 10))))) (define (get-number) (printf "Enter a number ") (flush-output) (read)) (printf "Multiply-by-10.com") (printf "the result is: ~a" (* (get-number) 10) )
6 Feb 2002PL Day13 Interactive Web Scripts: Multiply-by-10.com Multiply-by-10.com Multiply <form method="get" action=" Enter a number Where do babies come from?
6 Feb 2002PL Day14 Interactive Web Scripts: Multiply-by-10.com
6 Feb 2002PL Day15 Interactive Web Scripts: Multiply.com (output-http-headers) … (write-xml/content (xexpr->xml `(html (title "Multiply.com") (body "the result is: ",(* (get-number) (get-number)))))) (define (get-number) (printf "Enter a number ") (flush-output) (read)) (printf "Multiply.com") (printf "the result is: ~a" (* (get-number) (get-number)) )
6 Feb 2002PL Day16 Interactive Web Scripts: DontMultiply.com A CGI script terminates after producing a page. To query the consumer, the script must produce a page with a form. Ergo: To interact, a CGI program must terminate.
6 Feb 2002PL Day17 Interactive Web Scripts: DontMultipy.com The natural structure of an interactive Web program doesn’t work naturally with the Common Gateway Interface.
6 Feb 2002PL Day18 Interactive Web Scripts: Interaction Current solution: programmers invert program by hand. A program with N interaction points becomes a set of N programs. The programs communicate all necessary data “manually”.
6 Feb 2002PL Day19 Interacting with Web Scripts
6 Feb 2002PL Day20 Interacting with Web Scripts
6 Feb 2002PL Day21 Interacting with Web Scripts
6 Feb 2002PL Day22 Interacting with Web Scripts And now we go BACK:
6 Feb 2002PL Day23 Interacting with Web Scripts
6 Feb 2002PL Day24 Interactive Web Scripts: Multiply.com Multiply Multiply <form method="get" action=" Enter a number
6 Feb 2002PL Day25 Interactive Web Scripts: cgi-first.ss (output-http-headers) (write-xml/content (xexpr->xml `(html (title "The Multiply Page") (body `(form ([method "get"][action " (p "Enter the second number") (input ([type "hidden"][name "first"] [value,(get-number)])) (input ([type "text"] [name "second"][value "1"])))))))
6 Feb 2002PL Day26 Interactive Web Scripts: Multiply.com Multiply Multiply <form method="get" action=" Enter the second number
6 Feb 2002PL Day27 Interactive Web Scripts: cgi-second.ss (output-http-headers) (write-xml/content (xexpr->xml `(html (title "The Multiply Page") (body "the result is: ",(* (get-number 'first) (get-number ’NUM))))))))
6 Feb 2002PL Day28 Interactive Web Scripts and Continuations (define multiply (lambda (x y) (* x y))) (define multiply (lambda (x) (lambda (y) (* x y)))) (define multiply-by-22 (lambda (y) (* 22 y)))
6 Feb 2002PL Day29 Interactive Web Scripts and Continuations cgi scriptconsumer cgi scriptconsumer the back button
6 Feb 2002PL Day30 Interactive Web Scripts and Continuations cgi scriptconsumer cgi scriptconsumer the back button cloning
6 Feb 2002PL Day31 PLT’s Interactive Web Script Solution 1: Design Web server that supports coroutining. Use continuation objects. Graunke et al. ESOP 2001 Solution 2: Design transformation that automatically inverts programs with N interaction points into N programs. Graunke et al. ASE 2001 & Jacob Matthews PL Day 2002
6 Feb 2002PL Day32 PLT’s Interactive GUI Scripts Generalize this technique to certain GUI programs. Graunke and Krishnamurthi, ICSE Graunke PL Day 2002.