【发布时间】:2011-04-14 11:51:51
【问题描述】:
我需要编写一个小型 Java 类,使我能够添加到当前用户会话并从中读取。
我看到的所有东西都是指 Servlet,但我最好只使用一个普通的旧类。
谁能帮助这个Java新手?
谢谢
【问题讨论】:
标签: java servlets httpsession
我需要编写一个小型 Java 类,使我能够添加到当前用户会话并从中读取。
我看到的所有东西都是指 Servlet,但我最好只使用一个普通的旧类。
谁能帮助这个Java新手?
谢谢
【问题讨论】:
标签: java servlets httpsession
一般来说,正如其他答案中提到的那样,会话在许多方面都充当商店。因此,要与来自 Servlet/JSP 框架之外的另一个类的会话进行交互,需要获取对相关会话的引用。有几种方法可以实现:
1)将会话作为方法参数的一部分传递(已在其他答案中提到) 2) 将会话绑定到当前正在执行的线程上的线程局部变量(参考ThreadLocal)。该方法的优点是不需要在需要使用会话的类的方法签名上声明具体参数。此外,如果调用线程通过一个库,然后再次调用某个特定的类,例如Servlet->YourClass0 -> Apache Some Library -> YourClass1,会话也将可用于 YourClass1。
但是,当执行线程通过初始组件(比如说servlet)返回时,也需要清除本地线程,否则肯定会出现内存泄漏。
另外,关于session的处理,请参考你的具体框架,上述机制在Tomcat中运行良好。
【讨论】:
是的,只需将 HttpRequest 从您的 servlet 传递给您的班级。
在你的 servlet 中做这样的事情,
cmd.execute(request);
在你的课堂上做这样的事情,
public class Command implements ICommand {
.
.
public void execute(HttpServletRequest request){
HttpSession sess = request.getSession(false);
}
.
.
.
}
【讨论】:
HttpSession session = request.getSession(); ?
使用基于组件的 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 对象的事实。你能做的最好的就是homegrow some abstraction 围绕它(但你最终会像 JSF2/Struts2 已经在做的那样,所以你为什么要自学 - 除非出于爱好/自学目的:))。
【讨论】:
“会话”的一般概念实际上只是用于 HTTP 客户端和服务器之间交互的数据存储。会话管理由所有 HTTP Servlet 自动处理。什么框架?
如果您只是想为控制台应用存储信息以在运行之间记住信息,那么请考虑使用 Xml 从文件中保存/加载数据。
【讨论】: