session是与请求有关的会话期,它是java.servlet.http.HttpSession类的对象,用来表示和存储当前页面的请求信息。
在实际的Web应用开发过程会经常遇到这样的一个问题:会话状态的维持。当然有很多种方法可以用来解决这个问题,例如:Cookies、隐藏的表单输入域或者将状态信息直接附加到URL当中去,但是这些方法使用非常不便。
Java Servlet提供了一个可以在多个请求之间持续有效的会话对象HttpSession,此对象允许用户存储和提取会话状态的信息。JSP同样也支持了Servlet中的这个概念。JSP中的session内置对象就是对应于Servlet中的HttpSession对象。当Web应用系统希望通过多个页面完成一个事务的时候,session的使用是非常有用和方便的。
session对象的常用方法
getId():此方法返回唯一的标识,这些标识为每个session而产生。当只有一个单一的值与一个session联合时,或当日志信息与先前的sessions有关时,它被当作键名用。
getCreationTime():返回session被创建的时间。最小单位为千分之一秒。为得到一个对打印输出很有用的值,可将此值传给Date constructor 或者GregorianCalendar的方法setTimeInMillis。
getLastAccessedTime():返回session最后被客户发送的时间。最小单位为千分之一秒。
getMaxInactiveInterval():返回总时间(秒),负值表示session永远不会超时。
getAttribute(String key):通过给定的关键字获取一个存储在session中相对应的信息。例如,Integer item = (Integer) session.getAttrobute("item")。
setAttribute(String key, Object obj):提供一个关键词和一个对象值,然后存在session当中。例如,session.setAttribute("ItemValue", itemName)。
session一般在服务器上设置了一个30分钟的过期时间,当客户端停止操作后30分钟,session中存储的信息会自动失效。
另外读者要非常注意的,session中保存和查找的信息不能是基本的类型,如int、double等,而必须是Java相对应的对象,例如Integer、Double等。
问题回答操作实例
接下来本书将创建三个页面来模拟一个多页面的Web应用,使得读者能够对session的使用有深入的了解。第一个页面(session1.jsp)仅仅包含了一个要求输入用户名的HTML表单,代码如下:
用户名输入页面
程序说明:通过<form>把参数提交给session2.jsp页面进行处理。这一页面的效果如图8.4所示。
第二个页面(session2.jsp)需要通过request对象获取session1.jsp页面中的username参数值,并把它保存在session中。session对象是以哈希表存储信息的。session2.jsp的另外一个操作是询问第二个问题,具体的代码如下:
回答问题页面
<%
String username = request.getParameter("username"); //获得传递参数username
session.setAttribute("theusername",username); //把用户名保存在session中,String可以当着对象
%>
您的用户名为:<%=username%>
第三个页面(session3.jsp)主要任务是显示回答结果。具体代码如下:
显示答案
<%! String food="";%>
<%
food = request.getParameter("food"); //取得food参数值
String name = (String)session.getValue("theusername"); //从session取出关键字为theusername的对象
%>
您的用户名:<%=name%>
您喜欢吃:<%=food%>
程序说明:通过关键字theusername使用session对象中的getAttribute(String key)方法获取到用户名,并把用户名和第二个问题的答案显示出来。
session内置对象的使用非常频繁,例如,使用session来存储用户的信息,并可以根据session中的用户对象是否为空来判断用户是否已经登陆。所以读者对此对象的使用要熟练掌握。
application是javax.servlet.ServletContext类对象的一个实例,用于实现用户之间的数据共享(多使用于网络聊天系统)。
application对象与session对象的区别
它的作用有点类似于前一节介绍的session内置对象。但是它们之间还是有区别的,一般来说,一个用户对应着一个session,并且随着用户的离开session中的信息也会消失,所以不同客户之间的会话必须要确保某一时刻至少有一个客户没有终止会话;而applicat则不同,它会一直存在,类似于系统的“全局变量”,而且只有一个实例。
application对象的常用方法
application内置对象的常用方法如下:
getAttribute(String key):通过一个关键字返回用户所需要的信息,返回类型为对象(Object),类似于session中的getAttribute(String key)方法。
getAttributeNames():返回所有可用的属性名,返回类型为枚举(Enumeration)。
setAttribute(String key, Object obj):保存一个对象信息,并指定给一个关键字。
removeAttribute(String key):通过关键字来删除一个对象信息。
getServletInfo():返回JSP引擎的相关信息。
getRealPath(String path):返回虚拟路径的真实路径。
getContext(String URLPath):返回执行Web应用的application对象。
getMajorVersion()和getMinorVersion():返回服务器所支持的Servlet API最大和最小版本号。
getMineType(String file):返回指定文件的MIME类型。
getResource(String path):返回指定资源的URL路径。
getResourceAsStream(String path):返回指定资源的输入流。
getRequestDispatcher(String URLPath):返回指定资源的RequestDispatcher对象。
getServlet(String name):返回指定名称的Servlet。
getServlets():返回所有的Servlet,返回类型为枚举型。
getServletNames():返回所有的Servlet名称,返回类型为枚举型。
log(String msg):把指定信息写入到Servlet的日志文件中。
log(String msg, Throwable throwable):把栈轨迹以及给出的Throwable异常的说明信息写入Servlet的日志文件。
网站计数器实例
同样,下面将通过一个实例来讲解Application内置对象中常用方法的使用。
在模块helloworld中创建一个setappattr.jsp页面,用于获取application内置对象中的信息以及设置计数初始值,详细代码如下:
获得application信息
ServletInfo:<%=application.getServerInfo()%>
application.jsp real path: <%=application.getRealPath("/application.jsp")%>
HelloServlet Real Path: <%=application.getRealPath("/servletsample/HelloServlet")%>
Major Version: <%=application.getMajorVersion()%>
get MIME: <%=application.getMimeType("/servletsample/demo.htm")%>
getResource: <%=application.getResource("/HelloJSP.jsp")%>
<%
out.println("
设置数值
");
application.setAttribute("name","zzb"); //把字符串“zzb”对象保存在application中
application.setAttribute("counter","1"); //把字符串值“1”保存在application中
out.println("set name=zzb");
out.println("
set counter=1");
%>