SlideShare a Scribd company logo
1 of 85
Download to read offline
<Insert Picture Here>

18 Invaluable Lessons About ADF Faces Page
Lifecycle
Steven Davelaar
twitter:@stevendavelaar
blogs: www.ateam-oracle.com and blogs.oracle.com/jheadstart
Oracle Fusion Middleware Architects Team (the “A-team”)
Agenda
• Worls’s most comprehensive Hello World Demo
Just Say Hello – JSF Lifecycle Initial
1. Restore View

UI Component Tree
RichPanelHeader
RichPanelGroupLayout
RichPanelFormLayout
RichInputText
RichInputDate

6. Render
Response
JSF Lifecycle - Postback
1. Restore View
2. Apply Request Values

richInputText.setSubmittedValue(“Steven”)
richInputDate.setSubmittedValue(“04-12-2012”)
JSF Lifecycle - Postback
1. Restore View
2. Apply Request Values
3. Process Validations

• Validate and convert (if needed) name and date
• Call richInputText.setValue() with converted value
if valid
• Clear submittedValue
• Queue valueChange event (if applicable)
JSF Lifecycle Postback
1. Restore View
value=“#{viewScope.HelloBean.name}
value=“#{viewScope.HelloBean.date}
2. Apply

Request Values

3. Process Validations
4. Update Model

• Call HelloBean.setName with component value
• Call HelloBean.setDate with component value
• Clear submitted and (local) component value
JSF Lifecycle Postback
1. Restore View
2. Apply Request Values
actionListener=“#{viewScope.helloBean.sayHello}

3. Process Validations
4. Update Model
5. Invoke Application

• Call HelloBean.sayHello
JSF Lifecycle - Postback
1. Restore View
2. Apply Request Values
3. Process Validations
4. Update Model
5. Invoke Application
6. Render Response
Current Lifecycle Phase in JDeveloper
while Debugging
Just Say Hello – Reset Values

• Clicking the Reset button should not fire validation,
and should clear the Name and Date fields
• We need a lifecycle shortcut that bypasses validation
(both client-side and server-side) and model update
JSF Lifecycle – Postback Immediate
•

Lesson 1: An immediate command executes the
action and actionListener in phase 2. Apply Request
Values and then jumps to phase 6. Render
Response, skipping validation and model update
phases.
JSF Lifecycle – Postback Immediate
1. Restore View
2. Apply Request Values

• richInputText.setSubmittedValue(“Steven”)
• richInputDate.setSubmittedValue(“04-12-2012”)
• Call HelloBean.reset
JSF Lifecycle – Postback Immediate
1. Restore View
2. Apply Request Values
6. Render Response

•
•
•
•

We clicked the Reset button .
Name and date are cleared in HelloBean .
But we still see the old values in the page!
How come??
JSF Lifecycle – Postback Immediate
• Lesson 2: When executing an immediate command, the
UI components do NOT re-evaluate their underlying
value binding, possibly showing stale data
• How to force the UI components to do this?
• Three options
• Use af:resetActionListener
• Use oracle.adf.view.rich.util.ResetUtils.reset()
• UIComponent.resetValue()

• On an individual UI component, the reset action
• Clears the submittedValue
• Clears local component value so value binding is re-evaluated
• Marks the component as valid
Using af:resetActionListener
• Easiest option, no Java method needed
• Automatically added when dragging and dropping a
Rollback operation from Data Control Palette
• Lesson 3: af:resetActionListener does NOT reset child
regions, use ResetUtils.reset() instead.
Using ResetUtils.reset(UIComponent
startComponent)
• Reset method takes one
parameter: the start UI
Component to reset

• However, this is not the REAL start component
• Is used to traverse up the component tree
• until a region, form, subform, popup, carrousel or
panelCollection is found
• that component is used as the real starting point
Agenda
• Worls’s most comprehensive Hello World Demo
Say Hello Suggestions
• Suggest the type of greeting based on a person’s
name
Say Hello Suggestions – Will this work?

Not really ..
Say Hello Suggestions – Will
immediate=true work?

• No, model is no longer updated, getName() will return
null (or old model value): remember lesson 1!
• AND (wrong) greeting will NOT be displayed anyway:
remember lesson 2!
Say Hello Suggestions – Challenges
• We need immediate=true to prevent premature
validation of greeting field and date field
• We need to refresh the greeting field properly
• We need somehow to get hold of value entered in
name field
• We do want required validation on name field
----------------------------------------------------------------------• We already learned how to refresh the greeting field
with underlying model value ..
•
we need to call resetValue on the greeting
inputText
Say Hello Suggestions – Use Binding
Property to Refresh Greeting Field
Say Hello Suggestions – Greeting Field
Refreshed

• At least the suggested greeting is displayed now,
although it is still the wrong default greeting because
getName() returns null in the suggest method
Side Step – More About Component
Binding
• The getter/setter methods generated by JDeveloper
when using binding property are wrong
• Code is not serializable, causing errors in clustered env.
• UI Tree not released properly, more memory usage
• UI component might be reused in UI Tree of another page
(fragment)
• This can happen EVEN with request-scoped and
backingBean-scoped beans

• Lesson 4: Always use ComponentReference in
component binding getter/setter methods
• Lesson 5: Never use component binding in sessionscoped bean, even ComponentReference won’t be
safe then.
Side Step – Correct Code for
Component Binding Methods
Side Step – More About Component
Binding
• Component binding is often overly used
• Use UIManager pattern from Duncan Mills to avoid
unnecessary component binding
• https://blogs.oracle.com/groundside/entry/the_uimanager_pattern

• You can also find a component by id programmatically
using invokeOnComponent API
• See (google for) “ADF Code Corner sample 58”
• Starting UI component should be as low as possible in UI Tree,
starting at UIViewRoot can kill performance with large, multi-tab
pages
Say Hello Suggestions – Challenges
• We need immediate=true to prevent premature
validation of greeting field and date field
• We need to refresh the greeting field properly
• We need somehow to get hold of value entered in
name field
• We do want required validation on name field
• ----------------------------------------------------------------------• May be we can use a valueChangeListener on name
field?
• May be we can use immediate=true on the name
field?
Say Hello Suggestions – Using a
ValueChangeListener

• ValueChangeListener fires in phase 3. Process
Validations
• That phase is skipped with immediate command
• Now, let’s set immediate=true on name field
Say Hello Suggestions – Using a
ValueChangeListener

• Lesson 6: When immediate=“true” on an Editable UI
Component
• Component validation is processed in phase 2. Apply
Request Values
• The validated and converted value is stored on the
component
• valueChangeListener is also called in this phase

• YES, now it works!
• But wait .
Say Hello Suggestions – Using
immediate on editable component
• If we enter all fields except name, then Reset button
no longer works!
• Why? Because of Lesson 6: name field now validated
in Apply request Values, before reset command is
executed. Arrrrggghhh!
Say Hello Suggestions – Using
Immediate on Editable Component
• This makes setting immediate=“true on an editable UI
component pretty useless, because then the general
rule
“Validations are skipped when setting a command
component to immediate=“true”
is no longer true!
• Lesson 7: Never set immediate=“true” on an editable
UI component, it prevents you from
cancelling/abandoning a page.
Say Hello Suggestions – Back to the
Challenges
• We need immediate=true to prevent premature
validation of greeting field and date field
• We need to refresh the greeting field properly
• We need somehow to get hold of value entered in
name field
• We do want required validation on name field
----------------------------------------------------------------------• Not a solution: valueChangeListener and
immediate=true on name field
• New solution: we need to get the value entered for
name directly from the UI component
Say Hello Suggestions – Use
Component Binding to Get Name Value

• YES, this works, and the reset button still works too!
• But wait . it works too well
• Method should not execute when name empty, or less than 4 chars
Say Hello Suggestions – Use
Component Binding to Get Name Value
• We are using the raw, possibly invalid value by calling
getSubmittedValue() on the name field
• We need to do programmatically what normally
happens automatically
3. Process Validations
in phase 3
• Validate and convert (if needed) name and date
• Call richInputText.setValue() with converted value
if valid
• Clear submittedValue
• Queue valueChange event (if applicable)
Say Hello Suggestions – Use
Component Binding to Get Name Value
• Lesson 8: You can programmatically execute JSF
lifecycle phases 3 and 4 on a component:
• comp.processValidations(FacesContext.getCurrentInstance())
• comp.processUpdates(FacesContext.getCurrentInstance())
Say Hello Suggestions – Optimizing
Using Partial Page Rendering (PPR)
• When clicking the suggest button, only the greeting
field needs to be refreshed in browser.
• Easily implemented using ADF Faces PPR
Agenda
• Worls’s most comprehensive Hello World Demo
Sub Forms of Hello Saying
• It was quite a challenge to get this greeting
suggestion implemented
• Is there really no easier way to do this?
• The af:subform tag represents an independently
submittable region of a page. The contents of a
subform will only be validated (or otherwise
processed) if a component inside of the subform is
responsible for submitting the page.
• Sounds promising, let’s try!
Sub Forms of Hello Saying – Try 1
Sub Forms of Hello Saying – Try 1
Sub Forms of Hello Saying –Try 1
Findings
• Lesson 9: Items not in any sub-form are still
processed in lifecycle when submitting a sub-form.
• Fix: put all items in sub-forms

• Lesson 10: Layout messed up when using sub form
• Fix: Each subform must contain its own panelFormLayout,
align accross panelFormLayouts using labelWidth property

• Submitting the main form, does not submit items in
sub-form
• Solution: set property default=“true” on the subform
Sub Forms of Hello Saying – Try 2
Sub Forms of Hello Saying – Try 2
Findings

•
•
•
•

Suggest button now works with empty date!
Layout cleaned up!
Pressing enter key on name shows suggested greeting!
But wait . what is functionally different from previous
samples?
• Greeting field is not required, what if we fix that?
Sub Forms of Hello Saying – Try 2
Findings

• Let’s try to move greeting field to other subform
Sub Forms of Hello Saying – Try 3
Sub Forms of Hello Saying – Try 3
Findings

• No validation error on greeting field!
• But greeting no longer shown
• Lesson 11: Partial page refresh does not work across
sub-forms
• Sub forms do not work for this use case
Sub Forms of Say Hello - Conclusion

• Sub forms can be used in corner cases to avoid
premature validation
• Sub forms most useful for “default command” behavior
Agenda
• Worls’s most comprehensive Hello World Demo
Auto-Suggested Hello Saying
• Auto-suggest the type of greeting when tabbing out
the name field
Auto-Suggested Hello Saying – Will
this work?

• Will field validations fire prematurely?
• Will greeting field be refreshed correctly?
Auto-Suggested Hello Saying – ADFoptimized lifecycle
• Using autoSubmit = true on an editable UI
Component kicks of the ADF-Optimized JSF Lifecycle
• This optimized lifecycle always:
• fires a partial submit
• By default will only process and refresh the autoSubmitted
component itself
• Additional UI components will be processed in this lifecycle
when partialTriggers property points to autoSubmitted item

• So, with code in previous slide no premature
validations fire but greeting field is not refreshed
• So, what will happen when we add partialTrigger
property to greeting field?
Auto-Suggested Hello Saying –
Refreshing Greeting Field

• Greeting field now processed as well -> validation
error when null
• Solutions:
1. make greeting optional
2. add greeting programmatically as partial target
Auto-Suggested Hello Saying – Making
Greeting Optional
• Making greeting optional seems to work
• But it doesn’t work always
• It does not work when user clears greeting first
• User clears existing greeting
• User navigates back to name field and changes the name
• User tabs out name field, nothing happens!

• Why??
What happens when greeting is cleared
1. Restore View
2. Apply Request Values
3. Process Validations

• Calls valueChangeListener method
HelloBean.nameChanged which in turn
calls.setGreeting(“Hi”)
What happens when greeting is cleared
1. Restore View
2. Apply Request Values
3. Process Validations
4. Update Model

• Calls HelloBean.setGreeting(null)
• Overrides the value set by valueChangeListener
method .
How to prevent suggested greeting is
overridden again
• The JSF Model Update phase only updates
underlying model value when the local component
value differs from the model value
• We need to reset the local UI Component value in
namedChanged method
Auto-Suggested Hello Saying –
Refreshing Greeting Field In Code
Auto-Suggested Hello Saying –
Lessons Learned
12. Auto-submitted fields use ADF optimized lifecycle
preventing premature validation on other fields
13. The components that are processed by ADF optimized
lifecycle can be configured using partialTrigger
property. This is known as Cross Component Refresh
14. Values set in value change listeners might be
overridden in model update phase if not coded
correctly
15. Use programmatic PPR instead of partialTriggers
property to prevent components to be processed by
ADF optimized lifecycle, avoiding premature validation
New in JDeveloper 12c: the af:target
tag!
• Provides a declarative way to allow a component to
specify the list of targets it wants executed and
rendered when an event is fired by the component.
• The list of components on which the JSF lifecycle will
be executed, can be defined separately from the list
of components that needs to be re-rendered
(refreshed).
• Let’s revisit our previous examples .
JSF Lifecycle – Postback Immediate
1. Restore View
2. Apply Request Values
6. Render Response

•
•
•
•

We clicked the Reset button .
Name and date are cleared in HelloBean .
But we still see the old values in the page!
How come??
JSF Lifecycle – Postback Immediate
• Lesson 2: When executing an immediate command, the
UI components do NOT re-evaluate their underlying
value binding, possibly showing stale data
• How to force the UI components to do this?
• Three options
• Use af:resetActionListener
• Use oracle.adf.view.rich.util.ResetUtils.reset()
• UIComponent.resetValue()

• On an individual UI component, the reset action
• Clears the submittedValue
• Clears local component value so value binding is re-evaluated
• Marks the component as valid
Implementing Reset/Cancel
Functionality using af:target tag!

• No need to set immediate=true on the button
• No issues with fields not being refreshed
• No issues with subregions not being refreshed when
using af:resetActionListener
Say Hello Suggestions
• Suggest the type of greeting based on a person’s
name
Say Hello Suggestions – Challenges
• We need(ed) immediate=true to prevent premature
validation of greeting field and date field
• We need to refresh the greeting field properly
• We need somehow to get hold of value entered in
name field
• We do want required validation on name field
----------------------------------------------------------------------• With af:target tag this becomes easy!
Suggest Greeting Using af:target tag
Auto-Suggested Hello Saying
• Auto-suggest the type of greeting when tabbing out
the name field
Auto-Suggest Greeting Using af:target
tag
The af:target tag is your friend!
• Lesson 16: When using JDeveloper 12c, use the
af:target tag to easily define which components
should be validated and submitted, and which
components should be re-rendered.
Agenda
• A bit more on the ADF optimized lifecycle
ADF Optimized Lifecycle
• ADF Faces sets boundaries on the page that allow
the JSF lifecycle to run just on components within the
boundary
• As we learned before, when autosubmitting an
editable field, the boundary is the component itself
• Boundaries can be changed by using partialTriggers
property
ADF Optimized Lifecycle
• A number of component events always trigger the
optimized lifecycle
• Events on table, treeTable: disclosureEvent, selectionEvent,
rangeChangeEvent, columnSelectionEvent, etc
• Events on tree: disclosureEvent, selectionEvent
• Events on showDetailIHeader: disclosureEvent
• Events on panelAccordion (showDetailIItem) :
disclosureEvent
• Events on components inside panelCollection (toolbar,
context menu, etc)
•
Optimized Lifecycle of Employees –
Overflow Right

• When clicking on another row
• Overflow area should be refreshed
• Changes in overflow area should be preserved
Optimized Lifecycle of Employees –
Configuring optimized lifecycle

• When clicking on another row, changes in overflow
area are now preserved
Optimized Lifecycle of Employees –
Adding New Employee

• Clicking the New Employee button should also preserve
changes made in table overflow area
• Easy works out-of-the-box
• Now, let’s move that button to panelCollection toolbar
Optimized Lifecycle of Employees –
Adding New Employee

• Now, it will NOT work out-of-the-box
• Button inside panelCollection will trigger optimized lifecycle
• Changes in table overflow area will not be submitted

• What is the “obvious” fix?
Optimized Lifecycle of Employees –
Adding New Employee
• “Obvious” fix is to add button id to partialTriggers
property of panelFormLayout
• Lesson 17: To add components that should be
processed in optimized lifecycle, the partialTrigger
property must point to the boundary component
• In this use case, the boundary component of the
optimized lifecycle is the panelCollection
• So, “obvious” fix does not work, this will work:
• Note that you can use cascading partialTriggers
• If panelCollection partialTriggers property refers to table,
panelFormLayout only needs to refer to panelCollection
Agenda
• Worls’s most comprehensive Hello World Demo
Say Hello with a Song
Say Hello with a Song
• Choose Song checkbox will need autoSubmit = true
• Question 1: Can we use a partialTrigger property or
do we need programmatic PPR to show/hide the
Song drop-down list?
• Song selectOneChoice will need autoSubmit = true
• Question 2: Can we use a partialTrigger property or
do we need programmatic PPR to show/hide the
YouTube video frame?
Say Hello with a Song
• Choose Song checkbox will need autoSubmit = true
• Question 1: Can we use a partialTrigger property or
do we need programmatic PPR to show/hide the
Song drop-down list?
• Song selectOneChoice will need autoSubmit = true
• Question 2: Can we use a partialTrigger property or
do we need programmatic PPR to show/hide the
YouTube video frame?
Say Hello with a Song – Try 1

• Will this work?
Say Hello with a Song
• Lesson 18: To show/hide a component, the parent
component should be refreshed
• Answer 1: we need to refresh the enclosing
panelFormLayout to see the song selectOneChoice
• Using partialTrigger would cause premature validation errors
(lesson 15), so we use programmatic PPR

• Answer 2: No validation issues, we can safely use
partialTriggers property
Say Hello with a Song – Correct Code
More Info
• Understanding the JSF and ADF Optimized Lifeycle
• Slides and sample apps downloadable
• http://www.ateam-oracle.com/?p=3719

• Avoiding JSF and ADF Lifecycle Frustrations
• Shortened recording of this presentation by Frank Nimphius
• http://download.oracle.com/otn_hosted_doc/jdeveloper/11gde
mos/JsfADFLifecycle/adfInsiderJsfAdfLifecycle.html

• A Hidden Gem of ADF Faces: The af:target tag:
• http://www.ateam-oracle.com/?p=20570
Final Recommendation
• Write the lessons down, print them, put them on the
wall, learn them by heart, and rehearse them every
week, it will save you tons of frustration!

More Related Content

What's hot

Reactjs workshop (1)
Reactjs workshop (1)Reactjs workshop (1)
Reactjs workshop (1)Ahmed rebai
 
Oracle Forms : Reusable Components
Oracle Forms : Reusable ComponentsOracle Forms : Reusable Components
Oracle Forms : Reusable ComponentsSekhar Byna
 
Oracle Forms: create debug triggers
Oracle Forms: create debug triggersOracle Forms: create debug triggers
Oracle Forms: create debug triggersSekhar Byna
 
Application engine
Application engineApplication engine
Application engineJAYAARC
 
Spring Boot in Action
Spring Boot in Action Spring Boot in Action
Spring Boot in Action Alex Movila
 
React JS: A Secret Preview
React JS: A Secret PreviewReact JS: A Secret Preview
React JS: A Secret Previewvaluebound
 
Java Hibernate Programming with Architecture Diagram and Example
Java Hibernate Programming with Architecture Diagram and ExampleJava Hibernate Programming with Architecture Diagram and Example
Java Hibernate Programming with Architecture Diagram and Examplekamal kotecha
 
Dependency injection - the right way
Dependency injection - the right wayDependency injection - the right way
Dependency injection - the right wayThibaud Desodt
 
Introduction to java beans
Introduction to java beansIntroduction to java beans
Introduction to java beansHitesh Parmar
 
Introduction to React JS for beginners
Introduction to React JS for beginners Introduction to React JS for beginners
Introduction to React JS for beginners Varun Raj
 
Oracle Forms Triggers
Oracle Forms TriggersOracle Forms Triggers
Oracle Forms TriggersSekhar Byna
 
Experience and Content Fragment
Experience and Content FragmentExperience and Content Fragment
Experience and Content FragmentHeena Madan
 
Routing & Navigating Pages in Angular 2
Routing & Navigating Pages in Angular 2Routing & Navigating Pages in Angular 2
Routing & Navigating Pages in Angular 2Knoldus Inc.
 

What's hot (20)

Reactjs workshop (1)
Reactjs workshop (1)Reactjs workshop (1)
Reactjs workshop (1)
 
Broadleaf Presents Thymeleaf
Broadleaf Presents ThymeleafBroadleaf Presents Thymeleaf
Broadleaf Presents Thymeleaf
 
Oracle Forms : Reusable Components
Oracle Forms : Reusable ComponentsOracle Forms : Reusable Components
Oracle Forms : Reusable Components
 
Oracle Forms: create debug triggers
Oracle Forms: create debug triggersOracle Forms: create debug triggers
Oracle Forms: create debug triggers
 
Javascript
JavascriptJavascript
Javascript
 
Struts framework
Struts frameworkStruts framework
Struts framework
 
Application engine
Application engineApplication engine
Application engine
 
Spring Boot in Action
Spring Boot in Action Spring Boot in Action
Spring Boot in Action
 
Spring boot jpa
Spring boot jpaSpring boot jpa
Spring boot jpa
 
React JS: A Secret Preview
React JS: A Secret PreviewReact JS: A Secret Preview
React JS: A Secret Preview
 
Java Hibernate Programming with Architecture Diagram and Example
Java Hibernate Programming with Architecture Diagram and ExampleJava Hibernate Programming with Architecture Diagram and Example
Java Hibernate Programming with Architecture Diagram and Example
 
Build Restful Service using ADFBC
Build Restful Service using ADFBCBuild Restful Service using ADFBC
Build Restful Service using ADFBC
 
Dependency injection - the right way
Dependency injection - the right wayDependency injection - the right way
Dependency injection - the right way
 
Introduction to java beans
Introduction to java beansIntroduction to java beans
Introduction to java beans
 
Introduction to React JS for beginners
Introduction to React JS for beginners Introduction to React JS for beginners
Introduction to React JS for beginners
 
Oracle Forms Triggers
Oracle Forms TriggersOracle Forms Triggers
Oracle Forms Triggers
 
Oracle Apps - Forms
Oracle Apps - FormsOracle Apps - Forms
Oracle Apps - Forms
 
Experience and Content Fragment
Experience and Content FragmentExperience and Content Fragment
Experience and Content Fragment
 
Routing & Navigating Pages in Angular 2
Routing & Navigating Pages in Angular 2Routing & Navigating Pages in Angular 2
Routing & Navigating Pages in Angular 2
 
Struts Ppt 1
Struts Ppt 1Struts Ppt 1
Struts Ppt 1
 

Viewers also liked

Programming-best practices( beginner) ADF_fusionapps
Programming-best practices( beginner) ADF_fusionappsProgramming-best practices( beginner) ADF_fusionapps
Programming-best practices( beginner) ADF_fusionappsBerry Clemens
 
ADF Worst Practices (UKOUG Tech2013)
ADF Worst Practices (UKOUG Tech2013)ADF Worst Practices (UKOUG Tech2013)
ADF Worst Practices (UKOUG Tech2013)Wilfred van der Deijl
 
ADF Anti-Patterns: Dangerous Tutorials
ADF Anti-Patterns: Dangerous TutorialsADF Anti-Patterns: Dangerous Tutorials
ADF Anti-Patterns: Dangerous Tutorialsandrejusb
 
ADF User Interface Design Best Pratices
ADF User Interface Design Best PraticesADF User Interface Design Best Pratices
ADF User Interface Design Best PraticesAndreas Koop
 
All the Java ADF beginners need to know - part1
All the Java ADF beginners need to know - part1All the Java ADF beginners need to know - part1
All the Java ADF beginners need to know - part1Markus Eisele
 
Oracle ADF Overview
Oracle ADF OverviewOracle ADF Overview
Oracle ADF OverviewBahaa Farouk
 
ADF Bindings & Data Controls
ADF Bindings & Data ControlsADF Bindings & Data Controls
ADF Bindings & Data ControlsRohan Walia
 
Guidelines for moving from Oracle Forms to Oracle ADF and SOA
Guidelines for moving from Oracle Forms to Oracle ADF and SOAGuidelines for moving from Oracle Forms to Oracle ADF and SOA
Guidelines for moving from Oracle Forms to Oracle ADF and SOASteven Davelaar
 
Oracle ADF Task Flows for Beginners
Oracle ADF Task Flows for BeginnersOracle ADF Task Flows for Beginners
Oracle ADF Task Flows for BeginnersDataNext Solutions
 
SOA Service-oriented Architecture Fundamentals IBM Certification
SOA Service-oriented Architecture Fundamentals IBM CertificationSOA Service-oriented Architecture Fundamentals IBM Certification
SOA Service-oriented Architecture Fundamentals IBM CertificationJaguaraci Silva
 
PrimeTime JSF with PrimeFaces - Dec 2014
PrimeTime JSF with PrimeFaces - Dec 2014PrimeTime JSF with PrimeFaces - Dec 2014
PrimeTime JSF with PrimeFaces - Dec 2014cagataycivici
 
TeKslate Oracle ADF
TeKslate Oracle ADFTeKslate Oracle ADF
TeKslate Oracle ADFtekslate1
 
Upcoming JDeveloper ADF Business Components REST support
Upcoming JDeveloper ADF Business Components REST supportUpcoming JDeveloper ADF Business Components REST support
Upcoming JDeveloper ADF Business Components REST supportSteven Davelaar
 
Oracle SOA Suite Overview - Integration in a Service-Oriented World
Oracle SOA Suite Overview - Integration in a Service-Oriented WorldOracle SOA Suite Overview - Integration in a Service-Oriented World
Oracle SOA Suite Overview - Integration in a Service-Oriented WorldOracleContractors
 
Development of web apps based on JSF (TU Vienna)
Development of web apps based on JSF (TU Vienna)Development of web apps based on JSF (TU Vienna)
Development of web apps based on JSF (TU Vienna)blahap
 
Oracle adf performance tips
Oracle adf performance tipsOracle adf performance tips
Oracle adf performance tipsVinay Kumar
 
Adf performance tuning tips slideshare
Adf performance tuning tips slideshareAdf performance tuning tips slideshare
Adf performance tuning tips slideshareVinay Kumar
 

Viewers also liked (20)

Programming-best practices( beginner) ADF_fusionapps
Programming-best practices( beginner) ADF_fusionappsProgramming-best practices( beginner) ADF_fusionapps
Programming-best practices( beginner) ADF_fusionapps
 
ADF Worst Practices (UKOUG Tech2013)
ADF Worst Practices (UKOUG Tech2013)ADF Worst Practices (UKOUG Tech2013)
ADF Worst Practices (UKOUG Tech2013)
 
ADF Anti-Patterns: Dangerous Tutorials
ADF Anti-Patterns: Dangerous TutorialsADF Anti-Patterns: Dangerous Tutorials
ADF Anti-Patterns: Dangerous Tutorials
 
ADF User Interface Design Best Pratices
ADF User Interface Design Best PraticesADF User Interface Design Best Pratices
ADF User Interface Design Best Pratices
 
All the Java ADF beginners need to know - part1
All the Java ADF beginners need to know - part1All the Java ADF beginners need to know - part1
All the Java ADF beginners need to know - part1
 
Oracle ADF Overview
Oracle ADF OverviewOracle ADF Overview
Oracle ADF Overview
 
ADF Bindings & Data Controls
ADF Bindings & Data ControlsADF Bindings & Data Controls
ADF Bindings & Data Controls
 
Guidelines for moving from Oracle Forms to Oracle ADF and SOA
Guidelines for moving from Oracle Forms to Oracle ADF and SOAGuidelines for moving from Oracle Forms to Oracle ADF and SOA
Guidelines for moving from Oracle Forms to Oracle ADF and SOA
 
Oracle ADF Task Flows for Beginners
Oracle ADF Task Flows for BeginnersOracle ADF Task Flows for Beginners
Oracle ADF Task Flows for Beginners
 
12 Steps To Soa Final
12 Steps To Soa Final12 Steps To Soa Final
12 Steps To Soa Final
 
SOA Service-oriented Architecture Fundamentals IBM Certification
SOA Service-oriented Architecture Fundamentals IBM CertificationSOA Service-oriented Architecture Fundamentals IBM Certification
SOA Service-oriented Architecture Fundamentals IBM Certification
 
PrimeTime JSF with PrimeFaces - Dec 2014
PrimeTime JSF with PrimeFaces - Dec 2014PrimeTime JSF with PrimeFaces - Dec 2014
PrimeTime JSF with PrimeFaces - Dec 2014
 
TeKslate Oracle ADF
TeKslate Oracle ADFTeKslate Oracle ADF
TeKslate Oracle ADF
 
Upcoming JDeveloper ADF Business Components REST support
Upcoming JDeveloper ADF Business Components REST supportUpcoming JDeveloper ADF Business Components REST support
Upcoming JDeveloper ADF Business Components REST support
 
Oracle application-development-framework-best-practices
Oracle application-development-framework-best-practicesOracle application-development-framework-best-practices
Oracle application-development-framework-best-practices
 
Oracle SOA Suite Overview - Integration in a Service-Oriented World
Oracle SOA Suite Overview - Integration in a Service-Oriented WorldOracle SOA Suite Overview - Integration in a Service-Oriented World
Oracle SOA Suite Overview - Integration in a Service-Oriented World
 
Development of web apps based on JSF (TU Vienna)
Development of web apps based on JSF (TU Vienna)Development of web apps based on JSF (TU Vienna)
Development of web apps based on JSF (TU Vienna)
 
Oracle adf performance tips
Oracle adf performance tipsOracle adf performance tips
Oracle adf performance tips
 
Adf performance tuning tips slideshare
Adf performance tuning tips slideshareAdf performance tuning tips slideshare
Adf performance tuning tips slideshare
 
AMIS Oracle JDeveloper 12c 07 ADF faces skin editor-Betty van Dongen
AMIS Oracle JDeveloper 12c 07 ADF faces skin editor-Betty van DongenAMIS Oracle JDeveloper 12c 07 ADF faces skin editor-Betty van Dongen
AMIS Oracle JDeveloper 12c 07 ADF faces skin editor-Betty van Dongen
 

Similar to 18 Invaluable Lessons About ADF-JSF Interaction

Java EE 7 Recipes
Java EE 7 RecipesJava EE 7 Recipes
Java EE 7 RecipesJosh Juneau
 
How can you force react components to rerender without calling the set state ppt
How can you force react components to rerender without calling the set state pptHow can you force react components to rerender without calling the set state ppt
How can you force react components to rerender without calling the set state pptBOSC Tech Labs
 
Marty, You're Just Not Thinking Fourth Dimensionally
Marty, You're Just Not Thinking Fourth DimensionallyMarty, You're Just Not Thinking Fourth Dimensionally
Marty, You're Just Not Thinking Fourth DimensionallyTeamstudio
 
React and Flux life cycle with JSX, React Router and Jest Unit Testing
React and  Flux life cycle with JSX, React Router and Jest Unit TestingReact and  Flux life cycle with JSX, React Router and Jest Unit Testing
React and Flux life cycle with JSX, React Router and Jest Unit TestingEswara Kumar Palakollu
 
React.js - The Dawn of Virtual DOM
React.js - The Dawn of Virtual DOMReact.js - The Dawn of Virtual DOM
React.js - The Dawn of Virtual DOMJimit Shah
 
SharePoint Framework, Angular and Azure Functions
SharePoint Framework, Angular and Azure FunctionsSharePoint Framework, Angular and Azure Functions
SharePoint Framework, Angular and Azure FunctionsSébastien Levert
 
Test Driven Development with JavaFX
Test Driven Development with JavaFXTest Driven Development with JavaFX
Test Driven Development with JavaFXHendrik Ebbers
 
Testing C# and ASP.net using Ruby
Testing C# and ASP.net using RubyTesting C# and ASP.net using Ruby
Testing C# and ASP.net using RubyBen Hall
 
Java EE 7 Recipes for Concurrency - JavaOne 2014
Java EE 7 Recipes for Concurrency - JavaOne 2014Java EE 7 Recipes for Concurrency - JavaOne 2014
Java EE 7 Recipes for Concurrency - JavaOne 2014Josh Juneau
 
Building React Applications with Redux
Building React Applications with ReduxBuilding React Applications with Redux
Building React Applications with ReduxFITC
 
EmberJS BucharestJS
EmberJS BucharestJSEmberJS BucharestJS
EmberJS BucharestJSRemus Rusanu
 
Flex component lifecycle
Flex component lifecycleFlex component lifecycle
Flex component lifecycleYaniv Uriel
 
Refactoring Legacy Web Forms for Test Automation
Refactoring Legacy Web Forms for Test AutomationRefactoring Legacy Web Forms for Test Automation
Refactoring Legacy Web Forms for Test AutomationStephen Fuqua
 
How to use selenium successfully
How to use selenium successfullyHow to use selenium successfully
How to use selenium successfullyTEST Huddle
 
More on Fitnesse and Continuous Integration (Silicon Valley code camp 2012)
More on Fitnesse and Continuous Integration (Silicon Valley code camp 2012)More on Fitnesse and Continuous Integration (Silicon Valley code camp 2012)
More on Fitnesse and Continuous Integration (Silicon Valley code camp 2012)Jen Wong
 
Creating and destroying objects
Creating and destroying objectsCreating and destroying objects
Creating and destroying objectsSandeep Chawla
 

Similar to 18 Invaluable Lessons About ADF-JSF Interaction (20)

React Native Firebase
React Native FirebaseReact Native Firebase
React Native Firebase
 
Java EE 7 Recipes
Java EE 7 RecipesJava EE 7 Recipes
Java EE 7 Recipes
 
How can you force react components to rerender without calling the set state ppt
How can you force react components to rerender without calling the set state pptHow can you force react components to rerender without calling the set state ppt
How can you force react components to rerender without calling the set state ppt
 
Marty, You're Just Not Thinking Fourth Dimensionally
Marty, You're Just Not Thinking Fourth DimensionallyMarty, You're Just Not Thinking Fourth Dimensionally
Marty, You're Just Not Thinking Fourth Dimensionally
 
React and Flux life cycle with JSX, React Router and Jest Unit Testing
React and  Flux life cycle with JSX, React Router and Jest Unit TestingReact and  Flux life cycle with JSX, React Router and Jest Unit Testing
React and Flux life cycle with JSX, React Router and Jest Unit Testing
 
React.js - The Dawn of Virtual DOM
React.js - The Dawn of Virtual DOMReact.js - The Dawn of Virtual DOM
React.js - The Dawn of Virtual DOM
 
SharePoint Framework, Angular and Azure Functions
SharePoint Framework, Angular and Azure FunctionsSharePoint Framework, Angular and Azure Functions
SharePoint Framework, Angular and Azure Functions
 
Test Driven Development with JavaFX
Test Driven Development with JavaFXTest Driven Development with JavaFX
Test Driven Development with JavaFX
 
Testing C# and ASP.net using Ruby
Testing C# and ASP.net using RubyTesting C# and ASP.net using Ruby
Testing C# and ASP.net using Ruby
 
Java EE 7 Recipes for Concurrency - JavaOne 2014
Java EE 7 Recipes for Concurrency - JavaOne 2014Java EE 7 Recipes for Concurrency - JavaOne 2014
Java EE 7 Recipes for Concurrency - JavaOne 2014
 
Lec9Handout.ppt
Lec9Handout.pptLec9Handout.ppt
Lec9Handout.ppt
 
Building React Applications with Redux
Building React Applications with ReduxBuilding React Applications with Redux
Building React Applications with Redux
 
EmberJS BucharestJS
EmberJS BucharestJSEmberJS BucharestJS
EmberJS BucharestJS
 
Turner js
Turner jsTurner js
Turner js
 
Flex component lifecycle
Flex component lifecycleFlex component lifecycle
Flex component lifecycle
 
Refactoring Legacy Web Forms for Test Automation
Refactoring Legacy Web Forms for Test AutomationRefactoring Legacy Web Forms for Test Automation
Refactoring Legacy Web Forms for Test Automation
 
How to use selenium successfully
How to use selenium successfullyHow to use selenium successfully
How to use selenium successfully
 
More on Fitnesse and Continuous Integration (Silicon Valley code camp 2012)
More on Fitnesse and Continuous Integration (Silicon Valley code camp 2012)More on Fitnesse and Continuous Integration (Silicon Valley code camp 2012)
More on Fitnesse and Continuous Integration (Silicon Valley code camp 2012)
 
Production-ready Software
Production-ready SoftwareProduction-ready Software
Production-ready Software
 
Creating and destroying objects
Creating and destroying objectsCreating and destroying objects
Creating and destroying objects
 

More from Steven Davelaar

Building beacon-enabled apps with Oracle MCS
Building beacon-enabled apps with Oracle MCSBuilding beacon-enabled apps with Oracle MCS
Building beacon-enabled apps with Oracle MCSSteven Davelaar
 
A-Team Mobile Persistence Accelerator Overview
A-Team Mobile Persistence Accelerator OverviewA-Team Mobile Persistence Accelerator Overview
A-Team Mobile Persistence Accelerator OverviewSteven Davelaar
 
The Mobile Enterprise in Action: Managing Business Processes from Your Mobile...
The Mobile Enterprise in Action: Managing Business Processes from Your Mobile...The Mobile Enterprise in Action: Managing Business Processes from Your Mobile...
The Mobile Enterprise in Action: Managing Business Processes from Your Mobile...Steven Davelaar
 
Implementing Data Caching and Data Synching Using Oracle MAF
Implementing Data Caching and Data Synching Using Oracle MAFImplementing Data Caching and Data Synching Using Oracle MAF
Implementing Data Caching and Data Synching Using Oracle MAFSteven Davelaar
 
Running ADF Faces on Tablets and Mobile Phones
Running ADF Faces on Tablets and Mobile PhonesRunning ADF Faces on Tablets and Mobile Phones
Running ADF Faces on Tablets and Mobile PhonesSteven Davelaar
 
ADF Mobile: Implementing Data Caching and Synching
ADF Mobile: Implementing Data Caching and SynchingADF Mobile: Implementing Data Caching and Synching
ADF Mobile: Implementing Data Caching and SynchingSteven Davelaar
 
Empowering Multi-tasking with an ADF UI Powerhouse (UIShell with dynamic tabs)
Empowering Multi-tasking with an ADF UI Powerhouse (UIShell with dynamic tabs)Empowering Multi-tasking with an ADF UI Powerhouse (UIShell with dynamic tabs)
Empowering Multi-tasking with an ADF UI Powerhouse (UIShell with dynamic tabs)Steven Davelaar
 
Building Highly Reusable Taskflows
Building Highly Reusable TaskflowsBuilding Highly Reusable Taskflows
Building Highly Reusable TaskflowsSteven Davelaar
 
JHeadstart Forms2ADF Generator – Migrating from Oracle Forms to a Best-Practi...
JHeadstart Forms2ADF Generator – Migrating from Oracle Forms to a Best-Practi...JHeadstart Forms2ADF Generator – Migrating from Oracle Forms to a Best-Practi...
JHeadstart Forms2ADF Generator – Migrating from Oracle Forms to a Best-Practi...Steven Davelaar
 

More from Steven Davelaar (10)

Building beacon-enabled apps with Oracle MCS
Building beacon-enabled apps with Oracle MCSBuilding beacon-enabled apps with Oracle MCS
Building beacon-enabled apps with Oracle MCS
 
Oracle JET overview
Oracle JET overviewOracle JET overview
Oracle JET overview
 
A-Team Mobile Persistence Accelerator Overview
A-Team Mobile Persistence Accelerator OverviewA-Team Mobile Persistence Accelerator Overview
A-Team Mobile Persistence Accelerator Overview
 
The Mobile Enterprise in Action: Managing Business Processes from Your Mobile...
The Mobile Enterprise in Action: Managing Business Processes from Your Mobile...The Mobile Enterprise in Action: Managing Business Processes from Your Mobile...
The Mobile Enterprise in Action: Managing Business Processes from Your Mobile...
 
Implementing Data Caching and Data Synching Using Oracle MAF
Implementing Data Caching and Data Synching Using Oracle MAFImplementing Data Caching and Data Synching Using Oracle MAF
Implementing Data Caching and Data Synching Using Oracle MAF
 
Running ADF Faces on Tablets and Mobile Phones
Running ADF Faces on Tablets and Mobile PhonesRunning ADF Faces on Tablets and Mobile Phones
Running ADF Faces on Tablets and Mobile Phones
 
ADF Mobile: Implementing Data Caching and Synching
ADF Mobile: Implementing Data Caching and SynchingADF Mobile: Implementing Data Caching and Synching
ADF Mobile: Implementing Data Caching and Synching
 
Empowering Multi-tasking with an ADF UI Powerhouse (UIShell with dynamic tabs)
Empowering Multi-tasking with an ADF UI Powerhouse (UIShell with dynamic tabs)Empowering Multi-tasking with an ADF UI Powerhouse (UIShell with dynamic tabs)
Empowering Multi-tasking with an ADF UI Powerhouse (UIShell with dynamic tabs)
 
Building Highly Reusable Taskflows
Building Highly Reusable TaskflowsBuilding Highly Reusable Taskflows
Building Highly Reusable Taskflows
 
JHeadstart Forms2ADF Generator – Migrating from Oracle Forms to a Best-Practi...
JHeadstart Forms2ADF Generator – Migrating from Oracle Forms to a Best-Practi...JHeadstart Forms2ADF Generator – Migrating from Oracle Forms to a Best-Practi...
JHeadstart Forms2ADF Generator – Migrating from Oracle Forms to a Best-Practi...
 

Recently uploaded

DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr LapshynFwdays
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Enterprise Knowledge
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsMiki Katsuragi
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostZilliz
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfAddepto
 
Vector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesVector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesZilliz
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 

Recently uploaded (20)

DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering Tips
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdf
 
Vector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesVector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector Databases
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 

18 Invaluable Lessons About ADF-JSF Interaction

  • 1. <Insert Picture Here> 18 Invaluable Lessons About ADF Faces Page Lifecycle Steven Davelaar twitter:@stevendavelaar blogs: www.ateam-oracle.com and blogs.oracle.com/jheadstart Oracle Fusion Middleware Architects Team (the “A-team”)
  • 2. Agenda • Worls’s most comprehensive Hello World Demo
  • 3. Just Say Hello – JSF Lifecycle Initial 1. Restore View UI Component Tree RichPanelHeader RichPanelGroupLayout RichPanelFormLayout RichInputText RichInputDate 6. Render Response
  • 4. JSF Lifecycle - Postback 1. Restore View 2. Apply Request Values richInputText.setSubmittedValue(“Steven”) richInputDate.setSubmittedValue(“04-12-2012”)
  • 5. JSF Lifecycle - Postback 1. Restore View 2. Apply Request Values 3. Process Validations • Validate and convert (if needed) name and date • Call richInputText.setValue() with converted value if valid • Clear submittedValue • Queue valueChange event (if applicable)
  • 6. JSF Lifecycle Postback 1. Restore View value=“#{viewScope.HelloBean.name} value=“#{viewScope.HelloBean.date} 2. Apply Request Values 3. Process Validations 4. Update Model • Call HelloBean.setName with component value • Call HelloBean.setDate with component value • Clear submitted and (local) component value
  • 7. JSF Lifecycle Postback 1. Restore View 2. Apply Request Values actionListener=“#{viewScope.helloBean.sayHello} 3. Process Validations 4. Update Model 5. Invoke Application • Call HelloBean.sayHello
  • 8. JSF Lifecycle - Postback 1. Restore View 2. Apply Request Values 3. Process Validations 4. Update Model 5. Invoke Application 6. Render Response
  • 9. Current Lifecycle Phase in JDeveloper while Debugging
  • 10. Just Say Hello – Reset Values • Clicking the Reset button should not fire validation, and should clear the Name and Date fields • We need a lifecycle shortcut that bypasses validation (both client-side and server-side) and model update
  • 11. JSF Lifecycle – Postback Immediate • Lesson 1: An immediate command executes the action and actionListener in phase 2. Apply Request Values and then jumps to phase 6. Render Response, skipping validation and model update phases.
  • 12. JSF Lifecycle – Postback Immediate 1. Restore View 2. Apply Request Values • richInputText.setSubmittedValue(“Steven”) • richInputDate.setSubmittedValue(“04-12-2012”) • Call HelloBean.reset
  • 13. JSF Lifecycle – Postback Immediate 1. Restore View 2. Apply Request Values 6. Render Response • • • • We clicked the Reset button . Name and date are cleared in HelloBean . But we still see the old values in the page! How come??
  • 14. JSF Lifecycle – Postback Immediate • Lesson 2: When executing an immediate command, the UI components do NOT re-evaluate their underlying value binding, possibly showing stale data • How to force the UI components to do this? • Three options • Use af:resetActionListener • Use oracle.adf.view.rich.util.ResetUtils.reset() • UIComponent.resetValue() • On an individual UI component, the reset action • Clears the submittedValue • Clears local component value so value binding is re-evaluated • Marks the component as valid
  • 15. Using af:resetActionListener • Easiest option, no Java method needed • Automatically added when dragging and dropping a Rollback operation from Data Control Palette • Lesson 3: af:resetActionListener does NOT reset child regions, use ResetUtils.reset() instead.
  • 16. Using ResetUtils.reset(UIComponent startComponent) • Reset method takes one parameter: the start UI Component to reset • However, this is not the REAL start component • Is used to traverse up the component tree • until a region, form, subform, popup, carrousel or panelCollection is found • that component is used as the real starting point
  • 17. Agenda • Worls’s most comprehensive Hello World Demo
  • 18. Say Hello Suggestions • Suggest the type of greeting based on a person’s name
  • 19. Say Hello Suggestions – Will this work? Not really ..
  • 20. Say Hello Suggestions – Will immediate=true work? • No, model is no longer updated, getName() will return null (or old model value): remember lesson 1! • AND (wrong) greeting will NOT be displayed anyway: remember lesson 2!
  • 21. Say Hello Suggestions – Challenges • We need immediate=true to prevent premature validation of greeting field and date field • We need to refresh the greeting field properly • We need somehow to get hold of value entered in name field • We do want required validation on name field ----------------------------------------------------------------------• We already learned how to refresh the greeting field with underlying model value .. • we need to call resetValue on the greeting inputText
  • 22. Say Hello Suggestions – Use Binding Property to Refresh Greeting Field
  • 23. Say Hello Suggestions – Greeting Field Refreshed • At least the suggested greeting is displayed now, although it is still the wrong default greeting because getName() returns null in the suggest method
  • 24. Side Step – More About Component Binding • The getter/setter methods generated by JDeveloper when using binding property are wrong • Code is not serializable, causing errors in clustered env. • UI Tree not released properly, more memory usage • UI component might be reused in UI Tree of another page (fragment) • This can happen EVEN with request-scoped and backingBean-scoped beans • Lesson 4: Always use ComponentReference in component binding getter/setter methods • Lesson 5: Never use component binding in sessionscoped bean, even ComponentReference won’t be safe then.
  • 25. Side Step – Correct Code for Component Binding Methods
  • 26. Side Step – More About Component Binding • Component binding is often overly used • Use UIManager pattern from Duncan Mills to avoid unnecessary component binding • https://blogs.oracle.com/groundside/entry/the_uimanager_pattern • You can also find a component by id programmatically using invokeOnComponent API • See (google for) “ADF Code Corner sample 58” • Starting UI component should be as low as possible in UI Tree, starting at UIViewRoot can kill performance with large, multi-tab pages
  • 27. Say Hello Suggestions – Challenges • We need immediate=true to prevent premature validation of greeting field and date field • We need to refresh the greeting field properly • We need somehow to get hold of value entered in name field • We do want required validation on name field • ----------------------------------------------------------------------• May be we can use a valueChangeListener on name field? • May be we can use immediate=true on the name field?
  • 28. Say Hello Suggestions – Using a ValueChangeListener • ValueChangeListener fires in phase 3. Process Validations • That phase is skipped with immediate command • Now, let’s set immediate=true on name field
  • 29. Say Hello Suggestions – Using a ValueChangeListener • Lesson 6: When immediate=“true” on an Editable UI Component • Component validation is processed in phase 2. Apply Request Values • The validated and converted value is stored on the component • valueChangeListener is also called in this phase • YES, now it works! • But wait .
  • 30. Say Hello Suggestions – Using immediate on editable component • If we enter all fields except name, then Reset button no longer works! • Why? Because of Lesson 6: name field now validated in Apply request Values, before reset command is executed. Arrrrggghhh!
  • 31. Say Hello Suggestions – Using Immediate on Editable Component • This makes setting immediate=“true on an editable UI component pretty useless, because then the general rule “Validations are skipped when setting a command component to immediate=“true” is no longer true! • Lesson 7: Never set immediate=“true” on an editable UI component, it prevents you from cancelling/abandoning a page.
  • 32. Say Hello Suggestions – Back to the Challenges • We need immediate=true to prevent premature validation of greeting field and date field • We need to refresh the greeting field properly • We need somehow to get hold of value entered in name field • We do want required validation on name field ----------------------------------------------------------------------• Not a solution: valueChangeListener and immediate=true on name field • New solution: we need to get the value entered for name directly from the UI component
  • 33. Say Hello Suggestions – Use Component Binding to Get Name Value • YES, this works, and the reset button still works too! • But wait . it works too well • Method should not execute when name empty, or less than 4 chars
  • 34. Say Hello Suggestions – Use Component Binding to Get Name Value • We are using the raw, possibly invalid value by calling getSubmittedValue() on the name field • We need to do programmatically what normally happens automatically 3. Process Validations in phase 3 • Validate and convert (if needed) name and date • Call richInputText.setValue() with converted value if valid • Clear submittedValue • Queue valueChange event (if applicable)
  • 35. Say Hello Suggestions – Use Component Binding to Get Name Value • Lesson 8: You can programmatically execute JSF lifecycle phases 3 and 4 on a component: • comp.processValidations(FacesContext.getCurrentInstance()) • comp.processUpdates(FacesContext.getCurrentInstance())
  • 36. Say Hello Suggestions – Optimizing Using Partial Page Rendering (PPR) • When clicking the suggest button, only the greeting field needs to be refreshed in browser. • Easily implemented using ADF Faces PPR
  • 37. Agenda • Worls’s most comprehensive Hello World Demo
  • 38. Sub Forms of Hello Saying • It was quite a challenge to get this greeting suggestion implemented • Is there really no easier way to do this? • The af:subform tag represents an independently submittable region of a page. The contents of a subform will only be validated (or otherwise processed) if a component inside of the subform is responsible for submitting the page. • Sounds promising, let’s try!
  • 39. Sub Forms of Hello Saying – Try 1
  • 40. Sub Forms of Hello Saying – Try 1
  • 41. Sub Forms of Hello Saying –Try 1 Findings • Lesson 9: Items not in any sub-form are still processed in lifecycle when submitting a sub-form. • Fix: put all items in sub-forms • Lesson 10: Layout messed up when using sub form • Fix: Each subform must contain its own panelFormLayout, align accross panelFormLayouts using labelWidth property • Submitting the main form, does not submit items in sub-form • Solution: set property default=“true” on the subform
  • 42. Sub Forms of Hello Saying – Try 2
  • 43. Sub Forms of Hello Saying – Try 2 Findings • • • • Suggest button now works with empty date! Layout cleaned up! Pressing enter key on name shows suggested greeting! But wait . what is functionally different from previous samples? • Greeting field is not required, what if we fix that?
  • 44. Sub Forms of Hello Saying – Try 2 Findings • Let’s try to move greeting field to other subform
  • 45. Sub Forms of Hello Saying – Try 3
  • 46. Sub Forms of Hello Saying – Try 3 Findings • No validation error on greeting field! • But greeting no longer shown • Lesson 11: Partial page refresh does not work across sub-forms • Sub forms do not work for this use case
  • 47. Sub Forms of Say Hello - Conclusion • Sub forms can be used in corner cases to avoid premature validation • Sub forms most useful for “default command” behavior
  • 48. Agenda • Worls’s most comprehensive Hello World Demo
  • 49. Auto-Suggested Hello Saying • Auto-suggest the type of greeting when tabbing out the name field
  • 50. Auto-Suggested Hello Saying – Will this work? • Will field validations fire prematurely? • Will greeting field be refreshed correctly?
  • 51. Auto-Suggested Hello Saying – ADFoptimized lifecycle • Using autoSubmit = true on an editable UI Component kicks of the ADF-Optimized JSF Lifecycle • This optimized lifecycle always: • fires a partial submit • By default will only process and refresh the autoSubmitted component itself • Additional UI components will be processed in this lifecycle when partialTriggers property points to autoSubmitted item • So, with code in previous slide no premature validations fire but greeting field is not refreshed • So, what will happen when we add partialTrigger property to greeting field?
  • 52. Auto-Suggested Hello Saying – Refreshing Greeting Field • Greeting field now processed as well -> validation error when null • Solutions: 1. make greeting optional 2. add greeting programmatically as partial target
  • 53. Auto-Suggested Hello Saying – Making Greeting Optional • Making greeting optional seems to work • But it doesn’t work always • It does not work when user clears greeting first • User clears existing greeting • User navigates back to name field and changes the name • User tabs out name field, nothing happens! • Why??
  • 54. What happens when greeting is cleared 1. Restore View 2. Apply Request Values 3. Process Validations • Calls valueChangeListener method HelloBean.nameChanged which in turn calls.setGreeting(“Hi”)
  • 55. What happens when greeting is cleared 1. Restore View 2. Apply Request Values 3. Process Validations 4. Update Model • Calls HelloBean.setGreeting(null) • Overrides the value set by valueChangeListener method .
  • 56. How to prevent suggested greeting is overridden again • The JSF Model Update phase only updates underlying model value when the local component value differs from the model value • We need to reset the local UI Component value in namedChanged method
  • 57. Auto-Suggested Hello Saying – Refreshing Greeting Field In Code
  • 58. Auto-Suggested Hello Saying – Lessons Learned 12. Auto-submitted fields use ADF optimized lifecycle preventing premature validation on other fields 13. The components that are processed by ADF optimized lifecycle can be configured using partialTrigger property. This is known as Cross Component Refresh 14. Values set in value change listeners might be overridden in model update phase if not coded correctly 15. Use programmatic PPR instead of partialTriggers property to prevent components to be processed by ADF optimized lifecycle, avoiding premature validation
  • 59. New in JDeveloper 12c: the af:target tag! • Provides a declarative way to allow a component to specify the list of targets it wants executed and rendered when an event is fired by the component. • The list of components on which the JSF lifecycle will be executed, can be defined separately from the list of components that needs to be re-rendered (refreshed). • Let’s revisit our previous examples .
  • 60. JSF Lifecycle – Postback Immediate 1. Restore View 2. Apply Request Values 6. Render Response • • • • We clicked the Reset button . Name and date are cleared in HelloBean . But we still see the old values in the page! How come??
  • 61. JSF Lifecycle – Postback Immediate • Lesson 2: When executing an immediate command, the UI components do NOT re-evaluate their underlying value binding, possibly showing stale data • How to force the UI components to do this? • Three options • Use af:resetActionListener • Use oracle.adf.view.rich.util.ResetUtils.reset() • UIComponent.resetValue() • On an individual UI component, the reset action • Clears the submittedValue • Clears local component value so value binding is re-evaluated • Marks the component as valid
  • 62. Implementing Reset/Cancel Functionality using af:target tag! • No need to set immediate=true on the button • No issues with fields not being refreshed • No issues with subregions not being refreshed when using af:resetActionListener
  • 63. Say Hello Suggestions • Suggest the type of greeting based on a person’s name
  • 64. Say Hello Suggestions – Challenges • We need(ed) immediate=true to prevent premature validation of greeting field and date field • We need to refresh the greeting field properly • We need somehow to get hold of value entered in name field • We do want required validation on name field ----------------------------------------------------------------------• With af:target tag this becomes easy!
  • 65. Suggest Greeting Using af:target tag
  • 66. Auto-Suggested Hello Saying • Auto-suggest the type of greeting when tabbing out the name field
  • 68. The af:target tag is your friend! • Lesson 16: When using JDeveloper 12c, use the af:target tag to easily define which components should be validated and submitted, and which components should be re-rendered.
  • 69. Agenda • A bit more on the ADF optimized lifecycle
  • 70. ADF Optimized Lifecycle • ADF Faces sets boundaries on the page that allow the JSF lifecycle to run just on components within the boundary • As we learned before, when autosubmitting an editable field, the boundary is the component itself • Boundaries can be changed by using partialTriggers property
  • 71. ADF Optimized Lifecycle • A number of component events always trigger the optimized lifecycle • Events on table, treeTable: disclosureEvent, selectionEvent, rangeChangeEvent, columnSelectionEvent, etc • Events on tree: disclosureEvent, selectionEvent • Events on showDetailIHeader: disclosureEvent • Events on panelAccordion (showDetailIItem) : disclosureEvent • Events on components inside panelCollection (toolbar, context menu, etc) •
  • 72. Optimized Lifecycle of Employees – Overflow Right • When clicking on another row • Overflow area should be refreshed • Changes in overflow area should be preserved
  • 73. Optimized Lifecycle of Employees – Configuring optimized lifecycle • When clicking on another row, changes in overflow area are now preserved
  • 74. Optimized Lifecycle of Employees – Adding New Employee • Clicking the New Employee button should also preserve changes made in table overflow area • Easy works out-of-the-box • Now, let’s move that button to panelCollection toolbar
  • 75. Optimized Lifecycle of Employees – Adding New Employee • Now, it will NOT work out-of-the-box • Button inside panelCollection will trigger optimized lifecycle • Changes in table overflow area will not be submitted • What is the “obvious” fix?
  • 76. Optimized Lifecycle of Employees – Adding New Employee • “Obvious” fix is to add button id to partialTriggers property of panelFormLayout • Lesson 17: To add components that should be processed in optimized lifecycle, the partialTrigger property must point to the boundary component • In this use case, the boundary component of the optimized lifecycle is the panelCollection • So, “obvious” fix does not work, this will work: • Note that you can use cascading partialTriggers • If panelCollection partialTriggers property refers to table, panelFormLayout only needs to refer to panelCollection
  • 77. Agenda • Worls’s most comprehensive Hello World Demo
  • 78. Say Hello with a Song
  • 79. Say Hello with a Song • Choose Song checkbox will need autoSubmit = true • Question 1: Can we use a partialTrigger property or do we need programmatic PPR to show/hide the Song drop-down list? • Song selectOneChoice will need autoSubmit = true • Question 2: Can we use a partialTrigger property or do we need programmatic PPR to show/hide the YouTube video frame?
  • 80. Say Hello with a Song • Choose Song checkbox will need autoSubmit = true • Question 1: Can we use a partialTrigger property or do we need programmatic PPR to show/hide the Song drop-down list? • Song selectOneChoice will need autoSubmit = true • Question 2: Can we use a partialTrigger property or do we need programmatic PPR to show/hide the YouTube video frame?
  • 81. Say Hello with a Song – Try 1 • Will this work?
  • 82. Say Hello with a Song • Lesson 18: To show/hide a component, the parent component should be refreshed • Answer 1: we need to refresh the enclosing panelFormLayout to see the song selectOneChoice • Using partialTrigger would cause premature validation errors (lesson 15), so we use programmatic PPR • Answer 2: No validation issues, we can safely use partialTriggers property
  • 83. Say Hello with a Song – Correct Code
  • 84. More Info • Understanding the JSF and ADF Optimized Lifeycle • Slides and sample apps downloadable • http://www.ateam-oracle.com/?p=3719 • Avoiding JSF and ADF Lifecycle Frustrations • Shortened recording of this presentation by Frank Nimphius • http://download.oracle.com/otn_hosted_doc/jdeveloper/11gde mos/JsfADFLifecycle/adfInsiderJsfAdfLifecycle.html • A Hidden Gem of ADF Faces: The af:target tag: • http://www.ateam-oracle.com/?p=20570
  • 85. Final Recommendation • Write the lessons down, print them, put them on the wall, learn them by heart, and rehearse them every week, it will save you tons of frustration!