文章目录
Cookie案例演示 - 显示用户上次访问时间
1、创建Web项目
Web项目 - CookieDemo
设置项目名称与保存位置
单击【Finish】按钮
2、修改Artifact名称,重新部署项目
在项目结构窗口里修改Artifact名称
编辑服务器配置,重新部署项目,URL变成http://localhost:8080/CookieDemo/
修改首页
启动服务器,查看效果
3、创建LastAccessServlet类
创建net.huawei.servlet包,然后在里面创建LastAccessServlet类
package net.huawei.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 功能:显示用户上次访问时间
* 作者:华卫
* 日期:2023年04月21日
*/
@WebServlet(name = "LastAccessServlet", value = "/LastAccessServlet")
public class LastAccessServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置响应对象内容类型(网页、编码),避免中文乱码
response.setContentType("text/html; charset=utf-8");
// 获取打印输出流
PrintWriter out = response.getWriter();
// 获取所有cookie
Cookie[] cookies = request.getCookies();
// 定义标志变量isFirstAccess
boolean isFirstAccess = true;
// 判断cookies是否为空
if (cookies.length > 0 && cookies != null) {
// 遍历cookies数组
for (Cookie cookie : cookies) {
// 获取cookie的名称
String name = cookie.getName();
// 判断cookie名称是否为`lastTime`
if (name.equals("lastTime")) {
// 用户不是第一次访问
isFirstAccess = false;
// 获取cookie的值(上次访问时间)
String value = cookie.getValue();
// 控制台输出解码前的数据
System.out.println("解码前:" + value);
// 对cookie值进行URL解码
value = URLDecoder.decode(value, "utf-8");
// 控制台输出解码后的数据
System.out.println("解码后:" + value);
// 在页面显示用户上次访问时间
out.print("欢迎回来,您上次访问时间:" + value);
// 获取当前时间字符串
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String strDate = sdf.format(date);
// 控制台输出编码前的日期数据
System.out.println("编码前:" + strDate);
// 对日期数据进行URL编码
strDate = URLEncoder.encode(strDate, "utf-8");
// 控制台输出编码后的日期数据
System.out.println("编码后:" + strDate);
// 设置cookie的值
cookie.setValue(strDate);
// 设置cookie的存活时间(以秒为单位)
cookie.setMaxAge(30 * 24 * 60 * 60); // 一个月
// 加入cookie,让其生效
response.addCookie(cookie);
}
}
}
// 第一次访问
if (isFirstAccess) {
// 获取当前时间字符串
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String strDate = sdf.format(date);
// 控制台输出编码前的日期数据
System.out.println("编码前:" + strDate);
// 对日期数据进行URL编码
strDate = URLEncoder.encode(strDate, "utf-8");
// 控制台输出编码后的日期数据
System.out.println("编码后:" + strDate);
// 创建一个cookie
Cookie cookie = new Cookie("lastTime", strDate);
// 设置cookie的值
cookie.setValue(strDate);
// 设置cookie的存活时间(以秒为单位)
cookie.setMaxAge(30 * 24 * 60 * 60); // 一个月
// 加入cookie,让其生效
response.addCookie(cookie);
// 在页面显示欢迎用户首次访问信息
out.print("您好,欢迎您首次访问本网站~");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
4、启动服务器,查看结果
启动服务器,访问http://localhost:8080/CookieDemo/LastAccessServlet
查看控制台输出信息
刷新访问地址http://localhost:8080/CookieDemo/LastAccessServlet,浏览器显示了用户的上次访问时间,这是因为用户第一次访问LastAccessServlet时,LastAccessServlet向浏览器发送并保存用户访问时间的Cookie信息。第二次访问LastAccessServlet时,服务器读取该Cookie信息,并在浏览器显示
查看控制台输出信息
关闭浏览器后,再次打开浏览器,访问LastAccessServlet,浏览器依旧显示了时间,是因为我们在LastAccessServlet类的代码中设置了Cookie的有效时间为1个月。
课后练习:登录表单自动填充上次登录成功的用户名
Session案例演示 - 实现购物车
1、创建Web项目
创建Java Enterprise项目,添加Web Application
设置项目名称与保存位置
单击【Finish】按钮
2、修改Artifact名称,重新部署项目
在项目结构窗口里修改Artifact名称
在服务期配置窗口里,重新部署项目
切换到【Server】选项卡,设置默认浏览器
修改首页
启动服务器,查看结果
3、创建蛋糕实体类
创建net.huawei.session.bean包,然后在包里创建Cake类
package net.huawei.session.bean;
/**
* 功能:蛋糕实体类
* 作者:华卫
* 日期:2023年05月23日
*/
public class Cake {
private String id; // 编号
private String name; // 名称
// 无参构造方法
public Cake() {
}
// 有参构造方法
public Cake(String id, String name) {
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Cake{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
'}';
}
}
创建net.huawei.session.test包,然后在包里创建TestCake类
package net.huawei.session.test;
import net.huawei.session.bean.Cake;
/**
* 功能:测试蛋糕实体类
* 作者:华卫
* 日期:2023年05月23日
*/
public class TestCake {
public static void main(String[] args) {
// 1. 基于无参构造方法创建蛋糕对象
Cake cake1 = new Cake();
// 设置蛋糕对象属性
cake1.setId("001");
cake1.setName("金玫瑰蛋糕");
// 打印蛋糕对象
System.out.println(cake1);
// 2. 基于有参构造方法创建蛋糕对象
Cake cake2 = new Cake("002", "黄苹果蛋糕");
// 打印蛋糕对象
System.out.println(cake2);
}
}
运行程序,查看结果
如果只想看到编号与名称,那么就要修改代码
如果只想看到编号与名称,那么就要修改代码
4、创建蛋糕数据库模拟类
在net.huawei.session根包里创建dao包,然后在子包里创建CakeDao类,用于模拟访问蛋糕数据库
package net.huawei.session.dao;
import net.huawei.session.bean.Cake;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* 功能:蛋糕数据访问对象
* 作者:华卫
* 日期:2023年05月23日
*/
public class CakeDao {
// 创建蛋糕集合(链式哈希映射对象)
private static Map<String, Cake> cakes = new LinkedHashMap<>();
// 静态代码块,初始化蛋糕集合
static {
cakes.put("1", new Cake("1", "A类蛋糕"));
cakes.put("2", new Cake("2", "B类蛋糕"));
cakes.put("3", new Cake("3", "C类蛋糕"));
cakes.put("4", new Cake("4", "D类蛋糕"));
cakes.put("5", new Cake("5", "E类蛋糕"));
}
// 查询全部蛋糕
public static Collection<Cake> findAllCakes() {
return cakes.values();
}
// 按编号查询蛋糕
public static Cake findCakeById(String id) {
return cakes.get(id);
}
}
在net.huawei.session.test包里创建TestCakeDao类
package net.huawei.session.test;
import net.huawei.session.bean.Cake;
import net.huawei.session.dao.CakeDao;
import java.util.Collection;
/**
* 功能:测试蛋糕用户访问对象
* 作者:华卫
* 日期:2023年05月23日
*/
public class TestCakeDao {
public static void main(String[] args) {
// 查询全部蛋糕
Collection<Cake> cakes = CakeDao.findAllCakes();
// 通过增强for循环遍历蛋糕集合
for (Cake cake : cakes) {
System.out.println(cake.getId() + "\t" + cake.getName());
}
System.out.println();
// 按编号查询蛋糕
String id = "4";
Cake cake = CakeDao.findCakeById(id);
// 输出蛋糕对象属性
System.out.println(cake.getId() + "\t" + cake.getName());
}
}
运行程序,查看结果
5、创建蛋糕列表处理程序
创建net.huawei.session.servlet包,然后在包里创建CakeListServlet类,用于显示所有可购买蛋糕的列表,通过单击“购买”链接,便可将指定的蛋糕添加到购物车中
package net.huawei.session.servlet;
import net.huawei.session.bean.Cake;
import net.huawei.session.dao.CakeDao;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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.Collection;
/**
* 功能:显示蛋糕列表
* 作者:华卫
* 日期:2023年05月23日
*/
@WebServlet(name = "CakeListServlet", urlPatterns = "/cake_list")
public class CakeListServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置响应体内容类型
response.setContentType("text/html; charset=utf-8");
// 获取字符输出流
PrintWriter out = response.getWriter();
// 获取蛋糕集合
Collection<Cake> cakes = CakeDao.findAllCakes();
out.print("<body style='text-align: center'>");
out.print("<h3>本站提供的蛋糕</h3>");
// 显示全部蛋糕
for (Cake cake : cakes) {
String url = "purchase?id=" + cake.getId();
out.print(cake.getId() + " " + cake.getName()
+ " <a href='" + url + "'>点击购买</a><br>");
}
out.print("</body>");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
启动服务器,访问http://localhost:8080/SessionDemo/cake_list
如果此时单击【点击购买】超链接,会报404错误
6、创建购物处理程序
在net.huawei.session.servlet包里创建PurchaseServlet类
package net.huawei.session.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 功能:购物处理程序
* 作者:华卫
* 日期:2023年05月23日
*/
@WebServlet(name = "PurchaseServlet", urlPatterns = "/purchase")
public class PurchaseServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获得用户购买蛋糕的id
String id = request.getParameter("id");
// 判断用户是否选购
if (id != null) {
// 按照id获取蛋糕对象
Cake cake = CakeDao.findCakeById(id);
// 创建或获得用户的Session对象
HttpSession session = request.getSession();
// 从Session对象中获得用户的购物车
List<Cake> cart = (List<Cake>) session.getAttribute("cart");
// 判断购物车是否为空
if (cart == null) { // 首次购买
// 为用户创建一个购物车(List集合模拟购物车)
cart = new ArrayList<>();
// 将购物车存入Session对象
session.setAttribute("cart", cart);
}
// 将选购的蛋糕放入购物车
cart.add(cake);
// 创建Cookie用来保存Session的标识号
Cookie cookie = new Cookie("JSESSIONID", session.getId());
// 设置cookie属性
cookie.setMaxAge(30 * 60); // 30分钟
cookie.setPath("/Servlet");
// 加入cookie
response.addCookie(cookie);
// 重定向到购物车页面(CartServlet,其url为`cart`)
response.sendRedirect("cart");
} else {
// 重定向到蛋糕列表显示页面(CakeListServlet,其url为`cake_list`)
response.sendRedirect("cake_list");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
7、创建购物车处理程序
在net.huawei.session.servlet包里创建CartServlet类
package net.huawei.session.servlet;
import net.huawei.session.bean.Cake;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
/**
* 功能:购物车处理程序
* 作者:华卫
* 日期:2023年05月23日
*/
@WebServlet(name = "CartServlet", urlPatterns = "/cart")
public class CartServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置响应体内容类型
response.setContentType("text/html; charset=utf-8");
// 获取字符输出流
PrintWriter out = response.getWriter();
// 变量cart引用用户的购物车
List<Cake> cart = null;
// 变量hasPurchased标记用户是否买过商品
boolean hasPurchased = true;
// 获得用户的session
HttpSession session = request.getSession(false);
// 判断会话是否为空
if (session == null) { // 尚未购买过商品
hasPurchased = false;
} else {
// 获得用户购物车
cart = (List) session.getAttribute("cart");
// 判断购物车是否为空
if (cart == null) { // 尚未购买过商品
hasPurchased = false;
}
}
out.print("<body style='text-align: center'>");
// 判断用户是否购买过商品
if (!hasPurchased) {
out.print("遗憾,您尚未购买任何商品~<br>");
} else {
// 显示用户购买蛋糕的信息
out.print("<h3>您购买的蛋糕</h3>");
for (Cake cake : cart) {
out.print(cake.getId() + " " + cake.getName() + "<br>");
}
}
out.print("</body>");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
8、启动服务器,查看结果
启动服务器,访问http://localhost:8080/SessionDemo/cake_list
购买C类蛋糕
返回蛋糕列表页面
购买A类蛋糕
返回蛋糕列表页面
购买E类蛋糕
录屏演示购物过程