[Web程序设计]实验:会话技术应用

news2024/10/6 8:30:31

一、实验目的

(1)掌握Cookie和session两种会话跟踪技术和它们的应用和区别。

(2)掌握Cookie和session两种会话的应用和区别。

二、实验内容

(1)请设计一个类,使用Cookie技术实现显示用户上次访问时间的功能。

要求如下:

创建一个LastAccessServlet类,使其继承HttpServlet类并重写该类的doGet()方法。

在doGet()方法中,使用request.getCookies()得到所有cookie形成的cookie数组,并进行遍历。如果遍历过程中找到cookie信息中存在lastAccess属性则输出,否则创建cookie对象设置值为当前时间并发送给客户端。cookie的存活时间为1小时,访问当前应用中的所有资源客户端都回送cookie信息。

(2)请设计一个程序,使用Session技术实现购物车功能。

三、实验要求

(1)Cookie对象,掌握Cookie对象的使用

(2)了解什么是Session对象,掌握Session对象的使用

(3)学会使用Session对象实现购物车和用户登录功能

(4)对试验过程认真记录,分析错误原因

(5)总结操作步骤

四、实验步骤与结果(包含程序代码及运行截图)

(1)请设计一个类,使用Cookie技术实现显示用户上次访问时间的功能。

要求如下:

· 创建一个LastAccessServlet类,使其继承HttpServlet类并重写该类的doGet()方法。

 · 在doGet()方法中,使用request.getCookies()得到所有cookie形成的cookie数组,并进行遍历。

方法及代码截图:

package com.servlert;

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

public class LastAccessServlet extends HttpServlet {

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //编码
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");

        Cookie[] cookies=req.getCookies();
        for(int i=0;i<cookies.length;i++){
            System.out.println("Cookie"+cookies[i]);
        }
    }

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

代码及控制台输出截图:

 · 如果遍历过程中找到cookie信息中存在lastAccess属性则输出,否则创建cookie对象设置值为当前时间并发送给客户端。cookie的存活时间为1小时,访问当前应用中的所有资源客户端都回送cookie信息。

类的实现代码:

package com.servlert;

import javax.servlet.ServletException;
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.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;

public class LastAccessServlet extends HttpServlet {

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //编码
        req.setCharacterEncoding("UTF-8");
        // 设置服务器输出内容的编码格式为UTF-8防止乱码
        resp.setContentType("text/html;charset=utf-8");
        String lastAccessTime = null;
        //获取所有的Cookie信息,循环遍历
        Cookie[] cookies=req.getCookies();
        for(int i=0;i<cookies.length;i++){
            if ("lastAccess".equals(cookies[i].getName())) {
                // 如果cookie名称为lastAccess,则获取该cookie的值
                lastAccessTime = cookies[i].getValue();
                System.out.println("lastAccess属性:"+lastAccessTime);
                break;
            }
        }
        // 盘算是否存在名称为lastAccesscookie
        if (lastAccessTime == null) {
            resp.getWriter().print("你首次访问本网站!");
        } else {
            resp.getWriter().print("你上次访问本网站的时间是: "
                    + URLDecoder.decode(lastAccessTime, "UTF-8"));
        }
        // 创建cookie,将当前时间作为cookie的值发送给客户端
        String currentTime = new SimpleDateFormat("yyyy- MM-dd hh:mm:ss")
                .format(new Date());
        Cookie cookie = new Cookie("lastAccess",
                URLEncoder.encode(currentTime, "UTF-8"));
        cookie.setMaxAge(60*60); //设置cookie最大存在时间

        //发送cookie
        resp.addCookie(cookie);
    }

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

代码截图:

 运行截图:

 

 

(2)请设计一个程序,使用Session技术实现购物车功能。

设计思路及步骤:

1.点击添加到购物车的时候,提交到一个servletadd2CartServlet
        需要将商品名称携带过去
     2.add2CartServlet中的操作
        获取商品的名称
        将商品添加到购物车 购物车的结构 Map<String 名称,Integer 购买数量>
            将购物车放入session中就可以了
        
        将商品添加到购物车分析:
            获取购物车
            判断购物车是否为空
                若为空:
                    第一次添加
                    创建一个购物车
                    将当前商品put进去.数量:1
                    将购物车放入session中
                若不为空:继续判断购物车中是否有该商品
                    若有:
                        取出count 将数量+1
                        将商品再次放入购物车中
                    若没有:
                        将当前商品put进去 数量:1
                    
        提示信息:你的xx已添加到购物车中
    3.点击购物车连接的时候 cart.jsp
        从session获取购物车
            判断购物车是否为空
                若为空:提示信息

                若不为空:遍历购物车即可

Servlet实现类代码及代码截图:

package com.servlert;

import javax.servlet.ServletException;
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.HashMap;
import java.util.Map;

/**
 * 添加到购物车
 */
public class Add2CartServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置编码
        response.setContentType("text/html; charset=utf-8");
        PrintWriter w =response.getWriter();

        //获取商品的名称
        String  name=request.getParameter("name");

        name =new String(name.getBytes("iso8859-1"),"utf-8");

        //将商品添加到购物车

        //session种获取购物车
        Map<String,Integer> map=(Map<String, Integer>) request.getSession().getAttribute("cart");

        Integer count=null;

        //判断购物车是否为空
        if(map==null) {
            //第一次登录 创建购物车
            map=new HashMap<>();

            //将购物车放入session
            request.getSession().setAttribute("cart", map);
            count=1;
        }else {
            //购物车不为空  继续判断购物车是否有该商品
            count=map.get(name);

            if(count==null) {
                //购物车中没有该商品
                count=1;
            }else {
                //购物车中有该商品
                count++;
            }

        }
        //将商品放入购物车
        map.put(name, count);

        //提示信息
        w.print("已将<b>"+name+"添加到购物车中<hr>");
        w.println("<a href='"+request.getContextPath()+"/product_list.jsp'>继续购物</a>    ");
        w.println("<a href='"+request.getContextPath()+"/cart.jsp'>查看购物车</a>    ");
    }


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

        doGet(request, response);
    }

}

 jsp页面代码及代码截图:

product_list.jsp页面代码及截图:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>index页面</title>
  </head>
  <body>
  <div style="margin:20px 0 10px 0;;text-align: center;">
    <a href="Add2CartServlet?name=衣服">
      <input style="background: url('/1669465431435.webp') no-repeat scroll 0 -600px rgba(0, 0, 0, 0);height:36px;width:127px;" value="加入购物车" type="button">
    </a>收藏商品</div>

  </div>
  </body>
</html>

 Cart.jsp页面代码及截图:

<%@ page import="java.util.Map" %><%--
  Created by IntelliJ IDEA.
  User: 86184
  Date: 2022/11/26
  Time: 20:10
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
</head>
<body>
<table  border="1" align="center" width="20%">
    <tr>
        <td>商品名称</td>
        <td>商品数量</td>
    </tr>
    <%
        //获取购物车
        Map<String,Integer> map =(Map <String,Integer>)session.getAttribute("cart");
        //判断购物车是否为空
        if(map==null){
            //若为空,亲,购物车空空,先去逛逛~~~
            out.print("<tr><td colspan='2'>亲,购物车空空,先去逛逛~~~</td></tr>");
        }else{
            //若不为空,遍历购物车
            for(String name :map.keySet()){
                out.print("<tr>");
                out.print("<td>");
                out.print(name);
                out.print("</td>");

                out.print("<td>");
                out.print(map.get(name));
                out.print("</td>");
                out.print("</tr>");

            }
        }

    %>
</table>

<hr>
<center>
    <a href="product_list.jsp" >继续购物</a>

</center>

 运行效果图:

列表页面截图:

 点击购物车后:

 点击继续购物后:

 点击查看购物车后:

 五、实验反思

(1)点击“加入购物车”,进入添加成功页面,出现空指针异常,没有获取到产品信息,request.getParameter("name")为空,最后发现是页面上的name和getParameter里面的名称不一致。

(2)购物车列表展示的时候没有任何信息,发现是没有将产品信息放入至Map中。

(3)访问当前应用中的所有资源客户端都回送cookie信息,在页面上没有看到输出的时间等信息,排查发现是因为out引入的包有问题,并且返回的位置也写的存在问题。

(4)在对比cookie里面是否存在lastAccess属性,在比对过程中发现的自己获取到的值是空值,打断点一行一行查看,发现该值定义的位置有问题,定义成了局部变量,放在了循环方法里面。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/683866.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【消费战略方法论】消费本位的战略模型

消费本位战略模型 消费者需求是价值交换的基础。 在经济学中&#xff0c;“买”与“卖”是经济链中的重要两端&#xff0c;一端连接消费需求决定市场规模&#xff0c;一端连接产品供给决定企业利润。即“买”决定“卖”的根本&#xff0c; “卖”是“买”的基础。消费者需求是…

第1讲 Camera KMD ISP子系统课程介绍

更多资源&#xff1a; 资源描述在线课程极客笔记在线课程知识星球星球名称&#xff1a;深入浅出Android Camera 星球ID: 17296815Wechat极客笔记圈 课程内容介绍 目标&#xff1a;课程会帮助大家理解高通camera kmd驱动&#xff0c;包括一些优秀的设计思想。重点讲解cpas, c…

有关回溯问题,总结的细致要点

目录 对于这三类问题的去重我总结的模板&#xff0c;直接用&#xff1a; 组合&#xff1a; 子集&#xff1a; 排列&#xff1a; 总结&#xff1a; 三类回溯问题框架都是 if ...终止for 遍历递归 三类问题都抽象成树 dfs 对于组合和子集问题&#xff0c;需要用到index对…

软件测试的概念与过程----学习软件测试前的思考

软件测试的概念与过程----学习软件测试前的思考 1、软件测试工作是做什么的&#xff1f;2、那我做软件测试拿到一个软件产品我应该从哪里测试&#xff0c;怎末开始工作&#xff1f;3、测试早做好还是晚一些做好&#xff1f;4、软件测试能将软件测试的一点问题都没有嘛&#xff…

蓝牙无线耳机哪个品牌好?盘点前七名无线蓝牙耳机分享

本文将为您详细介绍每款蓝牙耳机的设计特点、音质表现、续航能力和智能功能等关键信息。我们将提供客观、全面的分析&#xff0c;帮助您更好地了解每款产品的优势和适用场景&#xff1b;无论您是追求高保真音质的音乐发烧友&#xff0c;还是需要轻便舒适的耳机进行运动&#xf…

好选客干货分享:矿物燃料找外贸客户

矿物燃料概述 矿物燃料&#xff0c;也称化石燃料&#xff0c;是由数百万年来的动植物遗骸形成的自然资源&#xff0c;也是人类社会中重要的能源来源之一&#xff0c;主要包括煤炭、石油和天然气。 Image by PublicDomainPictures via Pixabay 在商品类章27章中&#xff0c;矿物…

HashMap的底层实现原理

红黑数演示地址&#xff1a;https://www.cs.usfca.edu/~galles/visualization/Algorithms.html 一、构造源码解读 public class HashMap<K,V> extends AbstractMap<K,V>implements Map<K,V>, Cloneable, Serializable {//1、实现了两个Map接口 &#xff0c;…

【金融量化】购买了多只基金,如何进行资产分配?如何基金组合配置?

【金融量化】购买了多只基金&#xff0c;如何进行资产分配&#xff1f;如何基金组合配置&#xff1f; 1 概念 FOF&#xff08;Fund of fund&#xff09;&#xff0c;即基金中基金&#xff0c;是一种投资于其他投资基金的基金。说白了&#xff0c;就是基金经理是买入多只基金取…

Day_56-57kMeans 聚类

目录 Day_56-57 k-Means 聚类 一. 基本概念介绍 二. 具体过程 三. 代码实现与解释 1. 导入数据与数据初始化 2. 核心代码 3. 后续信息的补充 4. 距离计算和随机排列 四. 后续的数据分析 五. 运行结果 Day_56-57 k-Means 聚类 一. 基本概念介绍 同我上一篇博客的介绍&…

微博视频发布软件有哪些

微博视频发布软件有哪些&#xff0c;新的新浪微博怎么发微博#科技#手机操作#微信 软件有月卡、季卡、半年卡、年卡 【引流脚本软件发帖顶帖有货】 服务时间&#xff1a;&#xff08;8&#xff1a;00—23&#xff1a;00&#xff09; 需要观看软件操作视频教程的可关注↑↑↑上…

大数据开发技术与实践期末复习(HITWH)

目录 分布式文件处理系统HDFS 分布式文件系统 HDFS简介 块&#xff08;block&#xff09; 主要组件的功能 **名称节点 FsImage文件 名称节点的启动 名称节点运行期间EditLog不断变大的问题 SecondaryNameNode的工作情况 数据节点 HDFS体系结构 HDFS体系结构的局限…

游戏行业黑马昆仑万维,国产AI巨头崛起

游戏行业黑马昆仑万维&#xff0c;国产AI巨头崛起&#xff0c;其大模型技术堪比ChatGPT 随着人工智能技术的快速发展&#xff0c;越来越多的公司参与大规模语言模型的开发和应用。近日&#xff0c;昆仑万维正式发布大型语言模型“天宫”&#xff0c;宣布即日起开始邀请测试&am…

操作系统——基于信号量机制的并发程序设计

一、实验题目 基于信号量机制的并发程序设计 二、实验目的 (1) 回顾操作系统进程、线程的有关概念&#xff0c;针对经典的同步、互斥、死锁与饥饿问题进行并发 程序设计。 (2) 了解互斥体对象&#xff0c;利用互斥与同步操作编写读者-写者问题的并发程序&#xff0c;加深…

测试老鸟,带你手写Python自动化测试 ddt 数据驱动框架(超细细)

前言 python做自动化测试&#xff0c;大多数都应该使用过ddt这个模块&#xff0c;它可以自动根据用例数据&#xff0c;来生成测试用例&#xff0c;能够很方便的将测试数据和测试用例执行的逻辑进行分离。接下来和大家&#xff0c;手把手撸出一个ddt。 DDT的实现原理 首先我们…

MUR80120PT-ASEMI快恢复二极管MUR80120PT

编辑-Z MUR80120PT在TO-247封装里采用的2个芯片&#xff0c;其尺寸都是140MIL&#xff0c;是一款高耐压大电流快恢复二极管。MUR80120PT的浪涌电流Ifsm为600A&#xff0c;漏电流(Ir)为10uA&#xff0c;其工作时耐温度范围为-55~150摄氏度。MUR80120PT采用抗冲击硅芯片材质&…

DJ5-4 MAC、ARP

目录 一、链路层寻址地址 1、MAC 地址分配 2、MAC 地址识别 二、ARP 地址解析协议 1、ARP 地址解析协议 2、ARP&#xff1a;两个主机位于同一个局域网 3、ARP&#xff1a;发送数据报到子网以外 4、ARP 自举 5、ARP 攻击 一、链路层寻址地址 每个节点有网络层地址和链…

模拟电路系列分享-静态工作点

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 提示&#xff1a;这里可以添加技术概要 例如&#xff1a; 本文主要介绍静态工作点及耦合 整体架构流程 提示&#xff1a;这里可以添加技术整体架构 要想让晶体管对输入电压信号进行有效的放大&#xff0c;必须解…

win10安装配置PostgreSQL

win10安装配置PostgreSQL 1 下载安装PostgreSQL ①进入官网https://www.postgresql.org/&#xff0c;点击页面中心处的download 也可以直接跳过下面的步骤(下面的步骤主要是为了帮助大家了解一般外国软件是如何从官网进入下载页面)&#xff0c;直接进入下载页面&#xff0c;链…

网络安全是个好的专业吗?高考志愿可以选择该专业吗?

首先说说关于学校和就业的问题&#xff0c;提到国内网络安全专业比较好的学校&#xff0c;“四邮四电”&#xff08;北邮、南邮、西邮、重邮、电子科大、西安电子科大、桂林电子科大、杭州电子科大&#xff09;必须拥有姓名。 而从现在的就业形势看&#xff0c;网络安全专业其…

SuperMap GIS基础产品三维GIS FAQ集锦(3)

SuperMap GIS基础产品三维GIS FAQ集锦&#xff08;3&#xff09; 【WebGL】如何批量管理entity图标&#xff0c;同时控制多个图标的显示和隐藏&#xff1f; 【解决办法】使用实体集合CustomDataSource进行管理&#xff0c;将实体按类别分类&#xff0c;分别添加到不同的实体集…