servlet之session简介_动力节点Java学院整理

发布时间 - 2026-01-11 02:32:06    点击率:

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对象的底层结构


# servlet  # session简介  # session  # servlet Cookie使用方法详解(六)  # servlet之cookie简介_动力节点Java学院整理  # java中Servlet Cookie取不到值原因解决办法  # 全面了解servlet中cookie的使用方法  # Java Servlet及Cookie的使用  # servlet之session工作原理简介_动力节点Java学院整理  # servlet中session简介和使用例子  # 浅谈Servlet的Cookie和Session机制  # 购物车  # 的是  # 当我们  # 多个  # 独享  # 超链接  # 来做  # 建立一个  # 类似于  # 购买商品  # 跳转到  # 都是  # 是一个  # 这是  # 这时候  # 好了  # 还没  # 放在  # 首次  # 还能 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 网站制作价目表怎么做,珍爱网婚介费用多少?  Linux后台任务运行方法_nohup与&使用技巧【技巧】  Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】  奇安信“盘古石”团队突破 iOS 26.1 提权  Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】  详解vue.js组件化开发实践  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  如何在云主机上快速搭建多站点网站?  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  香港服务器建站指南:免备案优势与SEO优化技巧全解析  如何注册花生壳免费域名并搭建个人网站?  Laravel模型关联查询教程_Laravel Eloquent一对多关联写法  如何快速搭建高效服务器建站系统?  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  Laravel如何处理异常和错误?(Handler示例)  Laravel安装步骤详细教程_Laravel环境搭建指南  如何在Windows环境下新建FTP站点并设置权限?  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  制作公司内部网站有哪些,内网如何建网站?  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】  为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  如何快速生成高效建站系统源代码?  如何安全更换建站之星模板并保留数据?  零基础网站服务器架设实战:轻量应用与域名解析配置指南  使用PHP下载CSS文件中的所有图片【几行代码即可实现】  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  实例解析angularjs的filter过滤器  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  如何在企业微信快速生成手机电脑官网?  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  深圳网站制作的公司有哪些,dido官方网站?  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  Laravel API资源类怎么用_Laravel API Resource数据转换  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  香港服务器选型指南:免备案配置与高效建站方案解析  bootstrap日历插件datetimepicker使用方法  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  网站页面设计需要考虑到这些问题  Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解  微信小程序制作网站有哪些,微信小程序需要做网站吗?