Ich versuche, ein benutzerdefiniertes Servlet (für AJAX / JSON) zu schreiben, in dem ich auf meinen @ManagedBeans
Namen verweisen möchte . Ich hoffe zu kartieren:
http://host/app/myBean/myProperty
zu:
@ManagedBean(name="myBean")
public class MyBean {
public String getMyProperty();
}
Ist es möglich, eine Bean namentlich von einem regulären Servlet zu laden? Gibt es ein JSF-Servlet oder einen Helfer, den ich dafür verwenden könnte?
Ich scheine vom Frühling verwöhnt zu sein, in dem all dies zu offensichtlich ist.
jsf
jakarta-ee
servlets
jsf-2
managed-bean
Konrad Garus
quelle
quelle
Antworten:
In einem Servlet basierten Artefakt, wie
@WebServlet
,@WebFilter
und@WebListener
können Sie ein „plain vanilla“ JSF greifen@ManagedBean @RequestScoped
durch:und
@ManagedBean @SessionScoped
von:und
@ManagedBean @ApplicationScoped
von:Beachten Sie, dass dies voraussetzt, dass die Bean bereits zuvor von JSF automatisch erstellt wurde. Sonst werden diese zurückkehren
null
. Sie müssten dann die Bean manuell erstellen und verwendensetAttribute("beanName", bean)
.Wenn Sie CDI
@Named
anstelle von JSF 2.3 verwenden können@ManagedBean
, ist dies noch einfacher, insbesondere weil Sie die Beans nicht mehr manuell erstellen müssen:Beachten Sie, dass dies bei Verwendung nicht funktioniert,
@Named @ViewScoped
da die Bean nur anhand des JSF-Ansichtsstatus identifiziert werden kann und nur verfügbar ist, wenn dieFacesServlet
aufgerufen wurde. In einem Filter, der zuvor ausgeführt wird, wird der Zugriff auf ein@Inject
Ed@ViewScoped
immer ausgelöstContextNotActiveException
.Nur wenn Sie drinnen sind
@ManagedBean
, können Sie verwenden@ManagedProperty
:Beachten Sie, dass dies nicht in einem nicht funktioniert
@Named
oder@WebServlet
oder einem anderen Artefakt. Es funktioniert wirklich@ManagedBean
nur im Inneren .Wenn Sie sich nicht in einem befinden
@ManagedBean
, das jedochFacesContext
verfügbar ist (dhFacesContext#getCurrentInstance()
nicht zurückkehrtnull
), können Sie auch Folgendes verwendenApplication#evaluateExpressionGet()
:was wie folgt bequem sein kann:
und kann wie folgt verwendet werden:
Siehe auch:
quelle
PostBean bean = context.getApplication().evaluateExpressionGet(context, "#{beanName}", PostBean.class);
FacesContext
ist verfügbar, obwohl diestatic
Utility-MethodefindBean()
in einer einfachen Java-Klasse definiert ist. Wie ist es dort in einer einfachen Java-Klasse verfügbar, die nicht von JSF verwaltet wird?Ich benutze die folgende Methode:
Auf diese Weise kann ich das zurückgegebene Objekt typisiert abrufen.
quelle
Class
Argument ist in diesem Konstrukt nämlich unnötig).Haben Sie einen Ansatz wie auf diesem Link ausprobiert? Ich bin nicht sicher, ob
createValueBinding()
noch verfügbar ist, aber Code wie dieser sollte von einem einfachen alten Servlet aus zugänglich sein. Dies erfordert, dass Bean bereits vorhanden ist.http://www.coderanch.com/t/211706/JSF/java/access-managed-bean-JSF-from
quelle
Sie können die verwaltete Bean erhalten, indem Sie den Namen übergeben:
quelle
Ich hatte die gleiche Anforderung.
Ich habe den folgenden Weg benutzt, um es zu bekommen.
Ich hatte Sitzungsbohnen.
Ich habe den folgenden Code in meiner Servlet-Methode doPost () verwendet.
es hat mein Problem gelöst.
quelle
Ich benutze das:
Und dann anrufen:
Auf diese Weise können Sie Ihren Code umgestalten und Verwendungen problemlos verfolgen.
quelle