Simply Lift by David Pollak - HTML preview

PLEASE NOTE: This is an HTML preview only and some elements such as links or page numbers may be incorrect.
Download the book in PDF, ePub, Kindle for a complete version.

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

Contents

iii

List of Figures

v

List of Listings

vii

I

The Lift Web Framework

1

1

Introduction

3

2

The ubiquitous Chat app

5

2.1

The View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

5

2.2

The Chat Comet component . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

6

2.3

The ChatServer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

7

2.4

User Input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

8

2.5

Chat In . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

9

2.6

Running it . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

2.7

What you don’t see . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

3

Snippets and SiteMap

11

3.1

Starting at the beginning: Boot.scala . . . . . . . . . . . . . . . . . . . . . . . . . . 11

3.1.1

LiftRules rules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

3.1.2

Properties and Run modes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

3.1.3

By convention . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

3.1.4

Misc Rules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

3.1.5

Html5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

3.2

SiteMap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

3.2.1

Defining the SiteMap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

iii

iv

CONTENTS

3.2.2

Simplest SiteMap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

3.2.3

Menu and Loc[_] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

3.2.4

Access Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

3.2.5

Hidden and Group

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

3.2.6

Submenus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

3.2.7

Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

3.2.8

Wildcards . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

3.2.9

Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

3.3

View First . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

3.3.1

Page source . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

3.3.2

Dynamic content . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

3.3.3

Surround and page chrome . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

3.3.4

Embed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

3.3.5

Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

3.4

Snippets and Dynamic content . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

3.4.1

Snippets in markup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

3.4.2

Snippet resolution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

3.4.3

Dynamic Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

3.4.4

Embedded Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

3.4.5

Param Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

3.4.6

Recursive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

3.4.7

Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

3.5

Wrap up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

4

Forms

27

4.1

Old Fashioned Dumb Forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

4.2

OnSubmit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

4.3

Stateful Snippets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

4.4

RequestVars . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

4.5

Field Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

4.6

LiftScreen

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

4.7

Wizard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

4.8

Ajax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

4.9

But sometimes Old Fashioned is good . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

4.10 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

CONTENTS

v

5

HTTP and REST

43

5.1

Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

5.2

REST the hard way . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

5.3

Making it easier with RestHelper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

5.4

A complete REST example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

5.5

Wrap Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

6

Wiring

63

6.1

Cells . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

6.2

Hooking it up to the UI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

6.3

Shared Shopping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

6.4

Wrap up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76

7

Core Concepts

77

7.1

Snippets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78

7.1.1

Snippet NodeSeq => NodeSeq . . . . . . . . . . . . . . . . . . . . . . . . . . 78

7.1.2

Snippet instances . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

7.1.3

Multiple methods on a snippet class . . . . . . . . . . . . . . . . . . . . . . . . 79

7.1.4

Inter-snippet communication . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

7.1.5

Recursive Snippets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

7.1.6

Snippet parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

7.2

Box/Option . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80

7.3

S/SHtml . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84

7.4

Boot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84

7.5

SiteMap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84

7.6

GUIDs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84

7.6.1

How GUIDs are generated . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84

7.6.2

Where they are used . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84

7.7

LiftRules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84

7.8

SessionVars and RequestVars . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84

7.9

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

8

Common Patterns

91

8.1

Localization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92

8.1.1

Localizing Templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92

8.1.2

Resource Lookup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92

8.1.3

Accessing Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93

8.1.4

Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93

8.2

Dependency Injection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94

8.2.1

Lift Libraries and Injector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94

8.2.2

Lift WebKit and enhanced injection scoping . . . . . . . . . . . . . . . . . . . 95

8.2.3

Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96

8.3

Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96

8.4

HtmlProperties, XHTML and HTML5 . . . . . . . . . . . . . . . . . . . . . . . . . . . 98

8.4.1

XHTML via OldHtmlProperties . . . . . . . . . . . . . . . . . . . . . . . . 98

8.4.2

HTML5 via Html5Properties . . . . . . . . . . . . . . . . . . . . . . . . . . 98

8.4.3

Changing behavior mid-session or mid-request . . . . . . . . . . . . . . . . . 99

9

Built-in Snippets

101

9.1

CSS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102

9.2

Msgs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102

9.3

Msg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102

9.4

Menu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102

9.5

A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102

9.6

Children . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102

9.7

Comet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102

9.8

Form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102

9.9

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

10 SiteMap

103

11 REST

105

12 MVC (If you really want it)

109

13 From MVC

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

II

Recipes

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

16 Ajax Forms

121

17 Protecting REST APIs

123

17.1 Problem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123

17.2 Solution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123

viii

CONTENTS

18 URI-based locale selection

125

18.1 Problem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125