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");