2016-08-12 64 views
3

有人能帮助我吗?Java - 如何将会话或请求对象从servlet传递给java类?

如何将会话或请求对象从servlet传递给java类,无论是在某种方法中,还是在java类的构造函数中。

SERVLET:

HttpSession session = request.getSession(true); 

我想通过这个会话对象的Java类,有些人告诉我如何检索和使用。

的Java类

公共类ProductsCart {

private Map<Integer, Integer> productsInCart=new HashMap<Integer,Integer>(); 

public Map<Integer, Integer> storeProductsInCart(int productId, int count) { 

......

}

如何使用会话对象在这个类?

在此先感谢。 Anju

+0

您的ProductsCart类中的方法需要访问该会话才能使用它。你的问题是什么? –

回答

-1

你的servlet到你达到这个代码(ProductsCart)的流量是多少?可能知道这可能有助于提供更好的建议。一个简单的共享上下文的方法是这样的 - 如果你的整个请求是在单个线程中处理的(你没有异步调用或者不会在中间产生新线程),你可以使用本地线程。您需要在线servlet类和ProductsCart类具有可见性的常见位置声明本地线程。现在

public class SessionContext { 

    private static final ThreadLocal<HttpSession> activeSession = 
              new ThreadLocal<HttpSession>(); 

    public HttpSession getSession() { 
     return activeSession.get(); 
    } 

    public void setSession (HttpSession session) { 
     activeSession.set(session); 
    } 
} 

从u servlet类U可以将其设置:

SessionContext.setSession(session); 

而且从ProductsCart u能访问它。

HttpSession session = SessionContext.getSession() 

将有每一个线程的线程局部变量的一个副本,如前所述,这只会如果u正在执行从同一个线程的整个流程工作。如果你产生新的线程,你可以尝试InheritableThreadLocal。新线程将继承父线程的值。但是,如果你使用线程池或异步调用,这将不起作用。在这种情况下,最好把它传递给班级。

另外,当您从servlet返回时,请确保将其设置为null,以便其他请求不会在不知情的情况下使用它。

相关问题