Из сервлета, как вы получаете доступ к переменной внутри соответствующего фильтра сервлета? - PullRequest
2 голосов
/ 20 сентября 2010

Я хотел бы использовать следующий фильтр для открытия и закрытия менеджеров персистентности.

public final class PersistenceFilter implements Filter {
    private static final PersistenceManagerFactory persistenceManagerFactory
        = JDOHelper.getPersistenceManagerFactory("transactions-optional");

    private static PersistenceManagerFactory factory() {
        return persistenceManagerFactory;
    }

    private static ThreadLocal currentManager = new ThreadLocal();

    public static PersistenceManager getManager() {
        if (currentManager.get() == null) {
            currentManager.set(factory().getPersistenceManager());
        }
        return currentManager.get();
    }
    @Override
    public void doFilter(ServletRequest req, ServletResponse res,
            FilterChain chain) throws IOException, ServletException {
        PersistenceManager manager  = null;
        try {
            manager = getManager();
            //Optional: allow all persistent objects implementing a custom interface
            //to be notified of when they are saved and loaded.
            manager.addInstanceLifecycleListener(new PersistHookListener(), PersistHooks.class);
            chain.doFilter(req, res);
        } finally {
            if (manager != null) {
                manager.flush();
                manager.close();
            }
        }
    }
    @Override
    public void init(FilterConfig arg0) throws ServletException {}
    @Override
    public void destroy() {}
}

Чего я не знаю, так это как получить доступ к переменной manager из соответствующего сервлета, который получаетвызывается после этого фильтра.

1 Ответ

3 голосов
/ 20 сентября 2010

В фильтре поместите менеджера в качестве атрибута запроса:

request.setAttribute("persistenceManager", manager);

Затем в сервлете он доступен с помощью:

PersistenceManager manager = 
     (PersistenceManager) request.getAttribute("persistenceManager");
...