我可以从不存在请求对象的函数中访问会话对象吗?
我知道在Java中我们访问这样的会话:
HttpSession session = request.getSession(true);
但是如果我们想在请求对象不存在时访问会话怎么办?
修改
我有一个servlet
public class ABC extends HttpServlet
{
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException
{
..........
...........
myFun1(x,y,z);
}
private void myFun1(int x, int y,long z)
{
.........
myFun2(a,b);
}
private void myFun2(int a,String b)
{
.........
// Need Session here
}
}
答案 0 :(得分:6)
这取决于“当请求对象不存在时”的含义。你可以有一个线程局部变量,它在servlet的早期设置“此线程的当前请求”或者你正在运行的任何东西(你还没有说清楚)。然后你可以从任何地方得到“这个线程中的当前请求”,并以这种方式获得会话。 (或者沿着相同的行,您可以在线程局部变量中设置当前的会话而不是当前的请求。)
虽然它并不是非常漂亮,如果你想在不同的线程上做某事,你就会遇到问题。将请求或会话作为依赖关系传递通常更清晰。
答案 1 :(得分:6)
一般来说,如果您想从请求对象不可用的地方访问http会话,那么您的应用程序可能存在设计问题,您需要重新考虑问题,分层等。
答案 2 :(得分:1)
传递请求对象是解决方案,
public class ABC extends HttpServlet
{
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException
{
..........
...........
myFun1(x,y,z,req);
}
private void myFun1(int x, int y,long z,HttpServletRequest req)
{
.........
myFun2(a,b,req);
}
private void myFun2(int a,String b,HttpServletRequest req)
{
.........
// Need Session here
}
}
答案 3 :(得分:1)
如果您在应用程序中实施JSF技术,则可以通过调用来访问所有内容;
FacesContext.getCurrentInstance();
因为这是检索到的单例实例,所以您可以在表示层中的任何位置访问它。
然而,实现JSF可能只是为了这个目的而略显过度,因为您可能需要在配置和表示层中进行大量更改以适应它。
也就是说,如果你决定走这条路,你也可以考虑使用MyFaces,这对那些在应用程序中使用JSF的人来说是一个很棒的API。
答案 4 :(得分:0)
我们必须配置一个HttpSessionListener
类型的侦听器,它的方法将在会话创建时和分心时调用。如果您通过准备此类的对象来完成此操作,则可以简单地获取Session对象...