我需要编写一个小型 Java 类,使我能够添加到当前用户会话并从中读取。
我看到的所有东西都指的是 Servlet,但我最好只使用一个普通的旧类。
谁能帮助这个Java新手?
谢谢
我需要编写一个小型 Java 类,使我能够添加到当前用户会话并从中读取。
我看到的所有东西都指的是 Servlet,但我最好只使用一个普通的旧类。
谁能帮助这个Java新手?
谢谢
“会话”的一般概念实际上只是 HTTP 客户端和服务器之间交互的数据存储。会话管理由所有 HTTP Servlet 自动处理。什么框架?
如果您只是想为控制台应用程序存储信息以记住运行之间的信息,请考虑使用 Xml 从文件中保存/加载数据。
使用基于组件的 MVC 框架,该框架将所有丑陋的 Servlet API 细节抽象出来,从而最终实现零javax.servlet
导入。这样的例子有 JSF2 和 Struts2。
例如,在 JSF2 中,您只需将User
类声明为会话范围的托管 bean:
@ManagedBean
@SessionScoped
public class User {
// ...
}
然后在您用于处理表单提交的“动作”bean 中,将其作为托管属性引用:
@ManagedBean
@RequestScoped
public class SomeFormBean {
@ManagedProperty(value="#{user}")
private User user;
public void submit() {
SomeData someData = user.getSomeData();
// ...
}
}
而已。
如果您想坚持使用原始 Servlet API,那么您必须接受必须传递原始HttpServletRequest/HttpServletResponse
对象的事实。你能做的最好的事情是围绕它进行一些抽象(但你最终会像 JSF2/Struts2 已经在做的那样,所以你为什么要自己开发 - 除非出于爱好/自学目的:))。
是的,只需HttpRequest
从您的 servlet 传递给您的班级。
在你的 servlet 中做这样的事情,
cmd.execute(request);
在你的课堂上做这样的事情,
public class Command implements ICommand {
.
.
public void execute(HttpServletRequest request){
HttpSession sess = request.getSession(false);
}
.
.
.
}
一般来说,正如其他答案中提到的那样,会话在许多方面都充当商店。因此,要与来自 Servlet/JSP 框架之外的另一个类的会话进行交互,需要获取对相关会话的引用。有几种方法可以实现:
1)将会话作为方法参数的一部分传递(已在其他答案中提到) 2)将会话绑定到当前正在执行的线程上的线程局部变量(请参阅ThreadLocal)。该方法的优点是不需要在需要使用会话的类的方法签名上声明具体参数。此外,如果调用线程通过一个库,然后再次调用某个特定类,例如 Servlet->YourClass0 -> Apache Some Library -> YourClass1,则会话也将可用于 YourClass1。
但是,当执行线程通过初始组件(比如说servlet)返回时,也需要清除本地线程,否则肯定会出现内存泄漏。
另外,会话处理请参考你的具体框架,上述机制在Tomcat中运行良好。