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

news/2024/7/5 3:10:11

一、实验目的

(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://lihuaxi.xjx100.cn/news/1274998.html

相关文章

Linux最全常用命令

1、Linux背景&#xff1a; Linux是一种开源的类Unix操作系统&#xff0c;最初由Linus Torvalds在1991年开发&#xff0c;并且得到了全球开发者的广泛参与。它以其稳定性、安全性和灵活性而闻名&#xff0c;并被广泛用于服务器环境和嵌入式设备。 文件和目录操作&#xff1a; l…

云数据库是未来趋势,亚马逊云科技位居Gartner报告“领导者”

最近,数据库领域发生了一个大事件,可以称得上是一座里程碑。全球最具权威的IT研究公司Gartner最近发布了一个消息:在2022年的全球DBMS市场份额中,亚马逊云科技的数据库超越微软,登顶第一。 亚马逊云科技、微软、Oracle这三巨头近几年一直排名前三,占据了全球DBMS超过三分之二的…

Java集合之LinkedList详解

Java集合之LinkedList 一、LinkedList类的继承关系1. 基类功能说明1.1. Iterator&#xff1a;提供了一种方便、安全、高效的遍历方式。1.2. Collection&#xff1a;为了使ArrayList具有集合的基本特性和操作。1.3. Queue: LinkedList是一种队列&#xff08;Queue&#xff09;数…

make和new的区别

1 概述 在Go语言中&#xff0c;new和make是两个用于创建对象的内建函数&#xff0c;主要用于go语言数据结构的初始化。 2 new 函数 2.1 功能 new 函数用于创建一个指定类型的指针&#xff0c;并将其初始化为零值。它返回指向新分配的内存地址的指针。 2.2 语法 new 函数的…

一文带你学习主流的“加密算法”

博主介绍&#xff1a; ✌博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家✌ Java知识图谱点击链接&#xff1a;体系化学习Java&#xff08;Java面试专题&#xff09; &#x1f495;&#x1f495; 感兴趣的同学可以收…

HTTP中的API是什么?

&#x1f482; 个人网站:【海拥】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 目录 前言什么是API&#xf…

java学习记录之MySql二

1 mysql回顾 1.1 DDL 数据定义语言&#xff1a;结构  数据库database create database 数据库名称 character set 字符集 [collate 比较]; drop database 数据库名称; alter database 数据库名称 character set 字符集 …;  表 create table 表名(字段描述 , … ); 字段描述…

Yolov5/Yolov7改进---注意力机制:ShuffleAttention、ECA、EffectiveSE、SE

目录 1. ShuffleAttention 1.1 加入 common.py中 1.2 加入yolo.py中: 1.3 yolov5s_ShuffleAttention.yaml 2.ECA