Java基础入门day60

day60

购物车案例补充

设置欢迎页

打开也系统,就可以直接看到商品列表页面

之前曾经设置过欢迎页,都是针对页面,可以有html页面,也可以有jsp页面

但是今天我们将一个servlet设置成欢迎页

在web.xml文件中设置欢迎页

<welcome-file-list><welcome-file>BookServlet</welcome-file>
</welcome-file-list>

直接访问该项目,会直接访问BookServlet请求所对应的Servlet

实现商品列表功能

BookServlet.java

package com.saas.servlet;
​
import com.saas.service.IBookService;
import com.saas.service.impl.BookServiceImpl;
import com.saas.entity.Book;
​
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.util.List;
​
@WebServlet(name = "BookServlet", value = "/BookServlet")
public class BookServlet extends HttpServlet {
​private IBookService bookService = new BookServiceImpl();
​@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String action = req.getParameter("action");
​if(action == null){getAllBooks(req, resp);}else if ("detail".equalsIgnoreCase(action)){getBookDetail(req, resp);}}
​
​protected void getBookDetail(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String sbid = req.getParameter("bid");
​int bid = sbid == null ? 0 : Integer.parseInt(sbid);
​Book book = bookService.getBookDetail(bid);
​req.setAttribute("book", book);
​req.getRequestDispatcher("book.jsp").forward(req, resp);}
​
​protected void getAllBooks(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {List<Book> list = bookService.getAllBooks();
​req.setAttribute("books", list);
​req.getRequestDispatcher("books.jsp").forward(req, resp);}
}

在service方法中,由于没有传递任何的action,所以action为空,则执行getAllBooks()方法

在getAllBooks()方法中,借助service和dao完成查询所有的Book对象列表

IBookService.java

package com.saas.service;
​
import com.saas.entity.Book;
​
import java.util.List;
​
public interface IBookService {List<Book> getAllBooks();
​Book getBookDetail(int bid);
}

BookServiceImpl.java

package com.saas.service.impl;
​
import com.saas.dao.IBookDao;
import com.saas.dao.impl.BookDaoImpl;
import com.saas.entity.Book;
import com.saas.service.IBookService;
​
import java.util.List;
​
public class BookServiceImpl implements IBookService {
​private IBookDao bookDao = new BookDaoImpl();
​@Overridepublic List<Book> getAllBooks() {return bookDao.getAllBooks();}
​@Overridepublic Book getBookDetail(int bid) {return bookDao.getBookDetail(bid);}
}

IBookDao.java

package com.saas.dao;
​
import com.saas.entity.Book;
​
import java.util.List;
​
public interface IBookDao {List<Book> getAllBooks();
​Book getBookDetail(int bid);
}

BookDaoImpl.java

package com.saas.dao.impl;
​
import com.saas.dao.IBookDao;
import com.saas.entity.Book;
import com.saas.util.DruidUtil;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
​
import java.sql.SQLException;
import java.util.List;
​
public class BookDaoImpl implements IBookDao {
​private QueryRunner qr = new QueryRunner(DruidUtil.getDataSource());@Overridepublic List<Book> getAllBooks() {try {return qr.query("select * from book", new BeanListHandler<Book>(Book.class));} catch (SQLException e) {throw new RuntimeException(e);}}
​@Overridepublic Book getBookDetail(int bid) {try {return qr.query("select * from book where bid = ?", new BeanHandler<Book>(Book.class), bid);} catch (SQLException e) {throw new RuntimeException(e);}}
}

通过BookService,BookDao与数据库交互后得到Book对象的list集合

在BookServlet的getAllBooks()方法中,将Book对象的list存储到request范围中,key为books

跳转到books.jsp页面

<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2024/5/27
Time: 8:47
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>books</title><%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%><style>td:{margin: 10px;text-align: center;}</style>
</head>
<body>
<c:if test="${empty books}">nothing
</c:if>
​
<c:if test="${not empty books}"><table width="80%" align="center"><c:set var="count" value="0" /><tr><c:forEach items="${books}" var="book"><td><center><a href="BookServlet?action=detail&bid=${book.bid}"><img src="imgs/${book.img}" width="100" height="100"/><br /></a><br />
​${book.name}<br /><del>${book.nprice}</del><br />${book.oprice}<br />
​</center></td><c:set var="count" value="${count+1}" /><c:if test="${count%5==0}"></tr><tr></c:if></c:forEach></tr></table>
</c:if>
</body>
</html>

在books.jsp页面中分别判断books是否为空,为空显示nothing,不为空,把数据遍历到表格中显示

该页面还要进行一个分行处理,每隔五个表格的单元格之后进行换行操作,借助jstl的set属性用count来进行判断处理

在该页面中还设置了图片的超链接,点击图片之后,发送一个请求为以下内容BookServlet?action=detail&bid=${book.bid}

那么该请求继续交给BookServlet进行处理,action目前的值是detail,则在BookServlet中的service方法进行分支处理后会调用getBookDetail()方法进行进一步的处理

在该getBookDetail()方法中,由于刚刚的url中还含有bid的值,再该方法中拿到bid之后进行处理,再借助Book的service和dao进行根据bid查找Book对象

在当前servlet中再次将查询出来的book对象存储在key值为book的request作用范围内

最后跳转到book.jsp页面

book.jsp

<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2024/5/27
Time: 11:29
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>book</title><style>table{align: center;}</style>
</head>
<body>
<h1>this is book detail page</h1>
​
<form action="CartServlet" method="post"><input type="hidden" name="bid" value="${book.bid}"><table align="center" width="30%"><tr><td rowspan="4"><img src="imgs/${book.img}" /></td><td>${book.bid}</td></tr><tr><td>${book.name}</td></tr><tr><td><del>${book.nprice}</del></td></tr><tr><td>${book.oprice}</td></tr><tr><td><input type="submit" value="加入购物车"/></td></tr></table>
<form>
​
</body>
</html>

在当前book.jsp页面中,分别显示之前点击书籍商品的详情信息

用户点击加入购物车按钮

由于当前按钮是一个提交按钮,会触发该按钮锁对应的form表的action请求

该action请求的url内容为CartServlet

CartServlet.java

package com.saas.servlet;import com.saas.entity.Book;
import com.saas.entity.CartItem;
import com.saas.service.IBookService;
import com.saas.service.impl.BookServiceImpl;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.util.HashMap;
import java.util.Map;@WebServlet(urlPatterns = "/CartServlet")
public class CartServlet extends HttpServlet {private IBookService iBookService = new BookServiceImpl();@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String sbid = req.getParameter("bid");int bid = sbid == null ? 0 : Integer.parseInt(sbid);Book book = iBookService.getBookDetail(bid);HttpSession session = req.getSession();Object objCart = session.getAttribute("cart");if (objCart == null) {Map<Integer, CartItem> cart = new HashMap<>();cart.put(bid, new CartItem(1, book));session.setAttribute("cart", cart);} else{if (objCart instanceof Map) {Map<Integer, CartItem> cart = (Map<Integer, CartItem>) objCart;if (cart.containsKey(bid)) {CartItem item = cart.get(bid);item.setCount(item.getCount() + 1);} else {cart.put(bid, new CartItem(1, book));}session.setAttribute("cart", cart);}}resp.sendRedirect("cart.jsp");}
}

CartItem.java

package com.saas.entity;public class CartItem {private int count;private Book book;public CartItem() {}public CartItem(int count, Book book) {this.count = count;this.book = book;}@Overridepublic String toString() {return "CartItem{" +"count=" + count +", book=" + book +'}';}public int getCount() {return count;}public void setCount(int count) {this.count = count;}public Book getBook() {return book;}public void setBook(Book book) {this.book = book;}
}

Book.java

package com.saas.entity;public class Book {private int bid;private String name;private String img;private double oprice;private double nprice;@Overridepublic String toString() {return "Book{" +"bid=" + bid +", name='" + name + '\'' +", img='" + img + '\'' +", oprice=" + oprice +", nprice=" + nprice +'}';}public int getBid() {return bid;}public void setBid(int bid) {this.bid = bid;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getImg() {return img;}public void setImg(String img) {this.img = img;}public double getOprice() {return oprice;}public void setOprice(double oprice) {this.oprice = oprice;}public double getNprice() {return nprice;}public void setNprice(double nprice) {this.nprice = nprice;}
}

cart.jsp

<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2024/5/27
Time: 11:53
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>cart</title><%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
</head>
<body>
<h1>this is cart page.</h1>
<c:if test="${empty cart}">nothing
</c:if><c:if test="${not empty cart}"><table width="80%" align="center" border="1"><tr><th>name</th><th>image</th><th>oprice</th><th>nprice</th><th>count</th><th>summary</th></tr><c:forEach items="${cart}" var="c"><tr><td>${c.value.book.name}</td><td><img src="imgs/${c.value.book.img}" width="100" height="100"/></td><td>${c.value.book.oprice}</td><td>${c.value.book.nprice}</td><td>${c.value.count}</td><td>${c.value.count * c.value.book.nprice}</td></tr></c:forEach></table>
</c:if>
</body>
</html>

该页面使用jstl进行数据的展示,以及各种运算

购物车基本实现

小结

购物车主要是针对于session的使用

session中的数据结构Map的使用

目前关于购物车的实现是基于session的,一旦关闭浏览器,则失效

最好的做法是购物车再存入数据库中,随时可以拿到数据库中的信息

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

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

相关文章

【C++】牛客——JZ38 字符串的排列

✨题目链接&#xff1a; JZ38 字符串的排列 ✨题目描述 输入一个长度为 n 字符串&#xff0c;打印出该字符串中字符的所有排列&#xff0c;你可以以任意顺序返回这个字符串数组。 例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BAC,BCA,CBA和CAB。 数…

Pi 母公司将开发情感 AI 商业机器人;Meta 科学家:Sora 不是视频生成唯一方向丨RTE 开发者日报 Vol.214

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「…

揭秘IDM:数字资产管理的未来之星

在当今数字化时代&#xff0c;数字资产管理的重要性日益凸显。随着科技的飞速发展&#xff0c;越来越多的企业和个人开始关注如何有效管理和保护他们的数字资产。在这个过程中&#xff0c;IDM&#xff08;身份管理系统&#xff09;逐渐成为了热门话题。IDM作为一种新兴的技术手…

动手学操作系统(四、MBR读取硬盘加载Loader)

动手学操作系统&#xff08;四、MBR读取硬盘加载Loader&#xff09; 在上一节中&#xff0c;我们学习了使用MBR来直接控制显卡进行显示&#xff0c;在这一节中我们学习如何让MBR来操作硬盘&#xff0c;加载Loader来完成操作系统的后续启动过程。 文章目录 动手学操作系统&…

神经网络与深度学习——第14章 深度强化学习

本文讨论的内容参考自《神经网络与深度学习》https://nndl.github.io/ 第14章 深度强化学习 深度强化学习 强化学习&#xff08;Reinforcement Learning&#xff0c;RL&#xff09;&#xff0c;也叫增强学习&#xff0c;是指一类从与环境交互中不断学习的问题以及解决这类问题…

SQL刷题笔记day4补

1题目 我的正确代码 select e.last_name,e.first_name,d.dept_name from employees e left join (select departments.dept_name,dept_emp.emp_no,dept_emp.dept_no from departments join dept_emp on departments.dept_nodept_emp.dept_no) d on e.emp_nod.emp_no复盘&…

(文章复现)分布式电源接入配电网承载力评估方法研究

参考文献&#xff1a; [1]郝文斌,孟志高,张勇,等.新型电力系统下多分布式电源接入配电网承载力评估方法研究[J].电力系统保护与控制,2023,51(14):23-33. 1.摘要 随着光伏和风电等多种分布式电源的接入&#xff0c;使得传统配电网的结构及其运行状态发生了较大改变。因此&…

【网络】网络编程套接字

一、知识提及 1.源IP地址和目的IP地址 在IP数据包头部中, 有两个IP地址, 分别叫做源IP地址, 和目的IP地址 2.端口号 端口号(port)是传输层协议的内容. 端口号是一个2字节16位的整数;端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理;IP地址 …

一文介绍数据和模型漂移(Drift):漂移检测示例

大家好&#xff0c;漂移(Drift)是机器学习中用来描述模型在生产环境中随着时间推移而性能逐步下降的现象&#xff0c;由很多原因引起&#xff0c;主要原因是随着时间推移输入数据&#xff08;x&#xff09;分布的变化和期望目标&#xff08;y&#xff09;之间的关系发生了变化。…

PHP MySQL图解学习指南:开启Web开发新篇章

PHP曾经是最流行的Web开发语言&#xff0c;许多世界领先的网站(如Facebook、维基百科和WordPress)都是用它编写的。PHP运行在Web服务器端&#xff0c;通过使用存储在MySQL数据库中的数据&#xff0c;使得网站可以为每一位访问者显示不同的定制页面。书中采用简单、直观的图示化…

STL-priority_queue的使用及其模拟实现

优先级队列(priority_queue)默认使用vector作为其底层存储数据的容器&#xff0c;在vector上又使用了堆算法将vector中的元素构造成堆的结构&#xff0c;因此priority_queue就是堆&#xff0c;所有需要用到堆的位置&#xff0c;都可以考虑使用priority_queue。 注意&#xff1…

【好书分享第十三期】AI数据处理实战108招:ChatGPT+Excel+VBA

文章目录 一、内容介绍二、内页插图三、作者简介四、前言/序言五、目录 一、内容介绍 《AI数据处理实战108招&#xff1a;ChatGPTExcelVBA》通过7个专题内容、108个实用技巧&#xff0c;讲解了如何运用ChatGPT结合办公软件Excel和VBA代码实现AI办公智能化、高效化。随书附赠了…

NDIS驱动开发-NET_BUFFER体系

网络数据由通过网络发送或接收的数据包组成。 NDIS 提供数据结构来描述和组织此类数据。 NDIS 6.0 及更高版本的主要网络数据结构包括&#xff1a; NET_BUFFERNET_BUFFER LISTNET_BUFFER_LIST_CONTEXT 它们之间的关系如下: 在 NDIS 6.0 及更高版本中&#xff0c; NET_BUFFER …

串口调试助手中文乱码 解决方案

输出乱码 一般&#xff0c;当串口调试助手输出乱码时&#xff0c;可能有以下几个原因&#xff1a; 波特率设置错误&#xff1a;串口通信需要保证发送和接收的设备使用相同的波特率。请检查串口调试助手和目标设备的波特率设置是否一致。 数据位、停止位或校验位设置错误&…

【目标解算】相机内外参数详细解读+坐标系转换

一、相机参数介绍 1.1 相机内参矩阵 概念&#xff1a;内参矩阵用于描述相机的内部参数&#xff0c;它包含了相机的焦距、主点坐标和图像的畸变等信息。内参矩阵的形式通常为一个3x3的矩阵&#xff0c;常用表示为K。内参矩阵可以将相机坐标系中的三维点映射到图像平面上的二维…

linux安装mysql后,配置mysql,并连接navicat软件

Xshell连接登陆服务器 输入全局命令 mysql -u root -p 回车后&#xff0c;输入密码&#xff0c;不显示输入的密码 注意mysql服务状态&#xff0c;是否运行等 修改配置文件my.cnf&#xff0c;这里没找到就找my.ini&#xff0c;指定有一个是对的 find / -name my.cnf 接下…

GPT-4你了解多少呢

一、引言 在人工智能&#xff08;AI&#xff09;领域&#xff0c;自然语言处理&#xff08;NLP&#xff09;技术一直备受关注。近年来&#xff0c;随着深度学习技术的飞速发展&#xff0c;NLP领域也取得了显著进步。GPT-4&#xff0c;作为OpenAI公司最新发布的自然语言处理模型…

京东二面:为什么Netty要造FastThreadLocal?

FastThreadLocal 从字面意义上来看&#xff0c;它是“Fast”“ThreadLocal”的结合体&#xff0c;寓意为快速的 ThreadLocal。那么&#xff0c;问题来了&#xff0c;Netty 为什么要再造一个 FastThreadLocal&#xff1f;FastThreadLocal 运行快的原因是啥&#xff1f;除了快之外…

linnux上安装php zip(ZipArchive)、libzip扩展

安装顺序&#xff1a; 安装zip&#xff08;ZipArchive&#xff09;&#xff0c;需要先安装libzip扩展 安装libzip&#xff0c;需要先安装cmake 按照cmake、libzip、zip的先后顺序安装 下面的命令都是Linux命令 1、安装cmake 确认是否已安装 cmake --version cmake官网 未安装…

【Paddle】稀疏计算的使用指南 稀疏ResNet的学习心得 (2) + Paddle3D应用实例稀疏 ResNet代码解读 (1.6w字超详细)

【Paddle】稀疏计算的使用指南 & 稀疏ResNet的学习心得 Paddle3D应用实例稀疏 ResNet代码解读 写在最前面一、稀疏格式简介1. COO&#xff08;Coordinate Format&#xff09;2. CSR&#xff08;Compressed Sparse Row Format&#xff09; 二、Paddle稀疏张量支持1. 创建 C…