svn commit: r1568066 - /deltaspike/site/trunk/content/jsf.mdtext
Author: tandraschko Date: Thu Feb 13 22:15:27 2014 New Revision: 1568066 URL: http://svn.apache.org/r1568066 Log: window handling... Modified: deltaspike/site/trunk/content/jsf.mdtext Modified: deltaspike/site/trunk/content/jsf.mdtext URL: http://svn.apache.org/viewvc/deltaspike/site/trunk/content/jsf.mdtext?rev=1568066r1=1568065r2=1568066view=diff == --- deltaspike/site/trunk/content/jsf.mdtext (original) +++ deltaspike/site/trunk/content/jsf.mdtext Thu Feb 13 22:15:27 2014 @@ -23,6 +23,22 @@ Notice:Licensed to the Apache Softwa ## Intro +### Historic Considerations +Until the end of the 1990s web browsers are usually single threaded and only had one window. But in the last years browsers supporting multiple windows or even tab became the standard. Since those days lots of efforts went into uniquely identifying a single browser window on the server side. Sadly browser windows still lack of a native windowId, thus maintaining web application data in @SessionScoped backing beans is still used in most of the cases. + +###How JSF-2 changed the world + +The MyFaces Orchestra community did a good summary about the various ways to handle multiple window support in JSF Applications. Those findings are still valid and up to date, but the environmental conditions have changed slightly since then. +br / +It is easy to pass a windowId around with a POST request, but it gets tricky with GET requests. Due to the new JSF-2 ability to use bookmarkable URLs and deep links, a typical JSF-2 application contains much more GET links than we used to see in JSF-1, thus we have far more href links to cope with. + +### Standard windowId Handling + +With a classical approach we would not be able to simply add a windowId parameter to such links because if the user would open the link in a new browser window or tab, we would carry the windowId - and thus the window scope - over to the new browser tab/window. The classic solution was to omit the windowId for all GET links, but by doing this we would now loose the window scope far too often with JSF-2! +br / +Marios summary also contains a method to prevent this problem by storing a value directly in the browser window via JavaScript. Usually this is rendered and executed in the same page as the user form. See the Post-render window detection paragraph for a more detailed description. +The major downside of this solution is that we might already pollute 'foreign' beans (and destroy their information) while rendering the page, which means this is not feasible as general solution. + ## Available modes ### CLIENTWINDOW @@ -30,6 +46,8 @@ Notice:Licensed to the Apache Softwa Each GET request results in an intermediate small html page which checks if the browser tab fits the requested windowId. br/ When the windowId is valid, a unique token (called `dsRid`) will be generated for the current request and added to the URL. br/ In addition a cookie with with the dsRid/windowId will be added. On the server side, the verified windowId will be takes from the cookie. +br/ +For POST request detection, the windowId will be added as hidden input to all forms. # Advantage @@ -38,8 +56,9 @@ In addition a cookie with with the dsRid # Disadvantage - - Every GET requests streams the the windowhandler.html first - The -application probably feels a litte bit slower +- Having the windowhandler.html site rendered between requests sometimes leads to some 'flickering' if the destination page takes some time to load. The browser first renders our windowhandler and only after that the original page will get loaded. br/ +This effect may be minimized by branding the windowhandler.html page and providing an own one with a bgcolor which matches your application.br/ +For html-5 aware browsers we also got rid of this flickering by storing away a 'screenshot' of the first page in onclick() and immediately restore this 'screenshot' on the intermediate windowhandler.html page. Technically we do this by storing away the body and css information into the html5 localStorage and restore them on the intermediate page. We also introduced a WindowConfig which is able to parse a request and decide upon the UserAgent or any other information if a client will get an intermediate page or if he gets the result page directly. Change windowhandler.html @@ -157,6 +176,10 @@ Don't forget to set the ClientWindowRend ## Based Scopes + - @WindowScoped + - @ViewAccessScoped + - @GroupedConversationScoped + # Type-safe View-Configs ## Intro
svn commit: r897823 - in /websites/staging/deltaspike/trunk/content: ./ jsf.html
Author: buildbot Date: Thu Feb 13 22:16:49 2014 New Revision: 897823 Log: Staging update by buildbot for deltaspike Modified: websites/staging/deltaspike/trunk/content/ (props changed) websites/staging/deltaspike/trunk/content/jsf.html Propchange: websites/staging/deltaspike/trunk/content/ -- --- cms:source-revision (original) +++ cms:source-revision Thu Feb 13 22:16:49 2014 @@ -1 +1 @@ -1566683 +1568066 Modified: websites/staging/deltaspike/trunk/content/jsf.html == --- websites/staging/deltaspike/trunk/content/jsf.html (original) +++ websites/staging/deltaspike/trunk/content/jsf.html Thu Feb 13 22:16:49 2014 @@ -81,7 +81,12 @@ div class=toc ul lia href=#multi-window-handling-todoMulti-Window Handling (TODO)/aul -lia href=#introIntro/a/li +lia href=#introIntro/aul +lia href=#historic-considerationsHistoric Considerations/a/li +lia href=#how-jsf-2-changed-the-worldHow JSF-2 changed the world/a/li +lia href=#standard-windowid-handlingStandard windowId Handling/a/li +/ul +/li lia href=#available-modesAvailable modes/aul lia href=#clientwindowCLIENTWINDOW/aul lia href=#advantageAdvantage/a/li @@ -171,19 +176,33 @@ hr / h1 id=multi-window-handling-todoMulti-Window Handling (TODO)/h1 h2 id=introIntro/h2 +h3 id=historic-considerationsHistoric Considerations/h3 +pUntil the end of the 1990s web browsers are usually single threaded and only had one window. But in the last years browsers supporting multiple windows or even tab became the standard. Since those days lots of efforts went into uniquely identifying a single browser window on the server side. Sadly browser windows still lack of a native windowId, thus maintaining web application data in @SessionScoped backing beans is still used in most of the cases. /p +h3 id=how-jsf-2-changed-the-worldHow JSF-2 changed the world/h3 +pThe MyFaces Orchestra community did a good summary about the various ways to handle multiple window support in JSF Applications. Those findings are still valid and up to date, but the environmental conditions have changed slightly since then. +br / +It is easy to pass a windowId around with a POST request, but it gets tricky with GET requests. Due to the new JSF-2 ability to use bookmarkable URLs and deep links, a typical JSF-2 application contains much more GET links than we used to see in JSF-1, thus we have far more href links to cope with./p +h3 id=standard-windowid-handlingStandard windowId Handling/h3 +pWith a classical approach we would not be able to simply add a windowId parameter to such links because if the user would open the link in a new browser window or tab, we would carry the windowId - and thus the window scope - over to the new browser tab/window. The classic solution was to omit the windowId for all GET links, but by doing this we would now loose the window scope far too often with JSF-2! +br / +Marios summary also contains a method to prevent this problem by storing a value directly in the browser window via JavaScript. Usually this is rendered and executed in the same page as the user form. See the Post-render window detection paragraph for a more detailed description. +The major downside of this solution is that we might already pollute 'foreign' beans (and destroy their information) while rendering the page, which means this is not feasible as general solution./p h2 id=available-modesAvailable modes/h2 h3 id=clientwindowCLIENTWINDOW/h3 pEach GET request results in an intermediate small html page which checks if the browser tab fits the requested windowId. br/ When the windowId is valid, a unique token (called codedsRid/code) will be generated for the current request and added to the URL. br/ -In addition a cookie with with the dsRid/windowId will be added. On the server side, the verified windowId will be takes from the cookie./p +In addition a cookie with with the dsRid/windowId will be added. On the server side, the verified windowId will be takes from the cookie. +br/ +For POST request detection, the windowId will be added as hidden input to all forms./p h5 id=advantageAdvantage/h5 ul liCovers all edge cases/li /ul h5 id=disadvantageDisadvantage/h5 ul -liEvery GET requests streams the the windowhandler.html first -gt; The -application probably feels a litte bit slower/li +liHaving the windowhandler.html site rendered between requests sometimes leads to some 'flickering' if the destination page takes some time to load. The browser first renders our windowhandler and only after that the original page will get loaded. br/ +This effect may be minimized by branding the windowhandler.html page and providing an own one with a bgcolor which matches your application.br/ +For html-5 aware browsers we also got rid of this flickering by storing away a 'screenshot' of the first page in onclick()
svn commit: r897827 - in /websites/staging/deltaspike/trunk/content: ./ jsf.html
Author: buildbot Date: Thu Feb 13 22:27:51 2014 New Revision: 897827 Log: Staging update by buildbot for deltaspike Modified: websites/staging/deltaspike/trunk/content/ (props changed) websites/staging/deltaspike/trunk/content/jsf.html Propchange: websites/staging/deltaspike/trunk/content/ -- --- cms:source-revision (original) +++ cms:source-revision Thu Feb 13 22:27:51 2014 @@ -1 +1 @@ -1568066 +1568069 Modified: websites/staging/deltaspike/trunk/content/jsf.html == --- websites/staging/deltaspike/trunk/content/jsf.html (original) +++ websites/staging/deltaspike/trunk/content/jsf.html Thu Feb 13 22:27:51 2014 @@ -80,7 +80,7 @@ /div div class=toc ul -lia href=#multi-window-handling-todoMulti-Window Handling (TODO)/aul +lia href=#multi-window-handlingMulti-Window Handling/aul lia href=#introIntro/aul lia href=#historic-considerationsHistoric Considerations/a/li lia href=#how-jsf-2-changed-the-worldHow JSF-2 changed the world/a/li @@ -120,6 +120,7 @@ lia href=#based-scopesBased Scopes/a/li /ul /li +lia href=#scopes-todoScopes (TODO)/a/li lia href=#type-safe-view-configsType-safe View-Configs/aul lia href=#intro_1Intro/a/li lia href=#motivationMotivation/a/li @@ -169,12 +170,20 @@ lia href=#sub-conversation-groupsSub-Conversation-Groups/a/li /ul /li +lia href=#jsf-managedbean-to-cdi-mapping-todoJSF ManagedBean to CDI mapping (TODO)/a/li +lia href=#converter-validator-injection-todoConverter amp; Validator Injection (TODO)/a/li +lia href=#event-broadcasting-todoEvent broadcasting (TODO)/aul +lia href=#beforejsfrequest-afterjsfrequestBeforeJsfRequest / AfterJsfRequest/a/li +lia href=#beforephase-afterphaseBeforePhase / AfterPhase/a/li +lia href=#jsf-systemeventJSF' SystemEvent/a/li +/ul +/li lia href=#support-of-ear-deploymentsSupport of EAR deployments/a/li lia href=#hintsHints/a/li /ul /div hr / -h1 id=multi-window-handling-todoMulti-Window Handling (TODO)/h1 +h1 id=multi-window-handlingMulti-Window Handling/h1 h2 id=introIntro/h2 h3 id=historic-considerationsHistoric Considerations/h3 pUntil the end of the 1990s web browsers are usually single threaded and only had one window. But in the last years browsers supporting multiple windows or even tab became the standard. Since those days lots of efforts went into uniquely identifying a single browser window on the server side. Sadly browser windows still lack of a native windowId, thus maintaining web application data in @SessionScoped backing beans is still used in most of the cases. /p @@ -313,6 +322,13 @@ The best way, to apply it for all views, li@ViewAccessScoped/li li@GroupedConversationScoped/li /ul +h1 id=scopes-todoScopes (TODO)/h1 +ul +li@WindowScoped/li +li@ViewAccessScoped/li +li@GroupedConversationScoped/li +li@ViewScoped/li +/ul h1 id=type-safe-view-configsType-safe View-Configs/h1 h2 id=intro_1Intro/h2 pType-safe view-configs are static configs which can be used in combination with every view-technology which is based on Java. @@ -1228,6 +1244,12 @@ A sub-group is just a class or an interf pIn the listing above all beans which implement the Wizard interface will be closed as soon as you close the ImplicitSubGroup./p +h1 id=jsf-managedbean-to-cdi-mapping-todoJSF ManagedBean to CDI mapping (TODO)/h1 +h1 id=converter-validator-injection-todoConverter amp; Validator Injection (TODO)/h1 +h1 id=event-broadcasting-todoEvent broadcasting (TODO)/h1 +h2 id=beforejsfrequest-afterjsfrequestBeforeJsfRequest / AfterJsfRequest/h2 +h2 id=beforephase-afterphaseBeforePhase / AfterPhase/h2 +h2 id=jsf-systemeventJSF' SystemEvent/h2 h1 id=support-of-ear-deploymentsSupport of EAR deployments/h1 pBefore using features described by this page, please ensure that you are aware of a href=https://issues.apache.org/jira/browse/DELTASPIKE-335;DELTASPIKE-335/a and the corresponding impact./p h1 id=hintsHints/h1
svn commit: r1568069 - /deltaspike/site/trunk/content/jsf.mdtext
Author: tandraschko Date: Thu Feb 13 22:27:46 2014 New Revision: 1568069 URL: http://svn.apache.org/r1568069 Log: added placeholders for not documented features Modified: deltaspike/site/trunk/content/jsf.mdtext Modified: deltaspike/site/trunk/content/jsf.mdtext URL: http://svn.apache.org/viewvc/deltaspike/site/trunk/content/jsf.mdtext?rev=1568069r1=1568068r2=1568069view=diff == --- deltaspike/site/trunk/content/jsf.mdtext (original) +++ deltaspike/site/trunk/content/jsf.mdtext Thu Feb 13 22:27:46 2014 @@ -19,7 +19,7 @@ Notice:Licensed to the Apache Softwa [TOC] *** -# Multi-Window Handling (TODO) +# Multi-Window Handling ## Intro @@ -180,6 +180,13 @@ Don't forget to set the ClientWindowRend - @ViewAccessScoped - @GroupedConversationScoped +#Scopes (TODO) + + - @WindowScoped + - @ViewAccessScoped + - @GroupedConversationScoped + - @ViewScoped + # Type-safe View-Configs ## Intro @@ -1176,6 +1183,17 @@ Example - Implicit sub-group: In the listing above all beans which implement the Wizard interface will be closed as soon as you close the ImplicitSubGroup. +#JSF ManagedBean to CDI mapping (TODO) + +#Converter Validator Injection (TODO) + +#Event broadcasting (TODO) + +## BeforeJsfRequest / AfterJsfRequest + +## BeforePhase / AfterPhase + +## JSF' SystemEvent # Support of EAR deployments Before using features described by this page, please ensure that you are aware of [DELTASPIKE-335](https://issues.apache.org/jira/browse/DELTASPIKE-335) and the corresponding impact.
svn commit: r897830 - in /websites/staging/deltaspike/trunk/content: ./ jsf.html
Author: buildbot Date: Thu Feb 13 22:44:47 2014 New Revision: 897830 Log: Staging update by buildbot for deltaspike Modified: websites/staging/deltaspike/trunk/content/ (props changed) websites/staging/deltaspike/trunk/content/jsf.html Propchange: websites/staging/deltaspike/trunk/content/ -- --- cms:source-revision (original) +++ cms:source-revision Thu Feb 13 22:44:47 2014 @@ -1 +1 @@ -1568069 +1568078 Modified: websites/staging/deltaspike/trunk/content/jsf.html == --- websites/staging/deltaspike/trunk/content/jsf.html (original) +++ websites/staging/deltaspike/trunk/content/jsf.html Thu Feb 13 22:44:47 2014 @@ -120,7 +120,14 @@ lia href=#based-scopesBased Scopes/a/li /ul /li -lia href=#scopes-todoScopes (TODO)/a/li +lia href=#scopes-todoScopes (TODO)/aul +lia href=#windowscoped@WindowScoped/a/li +lia href=#viewaccessscoped@ViewAccessScoped/a/li +lia href=#groupedconversationscoped@GroupedConversationScoped/a/li +lia href=#viewscoped@ViewScoped/a/li +lia href=#jsf-20-scopesJSF 2.0 Scopes/a/li +/ul +/li lia href=#type-safe-view-configsType-safe View-Configs/aul lia href=#intro_1Intro/a/li lia href=#motivationMotivation/a/li @@ -170,7 +177,6 @@ lia href=#sub-conversation-groupsSub-Conversation-Groups/a/li /ul /li -lia href=#jsf-managedbean-to-cdi-mapping-todoJSF ManagedBean to CDI mapping (TODO)/a/li lia href=#converter-validator-injection-todoConverter amp; Validator Injection (TODO)/a/li lia href=#event-broadcasting-todoEvent broadcasting (TODO)/aul lia href=#beforejsfrequest-afterjsfrequestBeforeJsfRequest / AfterJsfRequest/a/li @@ -323,12 +329,42 @@ The best way, to apply it for all views, li@GroupedConversationScoped/li /ul h1 id=scopes-todoScopes (TODO)/h1 +h2 id=windowscoped@WindowScoped/h2 +pThe window-scope is like a session per window. That means that the data is bound to a window/tab and it not shared between windows (like the session scope does). Usually you need the window-scope instead of the session-scope. There aren't a lot of use-cases which need shared data between windows./p +div class=codehiliteprespan class=nd@WindowScoped/span +span class=kdpublic/span span class=kdclass/span span class=ncPreferencesBean/span span class=kdimplements/span span class=nSerializable/span +span class=o{/span +span class=c1//.../span +span class=o}/span +/pre/div + + +h2 id=viewaccessscoped@ViewAccessScoped/h2 +pIn case of conversations you have to un-scope beans manually (or they we be terminated automatically after a timeout). However, sometimes you need beans with a lifetime which is as long as needed and as short as possible - which are terminated automatically (as soon as possible). In such an use-case you can use this scope. The simple rule is, as long as the bean is referenced by a page - the bean will be available for the next page (if it's used again the bean will be forwarded again). It is important that it's based on the view-id of a page (it isn't based on the request) so e.g. Ajax requests bdon't/b trigger a cleanup if the request doesn't access all view-access scoped beans of the page. That's also the reason for the name @emView/emAccessScoped./p +div class=codehiliteprespan class=nd@ViewAccessScoped/span +span class=kdpublic/span span class=kdclass/span span class=ncWizardBean/span span class=kdimplements/span span class=nSerializable/span +span class=o{/span +span class=c1//.../span +span class=o}/span +/pre/div + + +pHint: br/ +@ViewAccessScoped beans are best used in conjunction with the codeCLIENTWINDOW/code window handling, which ensures a clean browser-tab separation without touching the old windowId. Otherwise a 'open in new tab' on a page with a @ViewAccessScoped bean might cause the termination (and re-initialization) of that bean./p +h2 id=groupedconversationscoped@GroupedConversationScoped/h2 +pSee a href=#grouped-conversations(Grouped-)Conversations/a/p +h2 id=viewscoped@ViewScoped/h2 +pDeltaSpike provides an CDI context for the JSF 2.0/2.1 @javax.faces.bean.ViewScoped. You can simply annotate your bean with @javax.faces.bean.ViewScoped and @Named./p +h2 id=jsf-20-scopesJSF 2.0 Scopes/h2 +pJSF 2.0 introduced new annotations as well as a new scope - the View Scope. CODI allows to use all the CDI mechanisms in beans annotated with:/p ul -li@WindowScoped/li -li@ViewAccessScoped/li -li@GroupedConversationScoped/li -li@ViewScoped/li +lijavax.faces.bean.ApplicationScoped/li +lijavax.faces.bean.SessionScoped/li +lijavax.faces.bean.RequestScoped/li +lijavax.faces.bean.ViewScoped/li /ul +pFurthermore, the managed-bean annotation (javax.faces.bean.ManagedBean) is mapped to @Named from CDI./p +pAll these annotations are mapped automatically. So you won't face issues, if you import a JSF 2 annotation instead of the corresponding CDI annotation./p h1
svn commit: r1568078 - /deltaspike/site/trunk/content/jsf.mdtext
Author: tandraschko Date: Thu Feb 13 22:44:41 2014 New Revision: 1568078 URL: http://svn.apache.org/r1568078 Log: added scopes prototype Modified: deltaspike/site/trunk/content/jsf.mdtext Modified: deltaspike/site/trunk/content/jsf.mdtext URL: http://svn.apache.org/viewvc/deltaspike/site/trunk/content/jsf.mdtext?rev=1568078r1=1568077r2=1568078view=diff == --- deltaspike/site/trunk/content/jsf.mdtext (original) +++ deltaspike/site/trunk/content/jsf.mdtext Thu Feb 13 22:44:41 2014 @@ -182,10 +182,49 @@ Don't forget to set the ClientWindowRend #Scopes (TODO) - - @WindowScoped - - @ViewAccessScoped - - @GroupedConversationScoped - - @ViewScoped +## @WindowScoped +The window-scope is like a session per window. That means that the data is bound to a window/tab and it not shared between windows (like the session scope does). Usually you need the window-scope instead of the session-scope. There aren't a lot of use-cases which need shared data between windows. + +:::java +@WindowScoped +public class PreferencesBean implements Serializable +{ +//... +} + +## @ViewAccessScoped +In case of conversations you have to un-scope beans manually (or they we be terminated automatically after a timeout). However, sometimes you need beans with a lifetime which is as long as needed and as short as possible - which are terminated automatically (as soon as possible). In such an use-case you can use this scope. The simple rule is, as long as the bean is referenced by a page - the bean will be available for the next page (if it's used again the bean will be forwarded again). It is important that it's based on the view-id of a page (it isn't based on the request) so e.g. Ajax requests bdon't/b trigger a cleanup if the request doesn't access all view-access scoped beans of the page. That's also the reason for the name @*View*AccessScoped. + +:::java +@ViewAccessScoped +public class WizardBean implements Serializable +{ +//... +} + +Hint: br/ +@ViewAccessScoped beans are best used in conjunction with the `CLIENTWINDOW` window handling, which ensures a clean browser-tab separation without touching the old windowId. Otherwise a 'open in new tab' on a page with a @ViewAccessScoped bean might cause the termination (and re-initialization) of that bean. + + +## @GroupedConversationScoped +See a href=#grouped-conversations(Grouped-)Conversations/a + +## @ViewScoped + +DeltaSpike provides an CDI context for the JSF 2.0/2.1 @javax.faces.bean.ViewScoped. You can simply annotate your bean with @javax.faces.bean.ViewScoped and @Named. + +## JSF 2.0 Scopes + +JSF 2.0 introduced new annotations as well as a new scope - the View Scope. CODI allows to use all the CDI mechanisms in beans annotated with: + + - javax.faces.bean.ApplicationScoped + - javax.faces.bean.SessionScoped + - javax.faces.bean.RequestScoped + - javax.faces.bean.ViewScoped + +Furthermore, the managed-bean annotation (javax.faces.bean.ManagedBean) is mapped to @Named from CDI. + +All these annotations are mapped automatically. So you won't face issues, if you import a JSF 2 annotation instead of the corresponding CDI annotation. # Type-safe View-Configs @@ -1183,8 +1222,6 @@ Example - Implicit sub-group: In the listing above all beans which implement the Wizard interface will be closed as soon as you close the ImplicitSubGroup. -#JSF ManagedBean to CDI mapping (TODO) - #Converter Validator Injection (TODO) #Event broadcasting (TODO)
svn commit: r897831 - in /websites/staging/deltaspike/trunk/content: ./ jsf.html
Author: buildbot Date: Thu Feb 13 22:45:53 2014 New Revision: 897831 Log: Staging update by buildbot for deltaspike Modified: websites/staging/deltaspike/trunk/content/ (props changed) websites/staging/deltaspike/trunk/content/jsf.html Propchange: websites/staging/deltaspike/trunk/content/ -- --- cms:source-revision (original) +++ cms:source-revision Thu Feb 13 22:45:53 2014 @@ -1 +1 @@ -1568078 +1568079 Modified: websites/staging/deltaspike/trunk/content/jsf.html == --- websites/staging/deltaspike/trunk/content/jsf.html (original) +++ websites/staging/deltaspike/trunk/content/jsf.html Thu Feb 13 22:45:53 2014 @@ -177,7 +177,11 @@ lia href=#sub-conversation-groupsSub-Conversation-Groups/a/li /ul /li -lia href=#converter-validator-injection-todoConverter amp; Validator Injection (TODO)/a/li +lia href=#injection-in-jsf-artifacts-todoInjection in JSF Artifacts (TODO)/aul +lia href=#converter-validatorConverter amp; Validator/a/li +lia href=#phaselistenerPhaseListener/a/li +/ul +/li lia href=#event-broadcasting-todoEvent broadcasting (TODO)/aul lia href=#beforejsfrequest-afterjsfrequestBeforeJsfRequest / AfterJsfRequest/a/li lia href=#beforephase-afterphaseBeforePhase / AfterPhase/a/li @@ -1280,7 +1284,9 @@ A sub-group is just a class or an interf pIn the listing above all beans which implement the Wizard interface will be closed as soon as you close the ImplicitSubGroup./p -h1 id=converter-validator-injection-todoConverter amp; Validator Injection (TODO)/h1 +h1 id=injection-in-jsf-artifacts-todoInjection in JSF Artifacts (TODO)/h1 +h2 id=converter-validatorConverter amp; Validator/h2 +h2 id=phaselistenerPhaseListener/h2 h1 id=event-broadcasting-todoEvent broadcasting (TODO)/h1 h2 id=beforejsfrequest-afterjsfrequestBeforeJsfRequest / AfterJsfRequest/h2 h2 id=beforephase-afterphaseBeforePhase / AfterPhase/h2