我们可以用创建一个会话(session)的形式实现不同组件的信息共享。
接下来开始介绍Servlet中的另外重要知识点——会话(session)。
总结为:
1、Session可实现多个页面的信息共享,具体表现是可以多次访问同一个网页,或是一个web应用的多个网页
2、存储用户状态信息
3、保留指定时间,但指定时间过后,会话将失效
4、Servlet容器为每一个HttpSession对象分配唯一标识——JSESSIONID
知道了会话(Session)有这些特点后做个测试,就拿之前重定向的例子测试。
HttpSession对象和HttpServletRequest对象都有setAttribute()方法和getAttribute()方法,只是作用域不同。
浏览器地址栏输入:
http://localhost:8080/Servlet16_10_3/ForwardServlet?username=张三
为了验证是否可跨多页面共享信息,在WebRoot目录下新建一个session.jsp
在浏览器地址栏输入:
http://localhost:8080/Servlet16_10_3/session.jsp
因此可以肯定的是session可以实现跨多页面获取session范围内的信息。
接下来来了解session的生命周期:
1、开始新的会话,即Servlet容器创建一个新的HttpSession对象。
(1)、一个浏览器进程第一次访问Web应用中支持会话的任意一个网页
(2)、当浏览器进程与Web应用的一次会话应经被销毁后,再次访问Web应用中支持会话的任意一个网页。
2、会话销毁,即Servlet容器使HttpSession对象结束生命周期,且存放在会话范围内的共享数据也都被销毁:
(1)、服务器端执行httpSession对象的invalidate()方法;
(2)、会话过期
提示下浏览器关闭后,并不表示session被销毁了,它依然存在,只是当重写打开浏览器访问相同网页时,Servlet容器重新创建一个JSESSIONID,而标识之前会话信息的JSESSIONID已经随浏览器关闭而在内存中被释放,因而获取不到之前的会话信息。
Session是跟踪客户状态的一种常用方法,现在在介绍另外一种跟踪客户状态的技术——Cookie。
总结为:
Cookie是在客户端访问Web服务器时,服务器在客户端硬盘上存放的信息。
Cookie的应用方法:
写cookie:
Cookie theCookie=new Cookie(“username”,”Tom”);
response.addCookie(theCookie);
读cookie:
Cookie cookies[]=request.getCookies();
Cookie的有效期:
当Servlet向客户端写Cookie时,可以通过Cookie类的setMaxAge(int expiry)方法来设置Cookie的有效期,单位:秒
(1)、如果expiry大于零,就指示浏览器在客户端硬盘上保存Cookie的时间为expiry秒;
(2)、如果expiry等于零,就指示浏览器删除当前Cookie;
(3)、如果expiry小于零,就指示浏览器不要把Cookie保存到客户端硬盘,Cookie仅仅存在于当前的浏览器进程中,当浏览器进程关闭,Cookie也就消失。Cookie默认有效期为-1.
做个例子测试Cookie
定义一个CookieServlet,具体代码如下:
package com.java.web.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CookieServlet extends HttpServlet{
private static final long serialVersionUID = 3751236036982540499L;
int count1 = 0;
int count2 = 0;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
Cookie cookie = new Cookie("name" + count1++, "value" + count2++);
//设置Cookie的有效期
cookie.setMaxAge(10);
//向客户端发送一个Cookie
resp.addCookie(cookie);
PrintWriter ps = resp.getWriter();
//获取客户端的Cookie
Cookie[] cookies = req.getCookies();
if (cookies == null) {
return;
}
for (Cookie cookie2 : cookies) {
ps.write("");
ps.write("CookieName:" + cookie2.getName());
ps.write("
");
ps.write("CookieValue:" + cookie2.getValue());
ps.write("
");
ps.write("");
}
}
}
配置信息:
<servlet>
<servlet-name>CookieServletservlet-name>
<servlet-class>com.java.web.servlet.CookieServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>CookieServletservlet-name>
<url-pattern>/Cookie.htmlurl-pattern>
servlet-mapping>
浏览器地址栏输入:
http://localhost:8080/Servlet16_10_3/Cookie.html
测试结果:
因为设置了Cookie的有效期,所以过一段时间刷新,之前的Cookie会销毁。
至此Servlet基本介绍完。