书城项目历程记录2|最后阶段记录

2024年1月31日

p270-276

1.免用户名登录和注销(知识点cookie和session)

在学习了cookie和session之后,实现了免用户名登录和注销操作。
免用户名就是在本次session登录成功之后,对session进行setAttribute操作,jsp文件通过EL语言${sessionScope.user.username}获取。

// 登录 成功
//跳到成功页面login_success.html
req.getSession().setAttribute("user", loginUser);
req.getRequestDispatcher("/pages/user/login_success.jsp").forward(req, resp);

注销操作就是设置本次session立即销毁。

req.getSession().invalidate();
resp.sendRedirect(req.getContextPath());//重定向到当前目录。

2.表单重复提交的情况及解决方法—验证码

老师花了很大力气说明什么是表单重复提交的情况(有三种情况以及其解决方法)。

表单重复提交有三种常见的情况:
一:提交完表单。服务器使用请求转来进行页面跳转。这个时候,用户按下功能键 F5,就会发起最后一次的请求。 造成表单重复提交问题。解决方法:使用重定向来进行跳转。
二:用户正常提交服务器,但是由于网络延迟等原因,迟迟未收到服务器的响应,这个时候,用户以为提交失败,就会着急,然后多点了几次提交操作,也会造成表单重复提交。
三:用户正常提交服务器。服务器也没有延迟,但是提交完成后,用户回退浏览器。重新提交。也会造成表单重复 提交。

所谓的重定向操作就是:

//原:
req.getRequestDispatcher("/ok.jsp").forward(req, resp);
//重定向
resp.sendRedirect(req.getContextPath()+"/ok.jsp");

后面两种情况的解决方法是验证码
以下是截图下来的底层逻辑:
在这里插入图片描述

3.如何使用谷歌验证码包(会给出图片,并自动保存在session域中)。

谷歌验证码 kaptcha 使用步骤如下:
1、导入谷歌验证码的 jar 包
kaptcha-2.3.2.jar
2、在 web.xml 中去配置用于生成验证码的 Servlet 程序

<servlet><servlet-name>KaptchaServlet</servlet-name><servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
</servlet>
<servlet-mapping><servlet-name>KaptchaServlet</servlet-name><url-pattern>/kaptcha.jpg</url-pattern>
</servlet-mapping>

3、在表单中使用 img 标签去显示验证码图片并使用它

<form action="http://localhost:8080/tmp/registServlet" method="get">用户名:<input type="text" name="username" > <br>验证码:<input type="text" style="width: 80px;" name="code"><img src="http://localhost:8080/tmp/kaptcha.jpg" alt="" style="width: 100px; height: 28px;"> <br><input type="submit" value="登录">
</form>

4、在服务器获取谷歌生成的验证码和客户端发送过来的验证码比较使用。

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取 Session 中的验证码String token = (String) req.getSession().getAttribute(KAPTCHA_SESSION_KEY);// 删除 Session 中的验证码req.getSession().removeAttribute(KAPTCHA_SESSION_KEY);String code = req.getParameter("code");// 获取用户名String username = req.getParameter("username");if (token != null && token.equalsIgnoreCase(code)) {System.out.println("保存到数据库:" + username);resp.sendRedirect(req.getContextPath() + "/ok.jsp");} else {System.out.println("请不要重复提交表单");}
}

4.在书城项目中增加验证码

与上述没有区别。

5.如何实现点击验证码获取更清晰的验证码图片?

第一步肯定是给img绑定单击事件。

<img id="code_img" alt="" src="kaptcha.jpg" style="float: right; margin-right: 40px; width: 110px; height: 30px;">

然后

// 页面加载完成之后$(function () {// 给验证码的图片,绑定单击事件$("#code_img").click(function () {// 在事件响应的function函数中有一个this对象。这个this对象,是当前正在响应事件的dom对象 (就是img)// src属性表示验证码img标签的 图片路径。它可读,可写// alert(this.src);this.src = "${basePath}kaptcha.jpg?d=" + new Date();});

涉及到浏览器缓冲的问题,以下是老师的讲解:
在这里插入图片描述

2024年2月1日

p277
进入购物车阶段。是session版本,所以只在web层操作,意思是只涉及servlet。
先是明确了购物车这个模块需要的对象(购物车和商品项)。
再明确功能(加入,删除,清空,修改商品数量)–》对应的是servlet。
在这里插入图片描述
p278
完成购物车和商品项类的定义。
p279
完成购物车的功能方法。这里涉及了map的使用和BigDecimal的使用。
Map

//linked有两个优势,1.有序插入顺序和取出顺序一致 2.增删效率高 因为底层是双向链表
private Map<Integer, CartItem> items = new LinkedHashMap<Integer, CartItem>();
public void addItem(CartItem cartItem){//不能直接添加,原先购物车上有的,在原有的基础上进行修改。所以items要用map来进行查找比较合适。CartItem item = items.get(cartItem.getId());if(item == null){items.put(cartItem.getId(), cartItem);}else {item.setCount(item.getCount()+1);item.setTotalPrice(item.getPrice().multiply(new BigDecimal(item.getCount())));}}
//遍历
public Integer getTotalCount() {Integer totalCount = 0;for(Map.Entry<Integer, CartItem> entry:items.entrySet()){totalCount+=entry.getValue().getCount();}return totalCount;}

BigDecimal

public BigDecimal getTotalPrice() {BigDecimal totalPrice = new BigDecimal(0);for(Map.Entry<Integer, CartItem> entry:items.entrySet()){totalPrice = totalPrice.add(entry.getValue().getPrice());}return totalPrice;}
//乘法
item.setTotalPrice(item.getPrice().multiply(new BigDecimal(item.getCount())));

对于类的Test文件编写,快捷键ctrl+shift+t
选择合适的目录和想要测试的方法,JUnit4。

2024年2月13日

昨天晚上开启服务器之后就一直是空白页面,最后是在配置里,fix了提醒的部分。
添加入购物车,发现没办法404,原因是herf/book/,而我重新 创建了new_book。
请求头Refere的使用,就是这个请求发出时,浏览器处于的地址。

System.out.println("请求头 Referer 的值:" + req.getHeader("Referer"));
// 重定向回原来商品所在的地址页面
resp.sendRedirect(req.getHeader("Referer"));

比较重要的还有修改购物车某一个商品的数量,这里在界面上使用了change事件。
在这里插入图片描述

// 给输入框绑定 onchange 内容发生改变事件
$(".updateCount").change(function () {
// 获取商品名称
var name = $(this).parent().parent().find("td:first").text();
var id = $(this).attr('bookId');
// 获取商品数量
var count = this.value;
if ( confirm("你确定要将【" + name + "】商品修改数量为:" + count + " 吗?") ) {
//发起请求。给服务器保存修改
location.href =
"http://localhost:8080/book/cartServlet?action=updateCount&count="+count+"&id="+id;
} else {
// defaultValue 属性是表单项 Dom 对象的属性。它表示默认的 value 属性值。
this.value = this.defaultValue;
}
});

最重要的记忆点就是重定向才能避免重复提交。

resp.sendRedirect(req.getContextPath()+"/pages/cart/checkout.jsp");

老师留了很大部分有关订单的功能完善,不知道到底要不要去完成。
请添加图片描述

2024年2月15日

现在第八第九部分,放在了知识点里面记录了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/683381.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++】模板(超详细!!!!!!)

文章目录 前言1. 泛型编程2. 函数模板2.1 函数模板概念2.2 函数模板格式2.3 函数模板的原理2.4 函数模板的实例化2.5 模板参数的匹配原则2.6 声明和定义分离 3. 类模板3.1 类模板的定义格式3.2 类模板的实例化 4. 模板分离编译4.1 什么是分离编译4.2 模板的分离编译 总结 前言 …

记录一下最近遇到的几个二叉树的题型(附好用的遍历模板)

107. 二叉树的层序遍历 II 102. 二叉树的层序遍历 987. 二叉树的垂序遍历 以上三题可共用一个模板&#xff08;dfs记录数的col和row)&#xff0c;不同之处就是使用哈希表的时候调整一下key和value&#xff1a; # Definition for a binary tree node. # class TreeNode: # …

【Linux笔记】进程间通信之管道

一、匿名管道 我们在之前学习进程的时候就知道了一个概念&#xff0c;就是进程间是互相独立的&#xff0c;所以就算是两个进程是父子关系&#xff0c;其中一个进程退出了也不会影响另一个进程。 也因为进程间是互相独立的&#xff0c;所以两个进程间就不能直接的传递信息或者…

网络安全威胁,如何解决缓冲区溢出攻击

目录 一、什么是网络安全 二、什么是缓冲区 三、缓冲区溢出 四、缓冲区溢出攻击的类型 一、什么是网络安全 网络安全&#xff08;Network Security&#xff09;指的是保护计算机网络及其相关设备、系统和数据免受未经授权访问、破坏、篡改、窃取或滥用的威胁和攻击。随着网…

【doghead】VS2022 win11 安装配置WSL2 以编译linux端的cmake项目并运行1

Visual Studio 2022 在Windows上编译调试WSL2 CMake Linux工程 好像是我自己的vs2022的一个插件支持rust https://github.com/kitamstudios/rust-analyzer.vs/blob/master/PREREQUISITES.md Latest rustup (Rust Toolchain Installer). Install from here. Welcome to Rust!Th…

ElasticSearch分词器和相关性详解

目录 ES分词器详解 基本概念 分词发生时期 分词器的组成 切词器&#xff1a;Tokenizer 词项过滤器&#xff1a;Token Filter 停用词 同义词 字符过滤器&#xff1a;Character Filter HTML 标签过滤器&#xff1a;HTML Strip Character Filter 字符映射过滤器&#x…

『 C++ - STL 』位图(BitMap)与布隆过滤器(Bloom Filter)

文章目录 &#x1f9f8; 位图(BitMap)概念&#x1f9f8; 位图的实现&#x1fa85; 总体框架&#x1fa85; 位图的数据插入&#x1f9e9; 左移操作与右移操作的区别 &#x1fa85; 位图的数据删除&#x1fa85; 位图的数据查找&#x1fa85; 位图整体代码(供参考) &#x1f9f8;…

(06)Hive——正则表达式

Hive版本&#xff1a;hive-3.1.2 一、Hive的正则表达式概述 正则表达式是一种用于匹配和操作文本的强大工具&#xff0c;它是由一系列字符和特殊字符组成的模式&#xff0c;用于描述要匹配的文本模式。 Hive的正则表达式灵活使用解决HQL开发过程中的很多问题&#xff0c;本篇文…

代码随想录算法训练营第32天| 122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II

122.买卖股票的最佳时机II 完成 思路&#xff1a; 把每天的利润最大化&#xff0c;即可达到总利润的最大化。 把利润拆分到每一天&#xff0c;能获利就买。 代码 class Solution {public int maxProfit(int[] prices) {int res 0;for (int i 0; i < prices.length-1; i…

Activation of network connection failed(ubuntu连不上网)

ubuntu连不上网&#xff0c;看了好几个方法找到个有用的记录一下 1. 还原默认设置 2. 更改适配器&#xff1a;加上vmware bridge protocol

使用Vue.js输出一个hello world

导入vue.js <script src"https://cdn.jsdelivr.net/npm/vue2/dist/vue.js"></script> 创建一个标签 <div id"app">{{message}}</div> 接管标签内容&#xff0c;创建vue实例 <script type"text/javascript">va…

关于Django的中间件使用说明。

目录 1.中间件2. 为什么要中间件&#xff1f;3. 具体使用中间件3.1 中间件所在的位置&#xff1a;在django的settings.py里面的MIDDLEWARE。3.2 中间件的创建3.3 中间件的使用 4. 展示成果 1.中间件 中间件的大概解释&#xff1a;在浏览器在请求服务器的时候&#xff0c;首先要…

【无标题】JAVA学习-集合.编写equals和hashCode

编写equals()和hashCode()方法需要遵循以下原则&#xff1a; 1. equals()方法&#xff1a; - 使用instanceof关键字检查传入的对象是否为当前类的实例。 - 检查传入的对象是否为null。 - 检查传入的对象的类型是否与当前对象的类型相同。 - 比较对象的属性是否相等&#x…

如何在 Ubuntu VPS 上使用 Celery 与 RabbitMQ 来做队列

简介 异步或非阻塞处理是一种将某些任务的执行与程序的主要流程分离的方法。这为您提供了几个优势&#xff0c;包括允许用户界面代码在没有中断的情况下运行。 消息传递是程序组件用来通信和交换信息的一种方法。它可以同步或异步实现&#xff0c;并且可以允许离散进程进行无问…

2月14日作业

1、安装tftp服务器和nfs服务器&#xff0c;准备需要下载到开发板文件&#xff0c;存放在指定下载文件夹下&#xff0c;准备需要挂载到开发板文件夹&#xff0c;存放在指定挂载文件夹中。 2、ubuntu和开发板组网&#xff0c;关闭防火墙&#xff0c;关闭杀毒软件&#xff0c;配置…

探索XGBoost:自动化机器学习(AutoML)

探索XGBoost&#xff1a;自动化机器学习&#xff08;AutoML&#xff09; 导言 自动化机器学习&#xff08;AutoML&#xff09;是一种通过自动化流程来构建、训练和部署机器学习模型的方法。XGBoost作为一种强大的机器学习算法&#xff0c;也可以用于AutoML。本教程将介绍如何…

NLP快速入门

NLP入门 课程链接&#xff1a;https://www.bilibili.com/video/BV17K4y1W7yb/?p1&vd_source3f265bbf5a1f54aab2155d9cc1250219 参考文档链接1&#xff1a;NLP知识点&#xff1a;Tokenizer分词器 - 掘金 (juejin.cn) 一、分词 分词是什么&#xff1f; 每个字母都有对应…

【Web】从零开始的js逆向学习笔记(上)

目录 一、逆向基础 1.1 语法基础 1.2 作用域 1.3 窗口对象属性 1.4 事件 二、浏览器控制台 2.1 Network Network-Headers Network-Header-General Network-Header-Response Headers Network-Header-Request Headers 2.2 Sources 2.3 Application 2.4 Console 三、…

车载诊断协议DoIP系列 —— DoIP会话模式(安全与非安全)

车载诊断协议DoIP系列 —— DoIP会话模式(安全与非安全) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖…

react 插槽

问题开发当中会经常出现组件十分相似的组件&#xff0c;只有一部分是不同的 解决&#xff1a; 父组件:在引用的时候 import { Component } from "react"; import Me from "../me";const name <div>名称</div> class Shoop extends Compone…