Ich versuche, ein benutzerdefiniertes Servlet (für AJAX/JSON) zu schreiben, in dem ich meinen @ManagedBeans
anhand seines Namens referenzieren möchte. Ich hoffe zu kartieren:
http://Host/app/myBean/myProperty
zu:
@ManagedBean(name="myBean")
public class MyBean {
public String getMyProperty();
}
Kann ein Bean nach Namen von einem regulären Servlet geladen werden? Gibt es ein JSF-Servlet oder einen Helfer, den ich dafür verwenden könnte?
Ich scheine vom Frühling verwöhnt zu werden, in dem das alles zu offensichtlich ist.
In einem Servlet können Sie Anfrage-Beans erhalten, indem Sie:
Bean bean = (Bean) request.getAttribute("beanName");
und Session-basierten Beans von:
Bean bean = (Bean) request.getSession().getAttribute("beanName");
und anwendungsspezifische Beans von:
Bean bean = (Bean) getServletContext().getAttribute("beanName");
Wenn Sie in einem Abhängigkeitsinjektions-fähigen Framework/Container laufen und das Bean von CDIs @Named
statt von JSFs @ManagedBean
verwaltet wird, ist es noch einfacher:
@Inject
private Bean bean;
Wenn Sie tatsächlich innerhalb der FacesContext
sind (dh die aktuelle HTTP-Anforderung wurde über die FacesServlet
ausgeführt), verwendet der normale JSF2-Weg Application#evaluateExpressionGet()
:
FacesContext context = FacesContext.getCurrentInstance();
Bean bean = context.getApplication().evaluateExpressionGet(context, "#{beanName}", Bean.class);
die wie folgt abgerufen werden kann:
@SuppressWarnings("unchecked")
public static <T> T findBean(String beanName) {
FacesContext context = FacesContext.getCurrentInstance();
return (T) context.getApplication().evaluateExpressionGet(context, "#{" + beanName + "}", Object.class);
}
und kann wie folgt verwendet werden:
Bean bean = findBean("bean");
Wenn Sie sich jedoch bereits in einem @ManagedBean
befinden, ist die Verwendung von @ManagedProperty
sauberer, da sie eher deklarativ ist.
@ManagedProperty("#{bean}")
private Bean bean;
Ich verwende die folgende Methode:
public static <T> T getBean(final String beanName, final Class<T> clazz) {
ELContext elContext = FacesContext.getCurrentInstance().getELContext();
return (T) FacesContext.getCurrentInstance().getApplication().getELResolver().getValue(elContext, null, beanName);
}
Dadurch kann ich das zurückgegebene Objekt auf typisierte Weise abrufen.
Sie können das verwaltete Bean erhalten, indem Sie den Namen übergeben:
public static Object getBean(String beanName){
Object bean = null;
FacesContext fc = FacesContext.getCurrentInstance();
if(fc!=null){
ELContext elContext = fc.getELContext();
bean = elContext.getELResolver().getValue(elContext, null, beanName);
}
return bean;
}
Haben Sie einen Ansatz wie auf diesem Link versucht? 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 es bereits existiert.
http://www.coderanch.com/t/211706/JSF/Java/access-managed-bean-JSF-von
FacesContext context = FacesContext.getCurrentInstance();
Application app = context.getApplication();
// May be deprecated
ValueBinding binding = app.createValueBinding("#{" + expr + "}");
Object value = binding.getValue(context);
Ich hatte die gleiche Anforderung.
Ich habe den folgenden Weg benutzt, um ihn zu bekommen.
Ich hatte Sitzungsbohnen.
@ManagedBean(name="mb")
@SessionScopedpublic
class ManagedBean {
--------
}
Ich habe den folgenden Code in meiner Servlet-Methode doPost () verwendet.
ManagedBean mb = (ManagedBean) request.getSession().getAttribute("mb");
es hat mein Problem gelöst.