Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 5.3

WebWork: Strutting the OpenSymphony way - Mike Cannon-Brookes

Home is a pull-based MVC framework focused on componentization and code reuse. It is currently in beta, but is being used by several opensource projects and a few commercial projects in development. This is the second generation of WebWork, which was originally developed by Rickard Oberg, and in this release, what was WebWork has been broken into two projects, XWork and Home.

XWork is a generic command pattern implementation with absolutely NO ties to the web. XWork provides many core services, including interceptors, meta-data based validation, type conversion, a very powerful expression language (OGNL - the Object Graph Notation Language) and an Inversion of Control (IoC) container implementation.

WebWork provides a layer on top of XWork to do HTTP request / response handling. It includes a ServletDispatcher to turn HTTP requests into calls to an Action, session and application scope mapping, request parameter mapping, view integration with various web view technologies (JSP, Velocity, FreeMarker, JasperReports), and user interface components in the form of JSP tags and Velocity macros wrapped around reusable UI components.

An Action is the basic unit of work in WebWork. It is a simple command object that implements the Action Interface, which has only one method: execute(). Action implementers can extend the ActionSupport class, which provides i18n localization of messages (with one ResourceBundle per Action class and searching up the inheritance tree) and error message handling including class level and field level messages.

Actions can be developed in one of two styles: Model driven or field driven. Model driven Actions expose a model class via a get method, and the form fields refer directly to the model properties using expressions like "pet.name". XWork uses Ognl (the Object Graph Notation Language) as its expression language, and when rendering the page, this expression will translate to

...

getPet().getName().

...

When

...

setting

...

properties,

...

this

...

will

...

translate

...

to

...

getPet().setName().

...

This

...

style

...

of

...

development

...

allows

...

for

...

a

...

great

...

deal

...

of

...

model

...

reuse

...

and

...

can

...

allow

...

you

...

to

...

directly

...

edit

...

your

...

domain

...

objects

...

in

...

your

...

web

...

pages,

...

rather

...

than

...

needing

...

a

...

translation

...

layer

...

to

...

form

...

beans.

...

Field

...

driven

...

Actions

...

have

...

their

...

own

...

properties

...

which

...

are

...

used

...

in

...

the

...

view.

...

The

...

action's

...

execute()

...

method

...

collates

...

the

...

properties

...

and

...

interacts

...

with

...

the

...

model.

...

This

...

can

...

be

...

very

...

useful

...

when

...

your

...

form

...

and

...

model

...

are

...

not

...

parallel.

...

Even

...

in

...

this

...

case,

...

the

...

powerful

...

expression

...

language

...

in

...

WebWork

...

can

...

allow

...

you

...

to

...

compose

...

your

...

form

...

fields

...

into

...

aggregate

...

beans,

...

such

...

as

...

an

...

address

...

bean,

...

which

...

you

...

can

...

reuse

...

to

...

simplify

...

your

...

action

...

classes.

...

WebWork

...

allows

...

you

...

to

...

build

...

your

...

own

...

reusable

...

UI

...

components

...

by

...

simply

...

defining

...

a

...

Velocity

...

template.

...

This

...

is

...

how

...

the

...

pre-built

...

components

...

of

...

WebWork

...

are

...

built

...

for

...

common

...

components

...

such

...

as

...

text

...

fields,

...

buttons,

...

forms,

...

etc.

...

and

...

made

...

available

...

from

...

any

...

view

...

type

...

(either

...

JSP

...

or

...

Velocity

...

at

...

the

...

moment).

...

These

...

components

...

are

...

skinnable

...

by

...

defining

...

multiple

...

templates

...

for

...

the

...

same

...

component

...

in

...

different

...

paths.

...

If

...

your

...

components

...

include

...

the

...

default

...

header

...

and

...

footer

...

templates

...

that

...

are

...

used

...

in

...

the

...

pre-built

...

templates,

...

then

...

they

...

will

...

inherit

...

the

...

ability

...

to

...

automatically

...

handle

...

displaying

...

error

...

messages

...

beside

...

the

...

problem

...

form

...

field.

...

These

...

custom

...

UI

...

components

...

are

...

especially

...

handy

...

for

...

reusing

...

templates

...

which

...

handle

...

your

...

custom

...

model

...

types

...

or

...

for

...

things

...

like

...

date

...

pickers,

...

which

...

Mike

...

showed

...

as

...

an

...

example.

...

Interceptors

...

in

...

XWork

...

allow

...

common

...

code

...

to

...

be

...

applied

...

around

...

(before

...

and/or

...

after)

...

action

...

execution.

...

This

...

is

...

what

...

Mike

...

calls

...

"Practical

...

AOP".

...

Interceptors

...

help

...

to

...

decouple

...

and

...

componentized

...

your

...

code.

...

Interceptors

...

can

...

be

...

organized

...

into

...

stacks,

...

which

...

are

...

lists

...

of

...

interceptors

...

to

...

be

...

applied

...

in

...

sequence,

...

and

...

can

...

be

...

applied

...

to

...

actions

...

or

...

whole

...

packages.

...

Much

...

of

...

the

...

core

...

functionality

...

of

...

XWork

...

and

...

WebWork

...

is

...

implemented

...

as

...

Interceptors.

...

The

...

common

...

basic

...

examples

...

of

...

Interceptors

...

are

...

timing

...

and

...

logging,

...

and

...

these

...

are

...

built

...

in

...

with

...

XWork.

...

Mike

...

went

...

through

...

an

...

example

...

of

...

an

...

interceptor

...

to

...

identify

...

users

...

of

...

events

...

via

...

email.

...

This

...

interceptor

...

has

...

its

...

own

...

external

...

configuration

...

file

...

which

...

specifies

...

which

...

users

...

are

...

interested

...

in

...

which

...

events,

...

and

...

it

...

compares

...

this

...

configuration

...

with

...

the

...

action

...

invocations

...

passing

...

through

...

it

...

to

...

determine

...

if

...

any

...

messages

...

should

...

be

...

sent.

...

XWork's

...

validation

...

framework

...

allows

...

for

...

decoupled

...

validation

...

of

...

action

...

properties.

...

It

...

is

...

implemented

...

as

...

an

...

Interceptor

...

and

...

reads

...

external

...

XML

...

files

...

which

...

define

...

the

...

validations

...

to

...

be

...

applied

...

to

...

the

...

Action.

...

Error

...

messages

...

are

...

loaded

...

from

...

the

...

Action's

...

localized

...

messages

...

and

...

flow

...

through

...

to

...

the

...

UI.

...

Validator

...

classes

...

can

...

be

...

plugged

...

in

...

to

...

add

...

to

...

the

...

set

...

of

...

bundled

...

validators.

...

The

...

bundled

...

validators

...

include

...

required

...

field

...

and

...

required

...

String

...

validators,

...

range

...

validators

...

for

...

Dates

...

and

...

numbers,

...

and

...

email

...

and

...

URL

...

validators.

...

XWork

...

also

...

includes

...

expression

...

validators

...

at

...

both

...

the

...

Action

...

and

...

field

...

level

...

which

...

allow

...

you

...

to

...

use

...

any

...

Ognl

...

expression

...

as

...

the

...

validation.

...

Inversion

...

of

...

Control

...

(IoC)

...

removes

...

the

...

burden

...

of

...

managing

...

components

...

from

...

your

...

code

...

and

...

puts

...

it

...

on

...

the

...

container.

...

The

...

container

...

takes

...

care

...

of

...

managing

...

component

...

lifecycle

...

and

...

dependencies.

...

EJB

...

is

...

an

...

example

...

of

...

IoC,

...

but

...

with

...

limited

...

services.

...

IoC

...

promotes

...

simplicity

...

and

...

decoupling

...

of

...

your

...

components

...

and

...

encourages

...

your

...

classes

...

to

...

be

...

smaller

...

and

...

more

...

focused.

...

Unit

...

testing

...

is

...

also

...

simplified,

...

as

...

you

...

can

...

just

...

supply

...

MockObject

...

instances

...

of

...

the

...

services

...

your

...

code

...

depends

...

upon

...

during

...

testing.

...

XWork

...

and

...

WebWork

...

provide

...

a

...

web-native

...

IoC

...

container

...

which

...

manages

...

component

...

dependencies.

...

In

...

WebWork

...

IoC

...

is

...

implemented

...

as

...

lifecycle

...

managers

...

(SessionLifecycleListener,

...

etc)

...

and

...

an

...

Interceptor.

...

There

...

are

...

4

...

component

...

scopes

...

in

...

WebWork

...

IoC:

...

Application,

...

HTTP

...

Session,

...

HTTP

...

Request,

...

and

...

Action

...

invocation.

...

IoC

...

in

...

XWork

...

/

...

WebWork

...

is

...

purely

...

optional,

...

so

...

you

...

can

...

use

...

it

...

if

...

you

...

want

...

it.

...

XWork

...

/

...

WebWork

...

allows

...

for

...

sets

...

of

...

Actions

...

and

...

their

...

views

...

to

...

be

...

bundled

...

as

...

a

...

jar

...

file

...

and

...

reused.

...

Your

...

main

...

xwork.xml

...

file

...

can

...

include

...

the

...

xml

...

configuration

...

file

...

of

...

the

...

jar

...

file

...

because

...

they

...

are

...

included

...

from

...

the

...

classpath.

...

Similarly,

...

if

...

your

...

views

...

are

...

I have to admit, when Mike mentioned this feature, I thought he was crazy. I didn't say anything at the session, but asked him about it later, and he said "didn't you write the package include stuff?" I'll take it as a good sign that things can be used in a different way than was imagined. (smile)

Mike finished up with a comparison of WebWork vs.

...

...

...