We apologize for untranslated text, you can use the Google Translation button to get an automatic translation of the web page in the language of your choice.

Ajouter des beans à la session JCMS

Jean-Rémy Gallapont · on 5/16/08 at 4:19 PM

Bonjour,

Je cherche à ajouter des beans à la session JCMS pour avoir d'autres informations que le JcmsContext, la publication...

L'idée est bien sur de ne pas avoir de java ou d'appel java dans les JSP et donc de peupler la session avec mes beans complémentaires dans une classe appelée systématiquement par JCMS.

Les dataControllers ou les PolicyFilters sont appellés par JCMS mais uniquement dans certaines conditions (écriture, controles d'integrité...). Est ce qu'il y a des listeners / controllers / filters qui sont dédiés à la session ?

Merci

8 pts
Jean-Emmanuel Roux · on 5/16/08 at 5:24 PM

Bonjour,

Il n'existe pas de notion de session JCMS à proprement parlé. JCMS se base sur la session J2EE.

  • Pour ajouter ou supprimer des beans dans la session J2EE vous pouvez utiliser les primitives suivantes:
JCMSContext context = Channel.getCurrentJCMSContext();

if (context  != null) {

    HttpSession session = context.getSession();

   //Mise en session
   session.setAttribute("clef", <valeur>);

   //Lecture depuis la session
   session.getAttribute("clef");

}
  • Pour ajouter ou supprimer des beans dans la session J2EE au moment du login/logout du membre vous pouvez vous appuyer sur l'écriture d'un AuthentificationHandler
  • Pour écouter l'activité (création/suppression) de beans dans la session J2EE vous pouvez définir un listener J2EE

Pour mémoire, ce listener se déclare dans le fichier WEB-INF\web.xml de votre webapp


<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" 
 
        ...

 <listener>
  <listener-class>mon.package.MonListener</listener-class>
 </listener>

        ...

</web-app>
0 pts
Jean-Rémy Gallapont · on 5/16/08 at 6:25 PM

Je pense que le listener pourrait convenir. Est ce que dans celui ci je peux peupler la session avec JCMSContext context = Channel.getCurrentJCMSContext(); et session.setAttribute("clef", <valeur>);

J'ai des beans qui sont nécessaires dans beaucoup de pages pour remplir des listes déroulantes ou des arbres. Les données sont calculées et triées à partir de catégories. Ces beans ne changent jamais (sauf modif des catégories mais rare). Donc plutot que de les reconstruires à chaque fois (appel au channel) je pensais le faire une fois s'ils n'existent pas encore et les propager dans la session

A moins que de faire un singleton et un appel java à partir de la JSP soit la solution ?

Qu'en pensez vous ?

Merci

0 pts
Jean-Emmanuel Roux · on 5/19/08 at 11:38 AM

Bonjour,

Si vous utilisez les listener J2EE, la session vous est donnée en argument des méthodes. Donc pas la peine d'utiliser le Channel.getCurrentJCMSContext().

Cf. Exemple ci-dessous.

public class MaSessionListener implements HttpSessionListener {
 
  public void sessionCreated(HttpSessionEvent se) {
    HttpSession session = se.getSession();
   <votre_code_de_mise_en_session>
  }
 
  public void sessionDestroyed(HttpSessionEvent se) {
    HttpSession session = se.getSession();
   <votre_code_de_retrait_de_session>
  }
}

Cependant, pour la constitution de vos menus déroulant, nous ne vous conseillons pas l'utilisation de la session pour des problématiques :

  • de réplication de session dans le cas de la mise oeuvre d'un site JCMS à haute disponibilité avec le protocole de réplication JSync.
  • d'utilisation de plusieurs pages de navigation (système d'onglets des navigateurs)

Les pistes à suivre sont les suivantes :

  • Insérer dans la JSP doInitCustom.jsp le code associé au calcul de vos menus. Ce code sera visible/accessible sur chacune de vos pages,
  • Ecrire une classe utilitaire sous forme de singleton, pour permettant de récupérer le contenu de vos menus pré-calculés
  • Utiliser le tag <jalios:cache> en capsule du code de constitution de vos menus, afin d'éviter le recalcul des menus à chaque affichage de la page.
0 pts