- Basic Smalltalk Dev Environment Concepts
- Installing Seaside, and Squeak/Pharo Basics (saving and exiting, basic navigation)
- “Setting It Up Right” – Loading Useful Extensions (Except it turns out, not really)
- Creating a Seaside “Hello World”, localhost
- Interlude: Getting a Remote Server
- Packaging Your Seaside Image for Deployment
- Installing Pharo on the Server
- Closing the Loop – Deployed Pharo Hello World On Your Domain
Note: This section assumes that you’ve mastered the basics of creating new classes and methods in Pharo Smalltalk. If not, I recommend you glance through the Paro By Example, or my own previous post on Creating Classes and Methods in Pharo.
Note 2: See also the Getting Started (Pharo and Squeak) section of Dynamic Web Development with Seaside for a similar “getting started” tutorial, with screenshots.
Time to create our first “Hello World” app in Smalltalk/Seaside. Here’s the plan:
- Create a new Category and component (read: class) for our app.
- Create a method to output ‘Hello World’
- Register the component with Seaside, so it can start routing requests
- Profit! (That is, load up the page in the browser, and behold Hello World)
1.a. Creating a Seaside Component – The How
Creating a Seaside component is easy. First, create a Category for this tutorial – something like ‘RHelloWorld-Core’. Now, inside it, create a class (a subclass of WAComponent) called, for example, RHelloWorldComponent. Like this:
WAComponent subclass: #RHelloWorldComponent instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'RHelloWorld-Core'
That’s it. You’re a third of the way done (now we just need to create a method to output ‘Hello World’, and register the component with the framework, so it can start routing).
1.b. Creating a Seaside Component – The Why
So, what is a component? A Seaside component is a subclass of WAComponent (the “WA” stands for “Web Application”, incidentally). Great, but what is it really? To answer that, we need to briefly discuss how you write web apps in Seaside.
Think of a component as a “smart view”. What about Models, though? And Controllers? Well, components that are complex enough to need models, have models. That is, Models are also a concept that Seaside uses. Since we’re just writing a static “Hello World” app, we don’t need a model, we’re just going to output a literal string directly. What about Controllers, though? Don’t we need a Controller? Well, no. Not as such. Part of the answer is – Seaside (and the programming language itself) IS the Controller. It takes on the traditional role of the controller (routing requests, calling the right objects and methods, managing sessions and marshalling parameters). Seaside also has Tasks (subclasses of WATask), which are view-less control and routing objects that manipulate other components, a job traditionally reserved for Controllers in the MVC paradigm. But again, we don’t need Tasks for a Hello World tutorial.
The easiest way to understand Seaside web development is to think of it in terms of traditional desktop GUI development. Say you open up a desktop application, like Firefox or Outlook Express. You see a window, and within it, panes and toolbars, and within those, buttons and lists and other GUI widgets. In Seaside, the application/”window” is a top-level Component, which displays sub-components (toolbars, navigation menus, panes). In a desktop app, the components keep track of their own states (and have models if need be), and have Events/Actions defined for when you interact with them (click on a button, scroll the scrollbar, and so on). Same thing in Seaside. So a Seaside app is “just” a nested collection of components, which keep track of their own states, and which register events or actions that are performed when a user clicks on a link or selects a value from a pulldown, and so on.
If that’s too confusing, or if you haven’t done desktop GUI programming, don’t worry about it. In Seaside, you’ll be dealing with Views, Models when you need them, and occasionally view-less controller-like Tasks.
2. Create a method to output ‘Hello World’
Ok, let’s create a method in our RHelloWorldComponent class. (You can either put it in the default --all-- method category, or, more correctly, create a rendering method category, and add the method there).
renderContentOn: html html text: 'Hello World!'.
3. Register RHelloWorldComponent with Seaside
Lastly, we need to register our component with Seaside (specifically, the Web Application Admin class), so it can start routing requests to it.
Execute the following snippet of code:
WAAdmin register: RHelloWorldComponent asApplicationAt: 'helloworld'
Hold up. How do I execute code in Squeak/Pharo?
You can execute code from any code editor or workspace in the Pharo image. Traditionally, snippets of code (or “incantations”) are executed from a Workspace window, which just looks like a blank text editor window. To open one, click anywhere in the background of the Pharo window to bring the the World Menu, and select Workspace. You’ll see a blank text window. Now you can type arbitrary code in here, select it with your mouse, right-click on it and select Do It (d). The keyboard shortcut is Meta-d, of course.
Ok! Now, when you access the /helloworld url on your web server (in our case, running it by default on the desktop, it will be http://localhost:8080/helloworld), Seaside is going to locate the RHelloWorldComponent (since that’s what we registered as the top-level component of our application up above) and execute the renderContentOn: method.
Test it out – load it up in your browser, and you should see
displayed on a plain white html page.
Coming up next: Obtaining access to a remote server, installing Pharo on it, and packaging up your app for deployment.