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();
​
 @Override
 protected 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();
​
 @Override
 public List<Book> getAllBooks() {
     return bookDao.getAllBooks();
 }
​
 @Override
 public 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());
 @Override
 public List<Book> getAllBooks() {
     try {
         return qr.query("select * from book", new BeanListHandler<Book>(Book.class));
     } catch (SQLException e) {
         throw new RuntimeException(e);
     }
 }
​
 @Override
 public 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();

 @Override
 protected 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;
 }

 @Override
 public 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;

 @Override
 public 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的,一旦关闭浏览器,则失效

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

我国赤泥年产量庞大 政策引导下赤泥绿色利用率将不断提升

我国赤泥年产量庞大 政策引导下赤泥绿色利用率将不断提升 赤泥是指从铝土矿中提炼氧化铝后产生的强碱性工业固体废渣&#xff0c;由于含大量氧化铁&#xff0c;表面呈现红色&#xff0c;而得名赤泥。   赤泥通常包含氧化铝、氧化铁、二氧化硅、氧化钙、碱金属及其他微量元素&…

【Jmeter】性能测试之压测脚本生成,也可以录制接口自动化测试场景

准备工作-10分中药录制HTTPS脚本&#xff0c;需配置证书 准备工作-10分中药 以https://www.baidu.com/这个地址为录制脚本的示例。 录制脚本前的准备工作当然是得先把Jmeter下载安装好、JDK环境配置好、打开Jmeter.bat&#xff0c;打开cmd&#xff0c;输入ipconfig&#xff0c;…

数据分析中的列与行交换技巧

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;数据交换的重要性 二、列交换的基本原理 三、列交换的代码实现 1. 使…

勒索软件统计数据揭示了网络勒索的惊人速度

本文通过各种报告摘录&#xff0c;提供了有关当前勒索软件形势的统计数据和见解。 全球勒索病毒危机加剧 NTT安全控股《2024全球威胁情报报告》&#xff08;2024年5月&#xff09; 据NTT安全控股公司的《2024年全球威胁情报报告》显示&#xff0c;勒索软件和勒索事件在2023年激…

无人售货机零售业务成功指南:从市场分析到创新策略

在科技驱动的零售新时代&#xff0c;无人售货机作为一种便捷购物解决方案&#xff0c;正逐步兴起&#xff0c;它不仅优化了消费者体验&#xff0c;还显著降低了人力成本&#xff0c;提升了运营效能。开展这项业务前&#xff0c;深入的市场剖析不可或缺&#xff0c;需聚焦消费者…

Ai绘画怎么正确使用关键词?

在AI绘画的过程中&#xff0c;关键词&#xff08;提示词&#xff09;是非常重要的组成部分&#xff0c;下面我以AI绘画常用的Stable Diffusion为例&#xff0c;来介绍下AI绘画怎么使用提示词吧&#xff01; 一、提示词是什么 提示词&#xff08;Prompt&#xff09;就是我们对…

开源数据库同步工具DBSyncer

前言&#xff1a; 这么实用的工具&#xff0c;竟然今天才发现&#xff0c;相见恨晚呀&#xff01;&#xff01;&#xff01;&#xff01; DBSyncer&#xff08;英[dbsɪŋkɜː]&#xff0c;美[dbsɪŋkɜː 简称dbs&#xff09;是一款开源的数据同步中间件&#xff0c;提供M…

北美互联网裁员太狠了,程序员“做管理上岸”越来越难

北美互联网现在裁员太狠了&#xff0c;“做管理上岸”这种事情在现在这种行业形势已经基本不存在了&#xff0c;这个人管理40人的团队该裁还是裁。 然而硅谷还是中国程序员心中的圣地&#xff08;华子一定程度上也是很多人的心之所向&#xff0c;技术大厂捞人&#xff0c;前后…

【C语言每日一练】【第1天】C程序实现分数计算器

一、实现目标 输入两个分数&#xff0c;中间是四则运算符&#xff08;&#xff0c;-&#xff0c;*&#xff0c;/&#xff09;&#xff0c;程序输出分数形式的运算结果。 样例输入&#xff1a;1,2,,1,3 样例输出&#xff1a;5/6 (1/21/3) 二、实现步骤 1、求最大公约数 定义一…

在 CentOS 上安装 PostgreSQL 的全面指南

PostgreSQL 是一种功能强大的开源关系型数据库管理系统&#xff0c;广泛应用于各种领域。它提供了诸如事务处理、并发控制和数据完整性等高级功能&#xff0c;因此深受开发者和企业的欢迎。本指南将逐步引导您在 CentOS 上安装 PostgreSQL&#xff0c;以便您充分利用其众多优势…

面试必备:应对 “为什么离职” 的万能回答

使用PC端的朋友&#xff0c;请将页面缩小到最小比例&#xff0c;阅读最佳&#xff01; 面试官问到你为什么从上一家公司离职时&#xff0c;你会怎么回答&#xff1f;这个问题我觉得很有意思&#xff0c;也很有必要去探讨一下。 很多专业人士都会建议你&#xff0c;最好不要直接…

日常使用工具(截图,笔记,一键启动)

目录 一,截图 Snipaste 二.笔记 Joplin 三.翻译 四.自动启动软件 这篇记录一下工作中用的很顺手的工具. 一,截图 Snipaste 官网:Snipaste - 截图 贴图 下面是官方手册. 使用 我都是直接F1 就会出现选择框,随意拖动大小,选择下方工具栏,相应位置, 二.笔记 Joplin 官网:…

【Pandas】深入解析`pd.to_excel()`函数

【Pandas】深入解析pd.to_excel()函数 &#x1f308; 欢迎莅临我的个人主页&#x1f448;这里是我深耕Python编程、机器学习和自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;并乐于分享知识与经验的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xf…

Linux自动重启系统脚本测试工具

前言 脚本允许用户指定重启的次数和重启间隔时间&#xff0c;并自动生成相应的定时任务。通过使用这个脚本&#xff0c;系统管理员可以轻松地设置重启测试。每次重启操作都会被记录下来&#xff0c;以便用户随时了解测试情况。 一、脚本 #!/bin/bashif [ "$1" &qu…

css设置文字在固定宽度中等距分开(仅限于单行文本)

一、要实现的效果&#xff1a; 二、代码 要在CSS中设置文本在一个固定宽度的容器中等距分开&#xff0c; 可以使用text-align: justify;属性&#xff0c;它可以让文本两端对齐&#xff0c;看起来就像是等距分开的。 但是要注意&#xff0c;单独使用text-align:justify;只能对单…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(十)

课程地址&#xff1a; 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程&#xff0c;一套精通鸿蒙应用开发 &#xff08;本篇笔记对应课程第 17 节&#xff09; P17《16.Ark-状态管理Prop Link Provide Consume》 将上一节写出的代码进行功能模块封装&#xff1a;1、任务…

JAVA学习路线图

计算机网课资料分享群&#xff1a;710895979

简单的 Cython 示例

1&#xff0c; pyx文件 fibonacci.pyx def fibonacci_old(n):if n < 0:return 0elif n 1:return 1else:return fibonacci_old(n-1) fibonacci_old(n-2) 2&#xff0c;setup.py setup.py from setuptools import setup from Cython.Build import cythonizesetup(ext_mod…

冯喜运:5.24黄金今日能否回调?日内国际黄金美原油操作策略

【黄金消息面分析】&#xff1a;在过去的半个世纪里&#xff0c;美国国债作为买入持有的投资手段&#xff0c;轻松超越了黄金。然而&#xff0c;如今债券作为终极避险资产的地位正面临着前所未有的挑战。传统上&#xff0c;投资者将美国国债视为一种超安全的投资&#xff0c;因…

做好开源快速开发平台研发创新 助力行业高效发展!

随着信息化时代的到来&#xff0c;科技的力量无处不在。为了提高办公效率&#xff0c;很多大中型企业倾向于使用更为先进的软件平台来助力企业降本增效。在众多助力神器之中&#xff0c;开源快速开发平台低代码技术平台深得广大新老客户朋友的喜爱&#xff0c;它与生俱来的优势…