Simply Lift
David Pollak
September 8, 2011
ii
Copyright © 2010-2011 by David Pollak
This document is licensed Creative Commons Attribution, Non Commercial, No Derivatives:
http://creativecommons.org/licenses/by-nc-nd/3.0/
Contents
iii
v
vii
1
3
5
The View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
The Chat Comet component . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
The ChatServer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
User Input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
Chat In . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
Running it . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
What you don’t see . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
11
Starting at the beginning: Boot.scala . . . . . . . . . . . . . . . . . . . . . . . . . . 11
LiftRules rules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Properties and Run modes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
By convention . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Misc Rules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Html5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
SiteMap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Defining the SiteMap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
iii
iv
CONTENTS
Simplest SiteMap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Menu and Loc[_] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Access Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Submenus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Wildcards . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
View First . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Page source . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Dynamic content . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Surround and page chrome . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Embed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Snippets and Dynamic content . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Snippets in markup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Snippet resolution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Dynamic Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Embedded Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Param Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Recursive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Wrap up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
27
Old Fashioned Dumb Forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
OnSubmit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Stateful Snippets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
RequestVars . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Field Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Wizard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Ajax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
But sometimes Old Fashioned is good . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
4.10 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
CONTENTS
v
43
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
REST the hard way . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Making it easier with RestHelper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
A complete REST example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Wrap Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
63
Cells . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
Hooking it up to the UI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
Shared Shopping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
Wrap up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
77
Snippets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Snippet NodeSeq => NodeSeq . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Snippet instances . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Multiple methods on a snippet class . . . . . . . . . . . . . . . . . . . . . . . . 79
Inter-snippet communication . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Recursive Snippets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Snippet parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Box/Option . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
S/SHtml . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Boot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
SiteMap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
GUIDs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
How GUIDs are generated . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Where they are used . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
LiftRules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
SessionVars and RequestVars . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Helpers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
7.10 CSS Selector Transforms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
7.11 Client-side behavior invoking server-side functions . . . . . . . . . . . . . . . . . . . 89
7.12 Ajax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
7.13 Comet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
vi
CONTENTS
7.14 LiftActor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
7.15 Pattern Matching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
7.16 Type safety . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
7.17 Page rewriting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
7.18 Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
91
Localization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Localizing Templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Resource Lookup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Accessing Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Dependency Injection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
Lift Libraries and Injector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
Lift WebKit and enhanced injection scoping . . . . . . . . . . . . . . . . . . . 95
Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
HtmlProperties, XHTML and HTML5 . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
XHTML via OldHtmlProperties . . . . . . . . . . . . . . . . . . . . . . . . 98
HTML5 via Html5Properties . . . . . . . . . . . . . . . . . . . . . . . . . . 98
Changing behavior mid-session or mid-request . . . . . . . . . . . . . . . . . 99
101
CSS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
Msgs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
Msg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
Menu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
Children . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
Comet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
Form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
Ignore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
9.10 Loc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
9.11 Surround . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
9.12 TestCond . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
CONTENTS
vii
9.13 Embed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
9.14 Tail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
9.15 WithParam . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
9.16 VersionInfo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
9.17 SkipDocType . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
9.18 XmlGroup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
9.19 LazyLoad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
9.20 WithResourceId . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
103
105
12 MVC (If you really want it)
109
111
13.1 First things first . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
13.2 Making a SiteMap entry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
13.3 Creating the view . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
13.4 Creating the Snippet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
13.5 Getting Ajaxy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
13.6 Next Steps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
115
14 Dynamic html tables created from DB.runQuery()
117
14.1 Problem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
14.2 Solution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
15 Dynamically choosing content
119
15.1 Problem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
15.2 Solution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
121
123
17.1 Problem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
17.2 Solution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
viii
CONTENTS
125
18.1 Problem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125