Cookie ケースのデモ - ユーザーの最終訪問時刻を表示する
1. Webプロジェクトを作成する
Webプロジェクト - CookieDemoは
プロジェクト名と保存場所を設定し
、[完了]ボタンをクリックします
2. アーティファクト名を変更し、プロジェクトを再デプロイします
プロジェクト構造ウィンドウでアーティファクト名を変更します。
サーバー構成を編集し、プロジェクトを再デプロイすると、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 に 2 回目にアクセスすると、サーバーは Cookie 情報を読み取り、ブラウザに表示します。
コンソール出力情報を確認します。
ブラウザを閉じた後、再度ブラウザを開き、LastAccessServlet にアクセスします。現在、ブラウザには時間が表示されています。 LastAccessServlet クラス。Cookie は 1 か月間有効になるようにコード内で設定されます。
授業後の演習: ログイン フォームには、最後に成功したログインのユーザー名が自動的に入力されます。
セッション事例デモ - ショッピングカートの実装
1. Webプロジェクトを作成する
Java Enterpriseプロジェクトを作成し、Webアプリケーションを追加し、
プロジェクト名と保存場所を設定し、
[完了]ボタンをクリックします。
2. アーティファクト名を変更し、プロジェクトを再デプロイします
プロジェクト構造ウィンドウでアーティファクト名を変更
サービス期間設定ウィンドウでプロジェクトを再
デプロイ [サーバー]タブに切り替えてデフォルトブラウザを設定
ホームページを変更
サーバーを起動して結果を表示
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 クラスを作成して、cake データベースへのアクセスをシミュレートします。
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 にアクセスします。
この時点で [Click to Buy] ハイパーリンクをクリックすると、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 のケーキを購入します。
買い物プロセスを記録します。 。