在这次的例子里面,将完成一类似购物车的功能,在客户访问网站的时候,会选中自己将要购买的商品,而购物车将始终维持着商品的状态,会话将联系起选择第一个商品(第一个请求),选择其他商品(其他请求)以及付款等等操作。

1、在Web.xml中配置会话

  1. <session-config>
  2. <session-timeout>30</session-timeout>
  3. <cookie-config>
  4. <http-only>true</http-only>
  5. </cookie-config>
  6. <tracking-mode>COOKIE</tracking-mode>
  7. </session-config>

  使用这样的设置,会话超过30分钟将会失效,使用cookie进行会话追踪,在会话cookie从将HttpOnly置为true用于解决安全问题。

2、页面逻辑

  这个demo只有两个网页,以下是这两个网页预览:

  • 第一页商品列表页面将拥有一个点击进入购物车的链接View Cart,和一个商品列表,商品的名字可点击,点击之后将把该商品加入购物车。

  • 这是购物车页面的预览,这里将有一个返回商品列表页面的链接,然后是一个点击之后清空购物车的Empty Cart,再然后就是显示购物车中商品及其数目的列表。

3、JSP

  • 先是商品列表页面,View Cart被点击之后,action将被置于viewCart这个变量将在doGet方法中使用,这里使用了一个map记录了商品的编号和名字,点击后action将被置于addToCart,productId将赋值为商品的id
  1. <%@ page import="java.util.Map" %>
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5. <title>Product List</title>
  6. </head>
  7. <body>
  8. <h2>Product List</h2>
  9. <a href="<c:url value="/shop?action=viewCart" />">View Cart</a><br /><br />
  10. <%
  11. @SuppressWarnings("unchecked")
  12. Map<Integer, String> products =
  13. (Map<Integer, String>)request.getAttribute("products");
  14.  
  15. for(int id : products.keySet())
  16. {
  17. %><a href="<c:url value="/shop">
  18. <c:param name="action" value="addToCart" />
  19. <c:param name="productId" value="<%= Integer.toString(id) %>"/>
  20. </c:url>"><%= products.get(id) %></a><br />
  21. <%
  22. }
  23. %>
  24. </body>
  25. </html>
  • 这是购物车页面的JSP,这里使用的有两个map,products是记录商品的id和名字,cart记录商品的id和已选数,然后是两个链接,第一个链接将直接返回商品链表页面,第二个将清空购物车,具体实现是将action赋值为emptyCart,然后交由Servlet操作。
  1. <%@ page import="java.util.Map" %>
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5. <title>View Cart</title>
  6. </head>
  7. <body>
  8. <h2>View Cart</h2>
  9. <a href="<c:url value="/shop" />">Product List</a><br /><br />
  10. <a href="<c:url value="/shop?action=emptyCart" />">Empty Cart</a><br /><br />
  11. <%
  12. @SuppressWarnings("unchecked")
  13. Map<Integer, String> products =
  14. (Map<Integer, String>)request.getAttribute("products");
  15. @SuppressWarnings("unchecked")
  16. Map<Integer, Integer> cart =
  17. (Map<Integer, Integer>)session.getAttribute("cart");
  18.  
  19. if(cart == null || cart.size() == 0)
  20. out.println("Your cart is empty.");
  21. else
  22. {
  23. for(int id : cart.keySet())
  24. {
  25. out.println(" "+products.get(id) + " (qty: " + cart.get(id) +
  26. ")<br />");
  27. }
  28. }
  29. %>
  30. </body>
  31. </html>

4、代码逻辑

  • 首先是doGet,根据actiond的值将调用不同的方法
  1. @Override
  2. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  3. String action = req.getParameter("action");
  4. if(action == null){
  5. action = "browse";
  6. }
  7.  
  8. switch (action){
  9. case "addToCart":
  10. //将商品加入购物车中
  11. this.addToCart(req,resp);
  12. break;
  13. case "viewCart":
  14. //进入购物车页面
  15. this.viewCart(req,resp);
  16. break;
  17. case "emptyCart":
  18. //清空购物车
  19. this.emptyCart(req,resp);
  20. break;
  21. case "browse":
  22. default:
  23. //进入商品列表页面
  24. this.browse(req,resp);
  25. break;
  26. }
  27. }
  • 这两个方法将直接把请求转发给JSP并传递products这个map对象,
  1. private void viewCart(HttpServletRequest req, HttpServletResponse resp)
  2. throws ServletException,IOException {
  3. req.setAttribute("products",this.products);
  4. req.getRequestDispatcher("/WEB-INF/jsp/view/viewCart.jsp")
  5. .forward(req,resp);
  6. }
  7.  
  8. private void browse(HttpServletRequest req, HttpServletResponse resp)
  9. throws ServletException,IOException {
  10. req.setAttribute("products",this.products);
  11. req.getRequestDispatcher("/WEB-INF/jsp/view/browse.jsp")
  12. .forward(req,resp);
  13. }
  • addToCart方法将把请求中的商品加入购物车中,首先从请求头中获取到商品的id,然后调用HttpServletRequest的getSession方法获取会话,getSession有两种方式:getSession()和getSession(boolean)。也就是说其实可以选择不输入参数和输入true或者false三种,其中getSession()和getSession(true)效果是一样的,如果会话存在就返回已有会话,如果会话不存在就创建一个新的会话(并不会返回null),而getSession(false)如果会话存在就返回会话,如果不存在就返回null。然后查询会话中的cart特性,如果不存在就添加cart特性,cart其实一个根据id存储商品数目的map,如果cart中没有该商品数目最终就置1,如果有将加1。
  1. private void addToCart(HttpServletRequest req, HttpServletResponse resp)
  2. throws ServletException,IOException {
  3. int productId;
  4. try {
  5. productId = Integer.parseInt(req.getParameter("productId"));
  6. }catch (Exception e){
  7. resp.sendRedirect("shop");
  8. return;
  9. }
  10.  
  11. HttpSession session = req.getSession();
  12. if(session.getAttribute("cart") == null){
  13. session.setAttribute("cart", new Hashtable<Integer, String>());
  14. }
  15.  
  16. Map<Integer, Integer> cart = (Map<Integer, Integer>)session.getAttribute("cart");
  17. if(!cart.containsKey(productId)){
  18. cart.put(productId,0);
  19. }
  20. cart.put(productId,cart.get(productId) + 1);
  21.  
  22. resp.sendRedirect("shop");
  23. }
  • 最后是清空购物车的emptyCart方法,这里将删除会话中的cart,从而实现清空购物车的功能
  1. private void emptyCart(HttpServletRequest req, HttpServletResponse resp)
  2. throws ServletException,IOException {
  3. req.getSession().removeAttribute("cart");
  4. resp.sendRedirect("shop?action=viewCart");
  5. }

JavaWeb——使用会话维持状态2的更多相关文章

  1. JavaWeb——使用会话维持状态

    1.会话的作用 使用会话是为了维持状态,维持的是请求域请求之间的状态.因为HTTP请求自身是完全无状态的.从服务器的角度来看,当用户发出第一个请求开始,服务器无法将新的请求与之前的请求关联起来,举例说 ...

  2. JavaWeb——使用会话维持状态3

    这次的例子是使用会话给上一个例子添加登陆功能 1.页面逻辑 首先是登陆页面,这里需要输入账号和密码,输入正确后将进入商品列表页面,输入错误将会提示账号或者密码错误 其次是商品列表和购物车页面,添加了注 ...

  3. SqlServer性能急剧下降,查看所有会话的状态及等待类型---Latch_Ex

    当某个数据库文件空间用尽,做自动增长的时候,同一时间点只能有一个用户人员可以做文件自动增长动作,其他任务必须等待,此时会出现Latch资源的等待.使用sp_helpdb查看业务数据库时发现:该数据库设 ...

  4. [原创]java WEB学习笔记28: 会话与状态管理Cookie 机制

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  5. JavaWeb(六):会话与状态管理

    HTTP协议是一种无状态的协议,WEB服务器本身不能识别出哪些请求是同一个浏览器发出的 ,浏览器的每一次请求都是完全孤立的.即使 HTTP1.1 支持持续连接,但当用户有一段时间没有提交请求,连接也会 ...

  6. JavaWeb基础—会话管理之Cookie

    一.什么是会话 打开浏览器,浏览各种资源,点击各种超链接,直至关闭浏览器,整个过程称为会话 二.会话管理的两种技术 1.Cookie 基于客户端.在客户端记录信息来确认用户身份.以cookie的形式写 ...

  7. JavaWeb基础: 会话技术简介

    会话技术 用户使用Web应用的过程实际是调用了一系列的Servlet来组合处理请求,从而完成整个业务流.不同Servlet组合起来为用户服务的时候就会遇到一个数据共享和传输的问题,如何让多个Servl ...

  8. java_web学习(8)会话与状态管

    HTTP简介       WEB浏览器与WEB服务器之间的一问一答的交互过程必须遵循一定的规则,这个规则就是HTTP协议.HTTP是hypertext transfer protocol(超文本传输协 ...

  9. JavaWeb基础 - 会话

    会话概述 什么是会话 简单的理解:用户打开浏览器,点击多个超链接,访问Web服务器上多个资源,然后关闭浏览器,整个过程称之为一次会话. 需要解决的问题 每个用户在使用浏览器与服务器会话的过程中,会产生 ...

随机推荐

  1. 浅谈iOS需要掌握的技术点

    鉴于很多人的简历中的技术点体现(很多朋友问我iOS需要知道注意哪些)! 技术点: 1.热更新 (及时解决线上问题) 2.runtime(json解析.数据越界.扩大button点击事件.拦截系统方法) ...

  2. 使用开源框架Sqlsugar结合mysql开发一个小demo

    一.Sqlsugar简介 1.性能上有很大优势 sqlsugar是性能最好的ORM之一,具有超越Dapper的性能 ,走的是EMIT够构中间语言动态编译到程序集,完成高性能的实体绑定,达到原生水平. ...

  3. 2.秋招复习简单整理之String、StringBuffer、StringBuilder的区别和联系

    String特点: 1.String是不可变对象,一旦赋值创建就不变,这意味着对String的一切修改将产生一个新的字符串,比如String的subString,replace.toUpperCase ...

  4. 1. 全文搜索框架 Haystack

    1.什么是Haystack Haystack是django的开源全文搜索框架(全文检索不同于特定字段的模糊查询,使用全文检索的效率更高 ),该框架支持Solr,Elasticsearch,Whoosh ...

  5. samba搭建与配置说明

    1. 环境检查getenforce 检查selinux service iptables stop 2.安装samba yum -y install samba 3.配置samba /etc/samb ...

  6. 学习2:总结# 1.while # 2.字符串格式化 # 3.运算符 # 4.编码初始

    目录 1.while循环 -- 死循环 2.字符串格式化: 3.运算符 4.编码 1.while循环 -- 死循环 while 条件: 循环体 打断死循环: break -- 终止当前循环 改变条件 ...

  7. NOIP2018提高/普及成绩

    明天就要出了,不忍看到自己爆零,现在很慌. 大家都考的如何呢?欢迎留言自己的分数或预估分数.

  8. c语言进阶4-有返回值函数

    一.         从函数返回 从函数返回就是返回语句的第一个主要用途.在程序中,有两种方法可以终止函数的执行,并返回到调用函数的位置.第一种方法是在函数体中,从第一句一直执行到最后一句,当所有语句 ...

  9. Quartus ii调试技巧_01

    前几天李主任跟我分享了一些特别好用的调试技巧: 1)System Sources and Probes Editor---类似于人为设置触发条件,创建虚拟按键等功能,这段时间一直在做一个电机的驱动,板 ...

  10. Spring方法级别数据校验:@Validated + MethodValidationPostProcessor

    每篇一句 在<深度工作>中作者提出这么一个公式:高质量产出=时间*专注度.所以高质量的产出不是靠时间熬出来的,而是效率为王 相关阅读 [小家Java]深入了解数据校验:Java Bean ...