27
MONTREAL JUNE 30, JULY 1ST AND 2ND 2012 Dynamic Elements Johann Werner NUREG GmbH

Dynamic Elements

Embed Size (px)

DESCRIPTION

Learn how you can create your own dynamic elements to use in your WebObjects components.

Citation preview

Page 1: Dynamic Elements

MONTREAL JUNE 30, JULY 1ST AND 2ND 2012

MONTREAL JUNE 30, JULY 1ST AND 2ND 2012

Dynamic ElementsJohann WernerNUREG GmbH

Page 2: Dynamic Elements

• What are components

• Different common types

• Dynamic components

Outline

Page 3: Dynamic Elements

Components

• reusable pieces of representation + functionality

• WebObjects comes with many(e.g. WOBody, WORepetition, WOString, …)

• Wonder adds a whole bunch(e.g. AjaxModalContainer, ERXLocalizedString, …)

Page 4: Dynamic Elements

Components

Template

Info file

Component API

Code

Binding declarations

Page 5: Dynamic Elements

Standard Component

• subclass of WOComponent

• automatic push/pull of binding values

• preserves state

Page 6: Dynamic Elements

Standard Component

[…]<wo:MyString value="Hello World" />[…]

public class MyString extends WOComponent { public String value;

public MyString(WOContext context) { super(context); }}

<wo:str value="$value" />

TemplateCodeParent

Page 7: Dynamic Elements

Non-Synchronizing Component

• manual push/pull of binding values

➡ less overhead

• preserves state

Page 8: Dynamic Elements

Non-Synchronizing Component

[…]<wo:MyString value="Hello World" />[…]

public class MyString extends WOComponent { public MyString(WOContext context) { super(context); }

@Override public boolean synchronizesVariablesWithBindings() { return false; }

public String value() { return (String) valueForBinding("value"); }}

<wo:str value="$value" />

TemplateCodeParent

Page 9: Dynamic Elements

Non-Synchronizing Component

[…]<wo:MyString value="Hello World" />[…]

public class MyString extends WOComponent { public MyString(WOContext context) { super(context); }

@Override public boolean synchronizesVariablesWithBindings() { return false; }}

<wo:str value="$^value" />

TemplateCodeParent

Page 10: Dynamic Elements

Stateless Component

• manual push/pull of binding values

➡ less overhead

• no state

• single shared instance*

➡ less memory, fewer Java object-creations

Page 11: Dynamic Elements

Stateless Component

[…]<wo:MyString value="Hello World" />[…]

public class MyString extends WOComponent { public MyString(WOContext context) { super(context); }

@Override public boolean isStateless() { return true; }}

<wo:str value="$^value" />

TemplateCodeParent

Page 12: Dynamic Elements

Stateless Component

[…]<wo:MyString value="Hello World" />[…]

public class MyString extends WOComponent { private Object myVar; public MyString(WOContext context) { super(context); }

@Override public boolean isStateless() { return false; } @Override public void reset() { super.reset(); myVar = null; }}

<wo:str value="$^value" />

TemplateCodeParent

Page 13: Dynamic Elements

Dynamic Component

• subclass of WODynamicElement

• no template

➡ less memory, faster

• direct access to bindings (WOAssociation)

• direct access to children elements

• must be thread-safe!

Page 14: Dynamic Elements

Dynamic Component

[…]<wo:MyString value="Hello World" />[…]

public class MyString extends WODynamicElement { private WOAssociation value;

public MyString(String name, NSDictionary<String, WOAssociation> associations, WOElement template) { super(name, associations, template); value = associations.get("value"); }

@Override public void appendToResponse(WOResponse response, WOContext context) { WOComponent component = context.component(); response.appendContentString((String) value.valueInComponent(component)); }}

CodeParent

Page 15: Dynamic Elements

Demo

Page 16: Dynamic Elements

Demo Results

• The more specialized component class the faster it is

• Stateless and dynamic components create less Java objects

Page 17: Dynamic Elements

Standard components

• for pages, big blocks

Non Synchronizing components

• smaller components that are used often

• binding has

• different name as the variable to hold it

• no variable counterpart

When should I use…

Page 18: Dynamic Elements

Stateless components

• no state necessary

• memory optimization

Dynamic components

• no state necessary

• complex output generation

• access to child elements

When should I use…

Page 19: Dynamic Elements

Component Class Tree

Object

WOElement

WODynamicElement WOHTMLBareString WOComponent

AjaxComponent D2WComponent

D2WStateless-Component

ERXComponent

ERXNonSynchronizing-Component

ERXStateless-Component

JSComponent

AjaxDynamicElement WOHTMLDynamic-Element

WODynamicGroup

WOHTMLURLValued-Element WOInput

Page 20: Dynamic Elements

Component Class Tree

Object

WOElement

WODynamicElement WOHTMLBareString WOComponent

AjaxComponent D2WComponent

D2WStateless-Component

ERXComponent

ERXNonSynchronizing-Component

ERXStateless-Component

JSComponent

AjaxDynamicElement WOHTMLDynamic-Element

WODynamicGroup

WOHTMLURLValued-Element WOInput

Page 21: Dynamic Elements

Object

WOElement

WODynamicElement WOHTMLBareString WOComponent

AjaxComponent D2WComponent

D2WStateless-Component

ERXComponent

ERXNonSynchronizing-Component

ERXStateless-Component

JSComponent

AjaxDynamicElement WOHTMLDynamic-Element

WODynamicGroup

WOHTMLURLValued-Element WOInput

Component Class Tree

ERXLoremIpsum,ERXWOSwitch, …

AjaxHighlight,ERXWORepetition, …

AjaxHyperlink,AjaxSubmitButton, …

AjaxFunctionLink,ERXJavaScript, …

WOBody,WOFrame, …

ERXSubmitButton,WOCheckBox, …

Page 22: Dynamic Elements

Component Class Tree

Object

WOElement

WODynamicElement WOHTMLBareString WOComponent

AjaxComponent D2WComponent

D2WStateless-Component

ERXComponent

ERXNonSynchronizing-Component

ERXStateless-Component

JSComponent

ERXDynamicElement WOHTMLDynamic-Element

WODynamicGroup

WOHTMLURLValued-Element WOInputAjaxDynamicElement

Page 23: Dynamic Elements

Dynamic Base Classes

• ERXDynamicElement in ERXExtensions

• AjaxDynamicElement in Ajax

Page 24: Dynamic Elements

DEMO

Page 25: Dynamic Elements

Creating Dynamic Element

• extend ERXDynamicElement / AjaxDynamicElement

• appendToResponse

• response.appendContentString(…)

• appendTagAttributeToResponse(response, name, value)

• appendChildrenToResponse(response, context)

Page 26: Dynamic Elements

Creating Dynamic Element

• xxxValueForBinding(name, [default,] component)

• ContextData

• beforeProcessing(context)

• afterProcessing(context)

Page 27: Dynamic Elements

Q&A

MONTREAL JUNE 30, JULY 1ST AND 2ND 2012

MONTREAL JUNE 30, JULY 1ST AND 2ND 2012