Identifier de manière unique une instance d'un JSR-168 portlet
Question
Je suis en train d'écrire un JSR-168 portlet qui peut être ajouté à un conteneur à plusieurs reprises. Chaque conteneur (Liferay, JBoss, etc.) a sa propre façon interne de différencier entre plusieurs instanciations du même portlet.
Cependant, je voudrais identifier de manière unique mon exemple portlet dans la méthode de doView()
lui-même.
Y at-il standard, mécanisme JSR-168 pour récupérer une partie identifiant unique qui est différent pour chaque instance de mon portlet? Je l'ai vu différentes solutions où les gens au hasard
La solution 1,0 portlet (168) fournit le renderResponse. getNamespace () procédé, qui doit être unique par exemple de portlet. De spec: PLT.12.3.4 encodage Namespace : La méthode getNamespace doit fournir
le portlet avec un mécanisme qui
assure l'unicité du retour
chaîne dans toute la page du portail. Pour
par exemple, la méthode getNamespace serait
retourner une chaîne unique qui pourrait être
préfixé à un nom de variable JavaScript
dans le contenu généré par le
portlet, assurant son unicité 5 dans
la page. le getNamespace
méthode doit retourner la même valeur si
invoqué plusieurs fois dans un rendu
demande. Si vous voulez y accéder dans processAction , vous aurez probablement envie de le stocker dans la session ou comme actionURL paramètre . Si la mise à niveau est une option, Portlet 2.0 (286) change sous-jacent PortletResponse l'interface pour fournir les getNamespace () méthode et ajoute également une PortletRequest.getWindowID () méthode qui pourrait être utile pour vous.
Autres conseils
Non, il n'y a pas ID commun pour l'instance. Je l'ai mis en place un conteneur de portlet moi-même, il n'y a pas par exemple id dans le api public - le récipient a un, de la cause. La session de portlet (de javax.portlet.PortletRequest#getPortletSession()
) est unique pour un portlet (définition par tag dans portlet.xml
) et un utilisateur (javax.servlet.http.HttpSession
), cela ne suffit pas pour vous.
IMHO un identifiant généré (peut aussi être un compteur simple (synchronisation) dans la classe portletl) et stockées dans la session de portlet est la seule façon portable. La classe de portlet lui-même est généralement partagée beween cas, de sorte que le java.lang.System#identityHashCode(Object x)
est également inutile.
Pourquoi avez-vous besoin?
Je suis surpris de constater que cet identifiant unique ne semble pas exister comme par Amé. L'ID de l'instance peut être utilisé pour stocker toutes les préférences de portlet dans notre propre base de données plutôt que le récipient fourni un. L'une des raisons pour lesquelles nous avons besoin de stocker cela sur notre propre est les préférences fournies par conteneur ne prend pas en charge les préférences spécifiques locale.
i.e. une instance de portlet peut avoir des préférences différentes par lieu.
Nous essayons d'utiliser Liferay pour nos besoins.