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

相关文章
|
10天前
|
XML 存储 Java
11:Servlet中初始化参数的获取与应用-Java Web
11:Servlet中初始化参数的获取与应用-Java Web
23 3
|
23小时前
|
Java 应用服务中间件 测试技术
深入探索Spring Boot Web应用源码及实战应用
【5月更文挑战第11天】本文将详细解析Spring Boot Web应用的源码架构,并通过一个实际案例,展示如何构建一个基于Spring Boot的Web应用。本文旨在帮助读者更好地理解Spring Boot的内部工作机制,以及如何利用这些机制优化自己的Web应用开发。
7 2
|
2天前
|
缓存 监控 前端开发
探索现代Web应用的性能优化实践
【5月更文挑战第10天】随着互联网技术的飞速发展,用户对Web应用的响应速度和流畅度要求越来越高。性能优化已成为前端开发中不可或缺的一环。本文将深入探讨Web应用性能优化的关键策略,包括代码分割、资源压缩、缓存利用、服务端渲染等技术手段,以及如何通过工具进行性能监测和分析。我们将从原理出发,结合实际案例,帮助开发者构建更快速、更高效的Web应用。
|
4天前
|
前端开发 搜索推荐 安全
AJAX和CSR(客户端渲染)是Web开发中常用的两种技术
【5月更文挑战第8天】AJAX提升用户体验,减轻服务器压力,但对搜索引擎不友好且增加开发复杂度,易引发安全问题。CSR提供快速响应和交互性,改善用户体验,但首屏加载慢,搜索引擎支持不足,同样面临安全挑战。两者各有适用场景,需按项目需求选择。
10 0
|
10天前
|
设计模式 存储 前端开发
18:JavaBean简介及其在表单处理与DAO设计模式中的应用-Java Web
18:JavaBean简介及其在表单处理与DAO设计模式中的应用-Java Web
25 4
|
10天前
|
存储 前端开发 安全
13:会话跟踪技术Session的深度应用与实践-Java Web
13:会话跟踪技术Session的深度应用与实践-Java Web
24 3
|
10天前
|
存储 前端开发 搜索推荐
12:会话跟踪技术Cookie的深度应用与实践-Java Web
12:会话跟踪技术Cookie的深度应用与实践-Java Web
23 4
|
10天前
|
关系型数据库 MySQL
web简易开发(二){html5+php实现文件上传及通过关键字搜索已上传图片)}
web简易开发(二){html5+php实现文件上传及通过关键字搜索已上传图片)}
|
1天前
|
编解码 数据库 计算机视觉
LabVIEW开发基于Web数字图像处理
LabVIEW开发基于Web数字图像处理
|
3天前
|
前端开发 JavaScript Java
Java与Web开发的结合:JSP与Servlet
Java与Web开发的结合:JSP与Servlet
8 0