Session

来源:互联网 发布:地板平扣和锁扣 知乎 编辑:程序博客网 时间:2024/04/30 06:01

1、通过Session来让同一个会话域(Session scope)的应用来持有一个对象。
  例如我们创建了一个类Status,用来保存一些信息。怎么让JSP页面,handler(一个类文件)持有同一个Status实例呢?
  在JSP中,可以通过以下方法来持有:
 ① Status status = (Status)request.getSession(false).getValue(WebKey.STATUS);
  这里先用request.getSession(false),来得到与这个应用相同的Session,然后通过Session类的getValue(String name),来得到name指向的对象实例。

  在handler中,可以通过以下方法来持有Status的类实例:
 ② Status status = getStatus(request);

  这里主要的就是getStatus方法了,这个方法是handler里面的方法。是用来让JSP和handler持有同一个Status实例的。看如下的实现:
 ③  protected Status getStatus(HttpServletRequest request)
         throws SessionExpiredException
         {
         HttpSession session = request.getSession(false);
         if(session == null)
                  throw new SessionExpiredException();
         Status status = (Status)session.getValue("status");
         if(status == null)
                  throw new SessionExpiredException();
         else
             return status;
         }
  通过上面的三项,可以看到,持有同一个应用的Session,实际上,都是通过request.getSession( true | false );这个方法,这是因为request对象表示的就是HTTP的请求,而Session也是请求内容的一部分。
  Status status = (Status)session.getValue("status");(getValue在2.2以后,已经被getAttribute方法替代)中的"status",又是何时通过setAttribute方法设置的呢?这个就是我们打开的第一JSP页面创建的(显式创建),例如,我们在第一个页面中有如下代码:
     Status status = new Status();
         status.setUser(user);
         status.setStyle("shrj");
         session.putValue(WebKey.STATUS, status);
         session.putValue("style","shrj");
   那么,我们就可以在getStatus方法中通过Status status = (Status)session.getValue("status");方法,让JSP页面和Handler处理类持有同一个Status实例。
  是不是所有的类,只要包含有HttpServletRequest参数,都可以通过session来让这个类与JSP页面持有同一个Status实例呢?
  从上面的描述中,抽出持有同一个Session的方法:
 ① JSP要向我们的Handler发送一个HttpServletRequest请求(这个要看我们的配置文件或from中的method值)
 ② 我们写的方法(getStatus(HttpServletRequest request))要持有这个JSP页面发送的HttpServletRequest请求。
 ③ 通过HttpServletRequest实例得到Session。
  持有同一个对象实例:
 这个就要通过Session实例的setAttribute(java.lang.String name, java.lang.Object value)这个方法,来通过一个name值为Session来绑定这个对象。然后通过这同一个Session实例,利用getAttribute(java.lang.String name)方法来得到这个name指定的对象。
 
 ① Status status = new Status();
     session.setAttribute("status", status);
 ② HttpSession session = request.getSession(false); 
 ③ Status status = (Status)session.getAttribute("status");
 

原创粉丝点击