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

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

一、实验目的

(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属性,在比对过程中发现的自己获取到的值是空值,打断点一行一行查看,发现该值定义的位置有问题,定义成了局部变量,放在了循环方法里面。

相关文章
|
3天前
|
前端开发 开发者
探索前端技术的新趋势:Web组件化开发
【2月更文挑战第11天】 在这篇文章中,我们将深入探讨Web组件化开发的概念及其对前端开发领域的影响。不同于传统的摘要方式,我们通过一个故事来引入主题:想象在一个快速变化的数字世界里,有一座由各种小型、独立、可复用的建筑块构成的城市,每个建筑块都拥有独特的功能和风格,它们可以自由组合,创造出无限可能的城市景观。这座城市,就像是使用了Web组件化开发技术的前端项目。接下来,我们将详细探讨Web组件化开发的优势、实现方式以及面临的挑战,为前端开发者提供一个全面的视角来理解和应用这一重要的技术趋势。
15 5
|
3天前
Web应用基本架构
Web应用基本架构。
25 6
|
8天前
计算机网络:思科实验【1-访问WEB服务器】
计算机网络:思科实验【1-访问WEB服务器】
计算机网络:思科实验【1-访问WEB服务器】
|
11天前
|
IDE Java API
使用Java Web技术构建RESTful API的实践指南
使用Java Web技术构建RESTful API的实践指南
|
1天前
|
开发者 Docker Python
深入浅出:使用Docker容器化部署Python Web应用
在当今快速发展的软件开发领域,Docker作为一个开放平台,为开发者提供了将应用打包在轻量级、可移植的容器中的能力,从而简化了部署和管理应用程序的复杂性。本文将通过一个简单的Python Web应用示例,引导读者理解Docker的基本概念、容器化的优势以及如何使用Docker来容器化部署Python Web应用。我们将从零开始,逐步探索创建Dockerfile、构建镜像、运行容器等关键步骤,旨在为读者提供一个清晰、易于理解的指南,帮助他们掌握使用Docker容器化部署应用的技能。
|
2天前
|
前端开发 安全 区块链
前沿技术探索:Web3.0与前端开发的融合之路
【2月更文挑战第12天】 在数字技术快速发展的今天,Web3.0作为互联网的新阶段,不仅预示着去中心化、更加智能化的网络环境,还为前端开发带来了前所未有的挑战与机遇。本文将深入探讨Web3.0对前端开发的影响,分析其在实际应用中如何与前端技术融合,以及前端开发者如何适应这一变革,把握新时代的技术趋势。通过案例分析与技术展望,我们将一窥Web3.0与前端开发融合的未来图景,为前端开发者提供新的思考和行动指南。
62 25
|
2天前
|
前端开发 安全 搜索推荐
未来前端开发的新趋势:Web3.0与区块链技术的融合
【2月更文挑战第12天】 本文探讨了Web3.0和区块链技术对未来前端开发领域的影响。不同于传统摘要的简单概括,我们将通过一个创新的视角,深入解析这两项技术如何共同塑造前端开发的新生态,引领未来互联网的方向。文章首先介绍了Web3.0和区块链技术的基本概念,随后详细分析了它们在提高数据安全性、增强用户体验和推动去中心化应用(DApp)开发上的具体应用。最后,我们将展望这一趋势对前端开发者技能要求的变化,以及如何准备迎接这一变革。
|
9天前
|
前端开发 JavaScript UED
Web前端开发中的关键技术趋势
【2月更文挑战第5天】 随着互联网技术的不断发展,Web前端开发也在不断演进。本文将探讨当前Web前端开发中的关键技术趋势,包括响应式设计、前端框架、PWA等方面的发展现状和未来趋势,并分析它们对Web应用开发的影响。
|
11天前
|
Java 测试技术 数据库连接
基于Java Web技术的跨平台应用开发策略探讨
基于Java Web技术的跨平台应用开发策略探讨
|
11天前
|
Java Maven 开发者
深入剖析Spring Boot在Java Web开发中的优势与应用
深入剖析Spring Boot在Java Web开发中的优势与应用

相关产品

  • 云迁移中心