Доступ к JSF managedBean из сервлета [дубликат ]

Мне нужно чтобы узнать, как лучше всего получить доступ к управляемому компоненту JSF (который определен как имеющий область приложения) из сервлета. В настоящее время в моем сервлете есть что-то вроде этого:

  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.java (как описано в 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);
        }
    }     
}

Я всегда получаю ноль при попытке доступа к bean-компоненту из сервлета.
Ваши предложения? Я использую JSF 1.2 на Tomcat 6

Спасибо за вашу помощь.

10
задан azathoth 26 August 2010 в 19:11
поделиться

1 ответ

JSF хранит управляемые компоненты уровня приложения только в ServletContext. В сервлетах ServletContext доступен только унаследованным методом getServletContext() . Вам не нужно вручную создавать весь FacesContext вокруг него. Это только излишне дорогая задача для этой цели.

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    Bean bean = (Bean) getServletContext().getAttribute("bean");
    // ...
}

Если он возвращает null, то это просто означает, что JSF еще не включился для автоматического создания bean-компонента для вас (т. е. сервлет вызывается слишком рано). Затем вам нужно будет создать и сохранить его самостоятельно. Он будет использоваться JSF, если имя управляемого компонента (ключ атрибута) совпадает.

    if (bean == null) {
        bean = new Bean();
        getServletContext().setAttribute("bean", bean);
    }

Тем не менее, какова цель этого сервлета? Разве вы не пытаетесь выполнить какое-то функциональное требование неправильным образом?

20
ответ дан 3 December 2019 в 19:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: