dynamic elements

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

Upload: wo-community

Post on 19-May-2015

729 views

Category:

Technology


6 download

DESCRIPTION

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

TRANSCRIPT

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