SlideShare ist ein Scribd-Unternehmen logo
1 von 85
Downloaden Sie, um offline zu lesen
<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!

Weitere ähnliche Inhalte

Was ist angesagt?

How to launch workflow from plsql
How to launch workflow from plsqlHow to launch workflow from plsql
How to launch workflow from plsqlFeras Ahmad
 
Oracle Forms : Reusable Components
Oracle Forms : Reusable ComponentsOracle Forms : Reusable Components
Oracle Forms : Reusable ComponentsSekhar Byna
 
Details and Set-up of Other FlexFields in Oracle E-Business Suite
Details and Set-up of Other FlexFields in Oracle E-Business SuiteDetails and Set-up of Other FlexFields in Oracle E-Business Suite
Details and Set-up of Other FlexFields in Oracle E-Business Suiteeprentise
 
The New JavaScript: ES6
The New JavaScript: ES6The New JavaScript: ES6
The New JavaScript: ES6Rob Eisenberg
 
Advanced Javascript
Advanced JavascriptAdvanced Javascript
Advanced JavascriptAdieu
 
Oracle Forms: Master Detail form
Oracle Forms: Master Detail formOracle Forms: Master Detail form
Oracle Forms: Master Detail formSekhar Byna
 
Scalable Django Architecture
Scalable Django ArchitectureScalable Django Architecture
Scalable Django ArchitectureRami Sayar
 
Oracle Forms: Menu
Oracle Forms: MenuOracle Forms: Menu
Oracle Forms: MenuSekhar Byna
 
Presentation Maintenance Cloud.pdf
Presentation Maintenance Cloud.pdfPresentation Maintenance Cloud.pdf
Presentation Maintenance Cloud.pdfWalidShoman3
 
Oracle Forms: Non input Items
Oracle Forms:  Non input ItemsOracle Forms:  Non input Items
Oracle Forms: Non input ItemsSekhar Byna
 
Beginning Calculation Manager for Essbase and Hyperion Planning
Beginning Calculation Manager for Essbase and Hyperion Planning Beginning Calculation Manager for Essbase and Hyperion Planning
Beginning Calculation Manager for Essbase and Hyperion Planning Alithya
 
Node.js Tutorial for Beginners | Node.js Web Application Tutorial | Node.js T...
Node.js Tutorial for Beginners | Node.js Web Application Tutorial | Node.js T...Node.js Tutorial for Beginners | Node.js Web Application Tutorial | Node.js T...
Node.js Tutorial for Beginners | Node.js Web Application Tutorial | Node.js T...Edureka!
 
Oracle Core HR with Screen Shots
Oracle Core HR with Screen ShotsOracle Core HR with Screen Shots
Oracle Core HR with Screen Shotsrunjithrocking
 
jQuery from the very beginning
jQuery from the very beginningjQuery from the very beginning
jQuery from the very beginningAnis Ahmad
 
Oracle ADF Task Flows for Beginners
Oracle ADF Task Flows for BeginnersOracle ADF Task Flows for Beginners
Oracle ADF Task Flows for BeginnersDataNext Solutions
 

Was ist angesagt? (20)

How to launch workflow from plsql
How to launch workflow from plsqlHow to launch workflow from plsql
How to launch workflow from plsql
 
Oracle Forms : Reusable Components
Oracle Forms : Reusable ComponentsOracle Forms : Reusable Components
Oracle Forms : Reusable Components
 
Workshop React.js
Workshop React.jsWorkshop React.js
Workshop React.js
 
Details and Set-up of Other FlexFields in Oracle E-Business Suite
Details and Set-up of Other FlexFields in Oracle E-Business SuiteDetails and Set-up of Other FlexFields in Oracle E-Business Suite
Details and Set-up of Other FlexFields in Oracle E-Business Suite
 
The New JavaScript: ES6
The New JavaScript: ES6The New JavaScript: ES6
The New JavaScript: ES6
 
Advanced Javascript
Advanced JavascriptAdvanced Javascript
Advanced Javascript
 
Oracle Forms: Master Detail form
Oracle Forms: Master Detail formOracle Forms: Master Detail form
Oracle Forms: Master Detail form
 
Angular Data Binding
Angular Data BindingAngular Data Binding
Angular Data Binding
 
Scalable Django Architecture
Scalable Django ArchitectureScalable Django Architecture
Scalable Django Architecture
 
Oracle Forms: Menu
Oracle Forms: MenuOracle Forms: Menu
Oracle Forms: Menu
 
Presentation Maintenance Cloud.pdf
Presentation Maintenance Cloud.pdfPresentation Maintenance Cloud.pdf
Presentation Maintenance Cloud.pdf
 
Oracle Forms: Non input Items
Oracle Forms:  Non input ItemsOracle Forms:  Non input Items
Oracle Forms: Non input Items
 
Beginning Calculation Manager for Essbase and Hyperion Planning
Beginning Calculation Manager for Essbase and Hyperion Planning Beginning Calculation Manager for Essbase and Hyperion Planning
Beginning Calculation Manager for Essbase and Hyperion Planning
 
Eam Activity Association Template
Eam Activity Association TemplateEam Activity Association Template
Eam Activity Association Template
 
Node.js Tutorial for Beginners | Node.js Web Application Tutorial | Node.js T...
Node.js Tutorial for Beginners | Node.js Web Application Tutorial | Node.js T...Node.js Tutorial for Beginners | Node.js Web Application Tutorial | Node.js T...
Node.js Tutorial for Beginners | Node.js Web Application Tutorial | Node.js T...
 
Oracle Core HR with Screen Shots
Oracle Core HR with Screen ShotsOracle Core HR with Screen Shots
Oracle Core HR with Screen Shots
 
Trees and Hierarchies in SQL
Trees and Hierarchies in SQLTrees and Hierarchies in SQL
Trees and Hierarchies in SQL
 
jQuery from the very beginning
jQuery from the very beginningjQuery from the very beginning
jQuery from the very beginning
 
Build Restful Service using ADFBC
Build Restful Service using ADFBCBuild Restful Service using ADFBC
Build Restful Service using ADFBC
 
Oracle ADF Task Flows for Beginners
Oracle ADF Task Flows for BeginnersOracle ADF Task Flows for Beginners
Oracle ADF Task Flows for Beginners
 

Andere mochten auch

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
 
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
 
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
 
Mastering Oracle ADF Bindings
Mastering Oracle ADF BindingsMastering Oracle ADF Bindings
Mastering Oracle ADF BindingsEuegene Fedorenko
 

Andere mochten auch (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
 
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
 
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
 
Mastering Oracle ADF Bindings
Mastering Oracle ADF BindingsMastering Oracle ADF Bindings
Mastering Oracle ADF Bindings
 
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
 
so-aDF
so-aDFso-aDF
so-aDF
 

Ähnlich wie 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
 

Ähnlich wie 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
 

Mehr von 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
 

Mehr von 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...
 

Kürzlich hochgeladen

Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024The Digital Insurer
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Allon Mureinik
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Paola De la Torre
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 

Kürzlich hochgeladen (20)

Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 

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!