一、实验目的
(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;
}
}
// 盘算是否存在名称为lastAccess的cookie
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.点击添加到购物车的时候,提交到一个servlet,add2CartServlet
需要将商品名称携带过去
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属性,在比对过程中发现的自己获取到的值是空值,打断点一行一行查看,发现该值定义的位置有问题,定义成了局部变量,放在了循环方法里面。