zoukankan      html  css  js  c++  java
  • 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");
        }
  • 相关阅读:
    hdu2717 Catch That Cow
    hdu1017
    Html5 学习笔记 【PC固定布局】 实战2 导航栏搜索区域
    Html5 学习笔记 【PC固定布局】 实战1 导航栏
    Html5 学习笔记 Sublime text3 和 Emmet 插件
    Html5 学习笔记 --》布局
    Html5 学习笔记 --》css3 学习
    Html5 学习笔记 --》html基础 css 基础
    数据库备份
    spring boot 尚桂谷学习笔记11 数据访问03 JPA
  • 原文地址:https://www.cnblogs.com/xxbbtt/p/8399077.html
Copyright © 2011-2022 走看看