java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台(即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se))的总称。
这篇文章主要介绍了 servlet 之 session 简介,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Session 是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的 session 对象,注意是默认情况下,一个浏览器独占一个 session,由于 session 为用户浏览器独享,所以用户在访问服务器的 web 资源时,可以把各自数据存放在各自的 session 中,当用户再去访问服务器的其他 web 资源时,其他 web 资源再从用户各自的 session 中取出数据为用户服务。
Session 和 Cookie 的主要区别:Cookie 技术是客户端技术,是由服务器将用户的数据写回给用户浏览器的。
Session 技术是服务器端技术,是把用户的数据写到服务器为用户所创建的独享的 Session 对象中,但 Session 是基于 Cookie 的。
Session 对象由服务器创建,这跟 Cookie 不一样。编程人员可以通过 request 请求对象的 getSession() 方法获取 Session 对象。注意,Session 一旦创建,是会存活无操作情况(或者浏览器关闭)下 30 分钟,这是由服务器 (如 Tomcat) 来指定的。当我们关闭浏览器后,因为 Session 是基于 cookie 的,因此 Session 是存在的,只是我们可能无法再使用到(要看 cookie 是否还能取到)。
那么我们以一个简单的 Session 例子来说明,创建两个 Servlet:分别命名为 ServletDemo1 和 ServletDemo2。
在 ServletDemo1 中的代码如下:
- HttpSession session = request.getSession();
- String data = "message form SessionDemo";
- session.setAttribute("data", data);
在 ServletDemo2 中的代码如下:
- response.setContentType("text/html;charset=utf-8");
- PrintWriter writer = response.getWriter();
- HttpSession session = request.getSession();
- String data = (String) session.getAttribute("data");
- writer.write(data);
当我们打开一个浏览器先访问 ServletDemo1,此时浏览器会帮我们创建 Session 对象,并保存数据,这时再访问 ServletDemo2 可以看到该保存的数据:
说明 Session 确实能保存访问不同 Servlet 时的数据。
这里说清楚一点,虽然代码都是相同的,但是针对不同浏览器访问的话看到的是不同的 Session 对象保存的不同的数据,虽然这时候数据都是一样的。比如说 A 在自己主机上访问这个 Servlet 和 B 在自己电脑上访问这个相同的 Servlet,A 和 B 得到各自的 Session。
而如果我们打开一个浏览器访问 ServletDemo1 后,再打开另一个浏览器访问 ServletDemo2,那么则会显示该数据找不到:
注意:这时候是两个浏览器,即已经是两个会话了!!!
我们来做一个类似于点击商品然后能加入到购物车的案例,使用 Session 技术。
前提准备,我们需要为商品创建 JavaBean,代码如下:
- public class Product {
- private String id;
- private String name;
- private String author;
- public Product() {
- super();
- }
- public Product(String id, String name, String author) {
- super();
- this.id = id;
- this.name = name;
- this.author = author;
- }
- public String getId() {
- return id;
- }
- public void setId(String id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getAuthor() {
- return author;
- }
- public void setAuthor(String author) {
- this.author = author;
- }
然后再建立一个数据库,以类的方式来创建(谁让数据库还没学呢 T_T!),然后使用 Map 集合来存储数据,便于通过键值对检索:
- public class ProductDatabase {
- private static Map<String,Product> map = new HashMap<String,Product>();
- static{
- map.put("1", new Product("1","《Java编程思想》","JB"));
- map.put("2", new Product("2","《Java核心技术》","fdaf"));
- map.put("3", new Product("3","《Java并发编程》","什么鬼"));
- map.put("4", new Product("4","《Head first 设计模式》","老王"));
- map.put("5", new Product("5","《HTML5权威手册》","hhaa"));
- }
- public static Map<String,Product> getMap() {
- return map;
- }
- }
好了,我们在商品显示的首页显示商品,同时为每个商品建立一个超链接,以便于当用户点击超链接时能将商品的 id 作为存储数据的依据由其他 Servlet 类获取用户购买的商品种类:
- response.setCharacterEncoding("UTF-8");
- response.setContentType("text/html;charset=utf-8");
- PrintWriter writer = response.getWriter();
- //获取数据库中的商品数据
- Map < String,
- Product > map = ProductDatabase.getMap();
- for (Map.Entry < String, Product > entry: map.entrySet()) {
- Product book = entry.getValue();
- writer.print(book.getName() + " <a href='/myservlet/servlet/BuySession?id=" + book.getId() + "' >购买</a> <br/>");
- }
此时可以看一看效果:
接着我们来做 点击购买超链接后的 Servlet,该 Servlet 需要将获取用户所购买的商品(通过 id 号),同时需要获取(创建)Session 对象,并利用一个集合将所购买的商品存入,这个 Session 对象存储用户希望购买的商品,当我们跳转到购物车页面上时能从 Session 中取出商品并显示:
- //获取用户所购买商品的id号
- String productId = request.getParameter("id");
- Product book = ProductDatabase.getMap().get(productId);
- //将用户所购买的商品加入到Session对象中保存,以便最后一起结账,类似于购物车功能
- HttpSession session = request.getSession();
- List < Product > list = (List < Product > ) session.getAttribute("productList");
- if (list == null) {
- //首次购买
- list = new ArrayList < Product > ();
- session.setAttribute("productList", list);
- }
- list.add(book);
- //跳转到购物车列表上
- response.sendRedirect("/myservlet/servlet/CartListServlet");
注意:这里使用的是 sendRedirect 重定向,如果使用的是 forward 转发,则在购物车页面进行刷新的话会将每次购买的商品再次购买。
在购物车页面的 Servlet 中功能就可以比较简单了,从用户的 Session 中取出保存的购买商品对象,并显示在页面上即可:
- response.setCharacterEncoding("UTF-8");
- response.setContentType("text/html;charset=utf-8");
- PrintWriter writer = response.getWriter();
- writer.print("您购买的商品如下: <br/>");
- HttpSession session = request.getSession();
- List < Product > list = (List < Product > ) session.getAttribute("productList");
- for (Product p: list) {
- writer.write(p.getName() + "<br/>");
- }
点击多个商品,会看到在购物车的 Servlet 页面上会显示出我们购买的商品:
而另外开启的多个浏览器点击这些商品会看到购买的不同购物车页面,所以可以使用 Session 来解决不同用户来访问相同页面而同时保存他们各自不同数据的需求。
当然这只是一个简单的强调 session 对象能在一个会话过程中保存一个浏览器访问多个 Servlet 中会产生的数据,上面这样的简单示例肯定是不能用于购物的,比如当我们将浏览器关闭时(会话结束),这个 session 对象就结束了,那么下次再打开浏览器我们的购物车将一无所有,如果要满足用户的不同需求,那么就要了解一些 session 对象的底层结构
来源: http://www.phperz.com/article/18/0101/355934.html