【问题标题】:Java-How to pass session or request object from servlet to a java class?Java-如何将会话或请求对象从 servlet 传递给 java 类?
【发布时间】:2016-08-12 03:57:54
【问题描述】:

有人可以帮我吗?

如何在某个方法或 java 类的构造函数中将会话或请求对象从 servlet 传递给 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) {

......

}

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

提前致谢。 安居

【问题讨论】:

  • ProductsCartclass 中的方法需要访问会话才能使用它。你有什么问题?

标签: java


【解决方案1】:

在您到达此代码(ProductsCart)之前,您的 servlet 流程如何?可能知道这有助于提供更好的建议。

共享上下文的一种简单方法是 - 如果您的整个请求在单个线程中处理(您没有异步调用或中间没有产生新线程),您可以使用本地线程。您需要在您的 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);
    }
}

现在你可以从你的servlet类中设置它:

SessionContext.setSession(session);

您可以从 ProductsCart 访问它。

HttpSession session = SessionContext.getSession()

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

另外,当你从 servlet 返回时,请确保将其设置为 null,这样其他请求就不会在不知不觉中使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-08
    • 2014-05-25
    • 2019-05-26
    • 2011-03-21
    • 2014-10-07
    • 2014-12-05
    • 2018-07-11
    • 1970-01-01
    相关资源
    最近更新 更多