Доступ к JSF managedBean из сервлета [дубликат]
На этот вопрос уже есть ответ здесь:
Мне нужно знать, каков наилучший метод доступа к JSF managedBean (который определен с областью применения) из сервлета. В настоящее время у меня есть что-то вроде этого в моем сервлете:
MyApplicationScopeBean bean = null;
try {
FacesContext fContext = FacesUtil.getFacesContext(req, resp);
ServletContext sc = (ServletContext) fContext.getExternalContext().getContext();
bean = (MyApplicationScopeBean) sc.getAttribute("myManagedBean");
} catch (Exception e) {
e.printStackTrace();
}
FacesUtil.Ява (как описано в http://balusc.blogspot.com/2006/06/communication-in-jsf.html):
import javax.faces.FactoryFinder;
import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;
import javax.faces.context.FacesContextFactory;
import javax.faces.lifecycle.Lifecycle;
import javax.faces.lifecycle.LifecycleFactory;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FacesUtil {
// Getters -----------------------------------------------------------------------------------
public static FacesContext getFacesContext(
HttpServletRequest request, HttpServletResponse response)
{
// Get current FacesContext.
FacesContext facesContext = FacesContext.getCurrentInstance();
// Check current FacesContext.
if (facesContext == null) {
// Create new Lifecycle.
LifecycleFactory lifecycleFactory = (LifecycleFactory)
FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY);
Lifecycle lifecycle = lifecycleFactory.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE);
// Create new FacesContext.
FacesContextFactory contextFactory = (FacesContextFactory)
FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY);
facesContext = contextFactory.getFacesContext(
request.getSession().getServletContext(), request, response, lifecycle);
// Create new View.
UIViewRoot view = facesContext.getApplication().getViewHandler().createView(
facesContext, "");
facesContext.setViewRoot(view);
// Set current FacesContext.
FacesContextWrapper.setCurrentInstance(facesContext);
}
return facesContext;
}
// Helpers -----------------------------------------------------------------------------------
// Wrap the protected FacesContext.setCurrentInstance() in a inner class.
private static abstract class FacesContextWrapper extends FacesContext {
protected static void setCurrentInstance(FacesContext facesContext) {
FacesContext.setCurrentInstance(facesContext);
}
}
}
Я всегда получаю null, когда пытаюсь получить доступ к Бобу из сервлета.
каковы ваши предложения?
Я запускаю JSF 1.2 на Tomcat 6
Спасибо за помощь.
1 ответ:
JSF хранит управляемые бобы с областью применения только в
ServletContext
. В сервлетахServletContext
доступно только по наследству.getServletContext()
метод. Вам не нужно вручную создавать вокруг него целоеFacesContext
. Это только неоправданно дорогая задача для этой цели.protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Bean bean = (Bean) getServletContext().getAttribute("bean"); // ... }
Если он возвращает
null
, то это просто означает, что JSF еще не запустил автоматическое создание Боба для вас (т. е. сервлет вызывается слишком рано). Затем вам нужно будет создать и сохранить его себе. Он будет использоваться JSF, если имя управляемого компонента (ключ атрибута) совпадает.Тем не менее, какова цель этого сервлета? Не пытаетесь ли вы достичь какого-то функционального требования неверным путем?if (bean == null) { bean = new Bean(); getServletContext().setAttribute("bean", bean); }