Доступ к 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 9

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);
    }
Тем не менее, какова цель этого сервлета? Не пытаетесь ли вы достичь какого-то функционального требования неверным путем?