如何从Java类中访问会话

5

我需要编写一个小的Java类,使我能够添加到并从当前用户会话中读取。

我看到的所有内容都涉及Servlets,但我最好只使用一个普通的类。

有谁能帮助这个Java新手吗?

谢谢

4个回答

2

“Session”的一般概念实际上是HTTP客户端和服务器之间交互的数据存储。所有HTTP Servlet都会自动处理会话管理。使用哪个框架?

如果您只想在控制台应用程序中存储信息以在运行之间记住信息,则考虑使用Xml从文件中保存/加载数据。


1
我知道什么是会话。我想要的是能够从我的JSP页面调用一个类,并从会话中读取和写入数据的能力。 - griegs
哦,如果你想从 JSP 访问会话,那么这就像这样简单:session.setAttribute("test", "value");。请看 http://www.jsptut.com/Sessions.jsp - Sam Day
1
会话(session)在JSP页面中自动设置为一个变量,就像请求(request)一样。 - Sam Day
1
我知道如何在JSP页面中访问会话,但我想要的是从在JSP中引用的类文件中访问会话。 - griegs
注意:当使用JSP时,它会编译成一个servlet。因此,为了访问会话,类需要以与从serlet引用该类时完全相同的方式获取访问权限。 - Jaydee

1

是的,只需从您的servlet将HttpRequest传递给您的类即可。

在您的servlet中,可以这样做:

cmd.execute(request);

在你的类中做类似这样的事情,
public class Command implements ICommand {
   .
   .
   public void execute(HttpServletRequest request){
      HttpSession sess = request.getSession(false);
   }
   .
   .
   .
}

我不想使用servlet的原因是因为我不知道如何使用它们,因此只想要一个类。如果您能提供示例代码... - griegs
2
哦,好的。那你在做什么呢?我的意思是你要开发什么样的应用程序? - Adeel Ansari
尝试开发一个网络应用程序,我想要一个集中管理会话的地方。我原以为可以简单地导入一个库来访问会话,但现在我认为我需要将httpsession传递给我的类。 - griegs
1
@griegs:你的假设是正确的。在Java中开发所谓的Web应用程序,必须使用Servlet。通过使用一些高级框架,您可能会感觉到可以在没有Servlet的情况下完成它,但那只是虚假的印象。了解Servlet是必须的。 - Adeel Ansari
2
为什么不直接使用 HttpSession session = request.getSession(); 呢? - BalusC
显示剩余2条评论

1

使用基于组件的MVC框架,将所有丑陋的Servlet API细节抽象化,以便您最终不需要导入任何javax.servlet。这样的例子有JSF2和Struts2。

例如,在JSF2中,您只需将User类声明为会话作用域托管bean:

@ManagedBean
@SessionScoped
public class User {
    // ...
}

然后在处理表单提交的“action” bean 中,将其作为托管属性引用:

@ManagedBean
@RequestScoped
public class SomeFormBean {

    @ManagedProperty(value="#{user}")
    private User user;

    public void submit() {
        SomeData someData = user.getSomeData();
        // ...
    }
}

就是这样。

如果您想坚持使用原始的Servlet API,那么您必须接受必须在对象之间传递原始的HttpServletRequest/HttpServletResponse的事实。最好的方法是在其周围homegrow some abstraction(但是这样您最终会像JSF2/Struts2已经在做的那样,那么除了出于爱好/自学目的外,为什么要自己开发呢 :))。


0
通常情况下,正如其他答案中提到的那样,会话在许多方面充当存储器。因此,要从Servlet/JSP框架之外的另一个类与会话进行交互,需要获取有关该会话的引用。有几种方法可以实现:
1)将会话作为方法参数的一部分传递(已在其他答案中提到) 2)将会话绑定到线程本地变量上,以便在当前执行的线程上执行(参见ThreadLocal)。这种方法的优点是不需要在需要使用会话的类的方法签名上声明特定的参数。此外,如果调用线程通过库,然后再次调用某些特定的类,例如Servlet->YourClass0->Apache Some Library->YourClass1,则会话也将对YourClass1可用。
但是,当执行线程通过初始组件返回(例如servlet)时,线程本地还需要被清除,否则可能会出现内存泄漏。
此外,请参考您特定的框架以处理会话,在Tomcat中上述机制运行良好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接