05:会话及会话技术

Cookie案例演示 - 显示用户上次访问时间

1、创建Web项目

Web项目 - CookieDemo请添加图片描述
设置项目名称与保存位置
请添加图片描述
单击【Finish】按钮请添加图片描述

2、修改Artifact名称,重新部署项目

在项目结构窗口里修改Artifact名称请添加图片描述
编辑服务器配置,重新部署项目,URL变成http://localhost:8080/CookieDemo/请添加图片描述
修改首页请添加图片描述
启动服务器,查看效果请添加图片描述

3、创建LastAccessServlet类

创建net.huawei.servlet包,然后在里面创建LastAccessServlet类
请添加图片描述

package net.huawei.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 功能:显示用户上次访问时间
 * 作者:华卫
 * 日期:2023年04月21日
 */
@WebServlet(name = "LastAccessServlet", value = "/LastAccessServlet")
public class LastAccessServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 设置响应对象内容类型(网页、编码),避免中文乱码
        response.setContentType("text/html; charset=utf-8");
        // 获取打印输出流
        PrintWriter out = response.getWriter();
        // 获取所有cookie
        Cookie[] cookies = request.getCookies();
        // 定义标志变量isFirstAccess
        boolean isFirstAccess = true;
        // 判断cookies是否为空
        if (cookies.length > 0 && cookies != null) {
            // 遍历cookies数组
            for (Cookie cookie : cookies) {
                // 获取cookie的名称
                String name = cookie.getName();
                // 判断cookie名称是否为`lastTime`
                if (name.equals("lastTime")) {
                    // 用户不是第一次访问
                    isFirstAccess = false;
                    // 获取cookie的值(上次访问时间)
                    String value = cookie.getValue();
                    // 控制台输出解码前的数据
                    System.out.println("解码前:" + value);
                    // 对cookie值进行URL解码
                    value = URLDecoder.decode(value, "utf-8");
                    // 控制台输出解码后的数据
                    System.out.println("解码后:" + value);
                    // 在页面显示用户上次访问时间
                    out.print("欢迎回来,您上次访问时间:" + value);
                    // 获取当前时间字符串
                    Date date = new Date();
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
                    String strDate = sdf.format(date);
                    // 控制台输出编码前的日期数据
                    System.out.println("编码前:" + strDate);
                    // 对日期数据进行URL编码
                    strDate = URLEncoder.encode(strDate, "utf-8");
                    // 控制台输出编码后的日期数据
                    System.out.println("编码后:" + strDate);
                    // 设置cookie的值
                    cookie.setValue(strDate);
                    // 设置cookie的存活时间(以秒为单位)
                    cookie.setMaxAge(30 * 24 * 60 * 60);  // 一个月
                    // 加入cookie,让其生效
                    response.addCookie(cookie);
                }
            }
        }

        // 第一次访问
        if (isFirstAccess) {
            // 获取当前时间字符串
            Date date = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
            String strDate = sdf.format(date);
            // 控制台输出编码前的日期数据
            System.out.println("编码前:" + strDate);
            // 对日期数据进行URL编码
            strDate = URLEncoder.encode(strDate, "utf-8");
            // 控制台输出编码后的日期数据
            System.out.println("编码后:" + strDate);
            // 创建一个cookie
            Cookie cookie = new Cookie("lastTime", strDate);
            // 设置cookie的值
            cookie.setValue(strDate);
            // 设置cookie的存活时间(以秒为单位)
            cookie.setMaxAge(30 * 24 * 60 * 60);  // 一个月
            // 加入cookie,让其生效
            response.addCookie(cookie);
            // 在页面显示欢迎用户首次访问信息
            out.print("您好,欢迎您首次访问本网站~");
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }
}


4、启动服务器,查看结果

启动服务器,访问http://localhost:8080/CookieDemo/LastAccessServlet
请添加图片描述
查看控制台输出信息请添加图片描述
刷新访问地址http://localhost:8080/CookieDemo/LastAccessServlet,浏览器显示了用户的上次访问时间,这是因为用户第一次访问LastAccessServlet时,LastAccessServlet向浏览器发送并保存用户访问时间的Cookie信息。第二次访问LastAccessServlet时,服务器读取该Cookie信息,并在浏览器显示
请添加图片描述
查看控制台输出信息请添加图片描述
关闭浏览器后,再次打开浏览器,访问LastAccessServlet,浏览器依旧显示了时间,是因为我们在LastAccessServlet类的代码中设置了Cookie的有效时间为1个月。请添加图片描述
课后练习:登录表单自动填充上次登录成功的用户名请添加图片描述

Session案例演示 - 实现购物车

1、创建Web项目

创建Java Enterprise项目,添加Web Application
请添加图片描述
设置项目名称与保存位置请添加图片描述
单击【Finish】按钮请添加图片描述

2、修改Artifact名称,重新部署项目

在项目结构窗口里修改Artifact名称请添加图片描述
在服务期配置窗口里,重新部署项目请添加图片描述
切换到【Server】选项卡,设置默认浏览器请添加图片描述
修改首页请添加图片描述
启动服务器,查看结果请添加图片描述

3、创建蛋糕实体类

创建net.huawei.session.bean包,然后在包里创建Cake类请添加图片描述

package net.huawei.session.bean;

/**
 * 功能:蛋糕实体类
 * 作者:华卫
 * 日期:2023年05月23日
 */
public class Cake {
    private String id; // 编号
    private String name; // 名称

    // 无参构造方法
    public Cake() {
    }

    // 有参构造方法
    public Cake(String id, String name) {
        this.id = id;
        this.name = name;
    }

    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;
    }

    @Override
    public String toString() {
        return "Cake{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}

创建net.huawei.session.test包,然后在包里创建TestCake类请添加图片描述

package net.huawei.session.test;

import net.huawei.session.bean.Cake;

/**
 * 功能:测试蛋糕实体类
 * 作者:华卫
 * 日期:2023年05月23日
 */
public class TestCake {
    public static void main(String[] args) {
        // 1. 基于无参构造方法创建蛋糕对象
        Cake cake1 = new Cake();
        // 设置蛋糕对象属性
        cake1.setId("001");
        cake1.setName("金玫瑰蛋糕");
        // 打印蛋糕对象
        System.out.println(cake1);
        // 2. 基于有参构造方法创建蛋糕对象
        Cake cake2 = new Cake("002", "黄苹果蛋糕");
        // 打印蛋糕对象
        System.out.println(cake2);
    }
}

运行程序,查看结果请添加图片描述
如果只想看到编号与名称,那么就要修改代码请添加图片描述
如果只想看到编号与名称,那么就要修改代码请添加图片描述

扫描二维码关注公众号,回复: 15339937 查看本文章

4、创建蛋糕数据库模拟类

在net.huawei.session根包里创建dao包,然后在子包里创建CakeDao类,用于模拟访问蛋糕数据库请添加图片描述

package net.huawei.session.dao;

import net.huawei.session.bean.Cake;

import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 功能:蛋糕数据访问对象
 * 作者:华卫
 * 日期:2023年05月23日
 */
public class CakeDao {
    // 创建蛋糕集合(链式哈希映射对象)
    private static Map<String, Cake> cakes = new LinkedHashMap<>();

    // 静态代码块,初始化蛋糕集合
    static {
        cakes.put("1", new Cake("1", "A类蛋糕"));
        cakes.put("2", new Cake("2", "B类蛋糕"));
        cakes.put("3", new Cake("3", "C类蛋糕"));
        cakes.put("4", new Cake("4", "D类蛋糕"));
        cakes.put("5", new Cake("5", "E类蛋糕"));
    }

    // 查询全部蛋糕
    public static Collection<Cake> findAllCakes() {
        return cakes.values();
    }

    // 按编号查询蛋糕
    public static Cake findCakeById(String id) {
        return cakes.get(id);
    }
}

在net.huawei.session.test包里创建TestCakeDao类请添加图片描述

package net.huawei.session.test;

import net.huawei.session.bean.Cake;
import net.huawei.session.dao.CakeDao;

import java.util.Collection;

/**
 * 功能:测试蛋糕用户访问对象
 * 作者:华卫
 * 日期:2023年05月23日
 */
public class TestCakeDao {
    public static void main(String[] args) {
        // 查询全部蛋糕
        Collection<Cake> cakes = CakeDao.findAllCakes();
        // 通过增强for循环遍历蛋糕集合
        for (Cake cake : cakes) {
            System.out.println(cake.getId() + "\t" + cake.getName());
        }
        System.out.println();
        // 按编号查询蛋糕
        String id = "4";
        Cake cake = CakeDao.findCakeById(id);
        // 输出蛋糕对象属性
        System.out.println(cake.getId() + "\t" + cake.getName());
    }
}

运行程序,查看结果请添加图片描述

5、创建蛋糕列表处理程序

创建net.huawei.session.servlet包,然后在包里创建CakeListServlet类,用于显示所有可购买蛋糕的列表,通过单击“购买”链接,便可将指定的蛋糕添加到购物车中请添加图片描述

package net.huawei.session.servlet;

import net.huawei.session.bean.Cake;
import net.huawei.session.dao.CakeDao;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Collection;

/**
 * 功能:显示蛋糕列表
 * 作者:华卫
 * 日期:2023年05月23日
 */
@WebServlet(name = "CakeListServlet", urlPatterns = "/cake_list")
public class CakeListServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 设置响应体内容类型
        response.setContentType("text/html; charset=utf-8");
        // 获取字符输出流
        PrintWriter out = response.getWriter();
        // 获取蛋糕集合
        Collection<Cake> cakes = CakeDao.findAllCakes();
        out.print("<body style='text-align: center'>");
        out.print("<h3>本站提供的蛋糕</h3>");
        // 显示全部蛋糕
        for (Cake cake : cakes) {
            String url = "purchase?id=" + cake.getId();
            out.print(cake.getId() + " " + cake.getName()
                    + " <a href='" + url + "'>点击购买</a><br>");
        }
        out.print("</body>");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }
}

启动服务器,访问http://localhost:8080/SessionDemo/cake_list请添加图片描述
如果此时单击【点击购买】超链接,会报404错误请添加图片描述

6、创建购物处理程序

在net.huawei.session.servlet包里创建PurchaseServlet类请添加图片描述

package net.huawei.session.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 功能:购物处理程序
 * 作者:华卫
 * 日期:2023年05月23日
 */
@WebServlet(name = "PurchaseServlet", urlPatterns = "/purchase")
public class PurchaseServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 获得用户购买蛋糕的id
        String id = request.getParameter("id");
        // 判断用户是否选购
        if (id != null) {
            // 按照id获取蛋糕对象
            Cake cake = CakeDao.findCakeById(id);
            // 创建或获得用户的Session对象
            HttpSession session = request.getSession();
            // 从Session对象中获得用户的购物车
            List<Cake> cart = (List<Cake>) session.getAttribute("cart");
            // 判断购物车是否为空
            if (cart == null) { // 首次购买
                // 为用户创建一个购物车(List集合模拟购物车)
                cart = new ArrayList<>();
                // 将购物车存入Session对象
                session.setAttribute("cart", cart);
            }
            // 将选购的蛋糕放入购物车
            cart.add(cake);
            // 创建Cookie用来保存Session的标识号
            Cookie cookie = new Cookie("JSESSIONID", session.getId());
            // 设置cookie属性
            cookie.setMaxAge(30 * 60); // 30分钟
            cookie.setPath("/Servlet");
            // 加入cookie
            response.addCookie(cookie);
            // 重定向到购物车页面(CartServlet,其url为`cart`)
            response.sendRedirect("cart");
        } else {
            // 重定向到蛋糕列表显示页面(CakeListServlet,其url为`cake_list`)
            response.sendRedirect("cake_list");
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }
}

7、创建购物车处理程序

在net.huawei.session.servlet包里创建CartServlet类请添加图片描述

package net.huawei.session.servlet;

import net.huawei.session.bean.Cake;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

/**
 * 功能:购物车处理程序
 * 作者:华卫
 * 日期:2023年05月23日
 */
@WebServlet(name = "CartServlet", urlPatterns = "/cart")
public class CartServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 设置响应体内容类型
        response.setContentType("text/html; charset=utf-8");
        // 获取字符输出流
        PrintWriter out = response.getWriter();
        // 变量cart引用用户的购物车
        List<Cake> cart = null;
        // 变量hasPurchased标记用户是否买过商品
        boolean hasPurchased = true;
        // 获得用户的session
        HttpSession session = request.getSession(false);
        // 判断会话是否为空
        if (session == null) { // 尚未购买过商品
            hasPurchased = false;
        } else {
            // 获得用户购物车
            cart = (List) session.getAttribute("cart");
            // 判断购物车是否为空
            if (cart == null) { // 尚未购买过商品
                hasPurchased = false;
            }
        }

        out.print("<body style='text-align: center'>");
        // 判断用户是否购买过商品
        if (!hasPurchased) {
            out.print("遗憾,您尚未购买任何商品~<br>");
        } else {
            // 显示用户购买蛋糕的信息
            out.print("<h3>您购买的蛋糕</h3>");
            for (Cake cake : cart) {
                out.print(cake.getId() + " " + cake.getName() + "<br>");
            }
        }
        out.print("</body>");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }
}

8、启动服务器,查看结果

启动服务器,访问http://localhost:8080/SessionDemo/cake_list请添加图片描述
购买C类蛋糕请添加图片描述
返回蛋糕列表页面请添加图片描述
购买A类蛋糕请添加图片描述
返回蛋糕列表页面请添加图片描述
购买E类蛋糕请添加图片描述
录屏演示购物过程请添加图片描述

猜你喜欢

转载自blog.csdn.net/XLLLXX/article/details/130928674
今日推荐