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

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

1、在Web.xml中配置会话

  <session-config>
    <session-timeout>30</session-timeout>
    <cookie-config>
      <http-only>true</http-only>
    </cookie-config>
    <tracking-mode>COOKIE</tracking-mode>
  </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
<%@ page import="java.util.Map" %>
<!DOCTYPE html>
<html>
    <head>
        <title>Product List</title>
    </head>
    <body>
        <h2>Product List</h2>
        <a href="<c:url value="/shop?action=viewCart" />">View Cart</a><br /><br />
        <%
            @SuppressWarnings("unchecked")
            Map<Integer, String> products =
                    (Map<Integer, String>)request.getAttribute("products");

            for(int id : products.keySet())
            {
                %><a href="<c:url value="/shop">
                    <c:param name="action" value="addToCart" />
                    <c:param name="productId" value="<%= Integer.toString(id) %>"/>
                </c:url>"><%= products.get(id) %></a><br />
        <%
            }
        %>
    </body>
</html>
  • 这是购物车页面的JSP,这里使用的有两个map,products是记录商品的id和名字,cart记录商品的id和已选数,然后是两个链接,第一个链接将直接返回商品链表页面,第二个将清空购物车,具体实现是将action赋值为emptyCart,然后交由Servlet操作。
<%@ page import="java.util.Map" %>
<!DOCTYPE html>
<html>
    <head>
        <title>View Cart</title>
    </head>
    <body>
        <h2>View Cart</h2>
        <a href="<c:url value="/shop" />">Product List</a><br /><br />
        <a href="<c:url value="/shop?action=emptyCart" />">Empty Cart</a><br /><br />
        <%
            @SuppressWarnings("unchecked")
            Map<Integer, String> products =
                    (Map<Integer, String>)request.getAttribute("products");
            @SuppressWarnings("unchecked")
            Map<Integer, Integer> cart =
                    (Map<Integer, Integer>)session.getAttribute("cart");

            if(cart == null || cart.size() == 0)
                out.println("Your cart is empty.");
            else
            {
                for(int id : cart.keySet())
                {
                    out.println("   "+products.get(id) + " (qty: " + cart.get(id) +
                            ")<br />");
                }
            }
        %>
    </body>
</html>

4、代码逻辑

  • 首先是doGet,根据actiond的值将调用不同的方法
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String action = req.getParameter("action");
        if(action == null){
            action = "browse";
        }

        switch (action){
            case "addToCart":
                //将商品加入购物车中
                this.addToCart(req,resp);
                break;
            case "viewCart":
                //进入购物车页面
                this.viewCart(req,resp);
                break;
            case "emptyCart":
                //清空购物车
                this.emptyCart(req,resp);
                break;
            case "browse":
            default:
                //进入商品列表页面
                this.browse(req,resp);
                break;
        }
    }
  • 这两个方法将直接把请求转发给JSP并传递products这个map对象,
    private void viewCart(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException,IOException {
        req.setAttribute("products",this.products);
        req.getRequestDispatcher("/WEB-INF/jsp/view/viewCart.jsp")
                .forward(req,resp);
    }

    private void browse(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException,IOException {
        req.setAttribute("products",this.products);
        req.getRequestDispatcher("/WEB-INF/jsp/view/browse.jsp")
                .forward(req,resp);
    }
  • 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。
    private void addToCart(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException,IOException {
        int productId;
        try {
            productId = Integer.parseInt(req.getParameter("productId"));
        }catch (Exception e){
            resp.sendRedirect("shop");
            return;
        }

        HttpSession session = req.getSession();
        if(session.getAttribute("cart") == null){
            session.setAttribute("cart", new Hashtable<Integer, String>());
        }

        Map<Integer, Integer> cart = (Map<Integer, Integer>)session.getAttribute("cart");
        if(!cart.containsKey(productId)){
            cart.put(productId,0);
        }
        cart.put(productId,cart.get(productId) + 1);

        resp.sendRedirect("shop");
    }
  • 最后是清空购物车的emptyCart方法,这里将删除会话中的cart,从而实现清空购物车的功能
    private void emptyCart(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException,IOException {
        req.getSession().removeAttribute("cart");
        resp.sendRedirect("shop?action=viewCart");
    }

原文地址:https://www.cnblogs.com/xxbbtt/p/8399077.html

时间: 2024-10-04 11:32:55

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

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

1.会话与状态管理 1)背景 ① HTTP协议是一种无状态的协议,WEB服务器本身不能识别出哪些请求是同一个浏览器发出的 ,浏览器的每一次请求都是完全孤立的: ② 作为 web 服务器,必须能够采用一种机制来唯一地标识一个用户,同时记录该用户的状态: ③ 问题:怎么才能实现网上商店中的购物车呢:某个用户从网站的登录页面登入后,再进入购物页面购物时,负责处理购物请求的服务器程序必须知道处理上一次请求的程序所得到的用户信息. 2)会话和会话状态 ① WEB应用中的会话:指一个客户端浏览器与WEB服务

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

当某个数据库文件空间用尽,做自动增长的时候,同一时间点只能有一个用户人员可以做文件自动增长动作,其他任务必须等待,此时会出现Latch资源的等待.使用sp_helpdb查看业务数据库时发现:该数据库设置不合理,数据文件每次增长2M,日志文件每次增长10%,且分别设置了最大限制.修改为每次增长200M,不限制大小,系统恢复正常,问题解决. SqlServer阻塞时的等待类型如下: 顺便整理一下查看阻塞.会话状态及等待类型的SQL脚本: -- 查看SQL阻塞信息 with tmp as ( sele

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

HTTP协议是一种无状态的协议,WEB服务器本身不能识别出哪些请求是同一个浏览器发出的 ,浏览器的每一次请求都是完全孤立的.即使 HTTP1.1 支持持续连接,但当用户有一段时间没有提交请求,连接也会关闭.怎么才能实现网上商店中的购物车呢:某个用户从网站的登录页面登入后,再进入购物页面购物时,负责处理购物请求的服务器程序必须知道处理上一次请求的程序所得到的用户信息. 作为 web 服务器,必须能够采用一种机制来唯一地标识一个用户,同时记录该用户的状态. WEB应用中的会话是指一个客户端浏览器与W

JavaWeb基础—会话管理之Cookie

一.什么是会话 打开浏览器,浏览各种资源,点击各种超链接,直至关闭浏览器,整个过程称为会话 二.会话管理的两种技术 1.Cookie 基于客户端.以cookie的形式写给用户各自的浏览器.当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去. 2.Session 基于服务端.session类似于客户端在服务器端的账户.使用Map存放.服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象. 三.Cookie的用途 Cookie的用途: 服务器用来跟踪客户端状态

JavaWeb基础 - 会话

会话概述 什么是会话 简单的理解:用户打开浏览器,点击多个超链接,访问Web服务器上多个资源,然后关闭浏览器,整个过程称之为一次会话. 需要解决的问题 每个用户在使用浏览器与服务器会话的过程中,会产生一些用户数据,如用户登陆标记,WEB应用程序必须要为每个用户在一次或多次会话过程中保存这些数据. 两种技术 CookieCookie是客户端技术,WEB应用程序把每个用户数据以Cookie的形式发送给各自的的浏览器,当用户使用浏览器再次访问WEB应用时,就会带上这些Cookie,这样,WEB应用可以

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

HTTP简介 WEB浏览器与WEB服务器之间的一问一答的交互过程必须遵循一定的规则,这个规则就是HTTP协议.HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议集中的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程以及数据本身的格式. HTTP协议的版本:  HTTP/1.0.HTTP/1.1.HTTP-NG HTTP 的会话方式                                            

moon。  使用会话维持状态--基于java web高级编程第5章 使用会话维持状态

5.1 提出的问题 如何关联来自客户的多个请求? 5.1.1维持状态 会话用于维护请求和请求之间的状态.HTTP是无状态的 从服务器角度,当用户的Web浏览器打开第一个链接到服务器的套接字时请求就开始了,直到服务器返回最后一个数据包并关闭连接时,该请求结束. 此时,浏览器与服务器之间没有任何联系,当下一次请求链接开始时,无法将下一次请求与之前的请求关联起来. 购物车中,每次向购物车中添加商品时,网站通过什么方式了解到它们都是来自于同一个基选集中的同一浏览器,并将它关联到你的浏览器,其他人是 无法

javaweb学习——会话技术(一)

会话: 1.什么是会话:从打开一个浏览器,访问页面,到最终关闭浏览器的一个过程,就是一次会话. 2.会话的特点:包含多个请求,一次完整的会话是只针对一个用户. 3.会话机制:web中常用的技术,用来跟踪用户的整个会话,常用的会话跟踪技术有Cookie和session. Cookie通过在客户端记录信息,确定用户的身份. session通过在服务端记录信息,确定用户的身份. 4.为什么要引入会话机制: 由于Http web协议是无状态的协议,对于事务的处理是没有记忆能力.缺少状态意味着如果要处理前

JavaWeb基础—会话管理之Session

一.什么是session session类似于客户端在服务器端的账户.使用Map存放 一个会话锁定一个用户(一般情况下是一个客户端,即一个浏览器独占一个session对象),即使使用浏览器访问其他程序资源,也可以共享这个session (如何确定是同一个用户?创建session时把sessionID以cookie的形式传给客户端,客户端访问时再把此sessionID传过去进行校验 JSESSIONID ) 二.session和cookie的区别 cookie 把用户的数据保存到浏览器端,sess