J'essaie d'écrire un servlet personnalisé (pour AJAX / JSON) dans lequel je voudrais référencer mon @ManagedBeans
nom. J'espère cartographier:
http://host/app/myBean/myProperty
à:
@ManagedBean(name="myBean")
public class MyBean {
public String getMyProperty();
}
Est-il possible de charger un bean par son nom à partir d'un servlet normal? Y a-t-il un servlet ou un assistant JSF que je pourrais utiliser?
J'ai l'impression d'être gâté par le printemps où tout cela est trop évident.
jsf
jakarta-ee
servlets
jsf-2
managed-bean
Konrad Garus
la source
la source
Réponses:
Dans un artefact basé sur un servlet, tel que
@WebServlet
,@WebFilter
et@WebListener
, vous pouvez récupérer un JSF "plain vanilla"@ManagedBean @RequestScoped
en:et
@ManagedBean @SessionScoped
par:et
@ManagedBean @ApplicationScoped
par:Notez que cela nécessite que le bean soit déjà créé automatiquement par JSF au préalable. Sinon, ceux-ci reviendront
null
. Vous devrez ensuite créer manuellement le bean et l'utilisersetAttribute("beanName", bean)
.Si vous êtes en mesure d'utiliser CDI
@Named
au lieu de la version obsolète de JSF 2.3@ManagedBean
, c'est encore plus facile, en particulier parce que vous n'avez plus besoin de créer manuellement les beans:Notez que cela ne fonctionnera pas lorsque vous l'utilisez
@Named @ViewScoped
car le bean ne peut être identifié que par l'état d'affichage JSF et n'est disponible que lorsque leFacesServlet
a été appelé. Donc, dans un filtre qui s'exécute avant cela, accéder à un@Inject
ed@ViewScoped
sera toujours lancéContextNotActiveException
.Ce n'est que lorsque vous êtes à l'intérieur que
@ManagedBean
vous pouvez utiliser@ManagedProperty
:Notez que cela ne fonctionne pas dans un
@Named
ou@WebServlet
ou tout autre artefact. Cela ne fonctionne vraiment@ManagedBean
qu'à l' intérieur .Si vous n'êtes pas à l'intérieur de a
@ManagedBean
, mais que leFacesContext
est facilement disponible (c'estFacesContext#getCurrentInstance()
-à- dire qu'il ne revient pasnull
), vous pouvez également utiliserApplication#evaluateExpressionGet()
:qui peut être commode comme suit:
et peut être utilisé comme suit:
Voir également:
la source
PostBean bean = context.getApplication().evaluateExpressionGet(context, "#{beanName}", PostBean.class);
FacesContext
est disponible même si lastatic
méthode utilitairefindBean()
est définie dans une classe Java simple. Comment y est-il disponible dans une classe Java simple qui n'est pas gérée par JSF?J'utilise la méthode suivante:
Cela me permet d'obtenir l'objet retourné de manière typée.
la source
Class
argument est notamment inutile dans cette construction).Avez-vous essayé une approche comme sur ce lien? Je ne sais pas s'il
createValueBinding()
est toujours disponible, mais un code comme celui-ci devrait être accessible à partir d'un ancien servlet. Cela nécessite que le bean existe déjà.http://www.coderanch.com/t/211706/JSF/java/access-managed-bean-JSF-from
la source
Vous pouvez obtenir le bean géré en passant le nom:
la source
J'avais la même exigence.
J'ai utilisé la méthode ci-dessous pour l'obtenir.
J'ai eu un haricot à portée de session.
J'ai utilisé le code ci-dessous dans ma méthode servlet doPost ().
cela a résolu mon problème.
la source
J'utilise ceci:
Et puis appelez:
De cette façon, vous pouvez refactoriser votre code et suivre les utilisations sans problème.
la source