ADF : OnPageLoad sur une page JSPX

Dans cet article nous allons voir comment réagir au chargement d’une page JPSX.
L’idée va être de créer une classe qui va réagir aux phases du cycle de vie de la page et qui va lancer des méthodes en fonction de la phase en cours d’exécution. Nous allons dans un premier temps créer cette classe abstraite, puis dans un second temps nous allons l’étendre pour ajouter le fonctionnel. Cela nous permettra de créer des classes de type « OnPageLoad » sans avoir à tout ré-écrire à chaque utilisation.

Classe de base

Créons une classe abstraite OnPageLoadListener qui étend PagePhaseListener du package oracle.adf.controller.v2.lifecycle.

package org.me.example;
import oracle.adf.controller.v2.lifecycle.Lifecycle;
import oracle.adf.controller.v2.lifecycle.PagePhaseEvent;
import oracle.adf.controller.v2.lifecycle.PagePhaseListener;
import oracle.adf.view.rich.context.AdfFacesContext;
public abstract class OnPageLoadListener implements PagePhaseListener {
	public void beforePhase(PagePhaseEvent pagePhaseEvent) {
		if (pagePhaseEvent.getPhaseId() == Lifecycle.PREPARE_MODEL_ID) {
			onPageLoad();
		}
	}
	public void afterPhase(PagePhaseEvent pagePhaseEvent) {
		if (pagePhaseEvent.getPhaseId() == Lifecycle.PREPARE_RENDER_ID) {
			onPagePreRender();
		}
	}
	/**
	 * This method is call on PageLoad,
	 * it could be overriden
	 */
	public void onPageLoad() {
	}
	/**
	 * This method is call on PagePreRender,
	 * it could be overriden
	 */
	public void onPagePreRender() {
	}
	/**
	 * Is the request a PostBack
	 * @return true if request is a PostBack
	 */
	public boolean isPostBack() {
		return AdfFacesContext.getCurrentInstance().isPostback();
	}
}

Voici ce que déclare cette classe :

  • beforePhase(PagePhaseEvent) : Cette méthode défini ce qu’il faut faire avant l’exécution de la phase passée en paramètre.
    Dans notre cas, elle appelle une autre méthode « onPageLoad() » si la phase en cours est « PREPARE_MODEL_ID ».
  • afterPhase(PagePhaseEvent) : Cette méthode défini ce qu’il faut faire après l’exécution de la phase passée en paramètre.
    Dans notre cas, elle appelle une autre méthode « onPagePreRender() » si la phase en cours est « PREPARE_RENDER_ID ».
  • onPageLoad() : Elle est appelée par beforePhase au moment opportun. Elle peut être réécrite dans les classes filles afin de réagir au chargement de la page JSPX
  • onPagePreRender() : Elle est appelée par afterPhase au moment opportun. Elle peut être réécrite dans les classes filles afin de réagir après le « preRender » de la page.
  • isPostBack() : Cette méthode permet de savoir s’il s’agit ou non d’une requête « Post-Back », par exemple le clic sur un bouton demandant une action du côté serveur.

Héritage

Maintenant que notre classe mère est prête, il nous faut créer une classe fille qui va réécrire les deux méthodes onPageLoad() et onPagePreRender(). Nous allons y mettre un logger à titre d’exemple.

package org.me.example;
import org.apache.log4j.Logger;
/**
 * Just a little test of OnPageLoad java class
 */
public class OnHomePageLoad extends OnPageLoadListener {
	/**
	 * Logger
	 */
	private static final Logger LOGGER = Logger.getLogger(OnHomePageLoad.class);
	@Override
	public void onPageLoad() {
	   LOGGER.debug("onPageLoad : isPostBack=" + isPostBack());
	}
	@Override
	public void onPagePreRender() {
	   LOGGER.debug("onPagePreRender : isPostBack=" + isPostBack());
	}
}

Utilisation

Pour finir il ne nous reste qu’à l’affecter à une page JSPX. Cela s’effectue dans le pageDef de la page :

<?xml version="1.0" encoding="UTF-8" ?>
<pageDefinition xmlns="http://xmlns.oracle.com/adfm/uimodel"
                   version="11.1.1.59.23" id="homePageDef1"
                   Package="org.me.example.view.pageDefs"
                   ControllerClass="org.me.example.OnHomePageLoad">
  <parameters/>
  <executables>
    <!-- ... -->
  </executables>
  <bindings/>
</pageDefinition>

Maintenant lancez votre application, rendez-vous sur la page en question, et regarder vos logs pour y voir les messages suivants :

20 juin 2012 01:31:44 DEBUG [OnHomePageLoad] onPageLoad : isPostBack=true
20 juin 2012 01:31:44 DEBUG [OnHomePageLoad] onPagePreRender : isPostBack=true