Web Frameworks (was Re: Squeak book !)

Avi Bryant squeak-dev at lists.squeakfoundation.org
Tue Sep 3 16:50:10 UTC 2002


(this may be a double post, apologies if it is)

Stephen Pair wrote:

> How are continuations implemented?  Can you cope with the use of the
> back button in the browser with continuations?

> I do exactly the same thing as continuations in Swiki.net.  They are
> much nicer to work with.  I implemented it by copying the Squeak context
> stack at each reply-request interaction.  If the browser's back button
> is used, I just schedule a new Squeak Process on a saved copy of the
> stack as it existed at the previous reply-request interaction.

Yes, that's also how Seaside works (except that I use one process/session,
protected by a mutex, and swap out its context).  I also include a
transaction mechanism which lets you control for how long the back button
will actually work; if you write

session isolate:
  [self page1.
   self page2.
   self page3].
self page4.

Then you can use the back button to make, say, the call to #page1 return
as many times as you want until you hit page 4; at that point any attempt
to interact with pages 1 to 3 will just redirect you back to your current
page.

The kernel of Seaside 2.0 provides a nice abstraction for anyone who wants
to play with the idea of continuation-based sessions without committing to
Seaside or Swiki.net in their entirety; using it looks like this:

WAApplication named: 'myapp' do:
  [:session | |request|

  request := session respond:
               [:response |
               response nextPutAll: ... ].
  ...
  request := session respond:
               [:response |
               ... ]]

Which is to say:

- When someone hits the 'myapp' URL, a new session object is created and
passed into the block.

- When you call #respond: on this session object, a response object is
created and passed into the response block.  Use the response object like
a stream to create a page.

- Whenever somebody clicks a link or submits a form from that page, that
call to #respond: will return a request object with the query parameters
or form data, and the session block will continue running from that point
(presumably creating a further response at some point).  This can happen
more than once for a single call to #respond: (think back button).

This is at a way lower level than I would ever use directly, but I think
it's a good way to wrap your head around this style of development for
those coming from CGI or servlet backgrounds.

Cheers,
Avi





More information about the Squeak-dev mailing list