Java基础入门day60

news2024/11/15 21:26:35

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

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

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

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

相关文章

初探Flask:Pycharm社区版创建Flask项目

文章目录 一、创建工程二、引入Flask库1.使用命令行安装Flask2.在PyCharm中安装Flask 三、创建Flask框架基本文件四、运行项目 本文将带您一步步创建一个简单的Flask项目&#xff0c;包括设置Python环境、安装Flask库以及创建基本的项目结构。 一、创建工程 首先&#xff0c;确…

找到可靠的APP外包开发公司

找到可靠的APP外包开发公司需要经过一系列细致的筛选和评估。以下是寻找和选择一家合适的APP外包开发公司的步骤和注意事项。选择一家可靠的APP外包开发公司需要经过详细的研究和多方面的评估&#xff0c;确保公司能够满足项目需求并提供高质量的服务。北京木奇移动技术有限公司…

【乐吾乐3D可视化组态编辑器】灯光

灯光 在场景属性中&#xff0c;我们介绍了HDR&#xff0c;它的作用是为场景提供环境光&#xff0c;如果网格设置了PBR材质&#xff0c;那么网格表面就会反射出光照效果。这是为场景提供环境光的手段之一&#xff0c;但是它也有缺陷&#xff0c;一是只对PBR材质有效&#xff0c…

采用Java+ SpringBoot+ IntelliJ+idea开发的ADR药物不良反应监测系统源码

采用Java SpringBoot IntelliJidea开发的ADR药物不良反应监测系统源码 ADR药物不良反应监测系统有哪些应用场景&#xff1f; ADR药物不良反应监测系统有哪些应用场景&#xff1f; ADR药物不良反应监测系统具有广泛的应用场景&#xff0c;以下是一些主要的应用场景&#xff1a…

MT3048 区间按位或

思路&#xff1a; 使用ST表。ST表求区间最大值改为按位或即可。 ST模板可参考MT3024 maxmin 代码&#xff1a; 1.暴力6/10 #include <bits/stdc.h> using namespace std; const int N 2e5 10; const int M 5e5 10; int n, m; int num[N]; int main() {cin >&…

前端实习记录——git篇(公司拉取项目流程)

实习中第一步就是拉取项目&#xff0c;看项目代码&#xff0c;下面总结一下我在公司项目拉取项目流程。 1、联系leader开通gitlab账号 2、查看/配置git用户名和密码 &#xff08;1&#xff09;查看 git config user.name git config user.email git config user.password &…

8086 汇编笔记(二):寄存器(内存访问)

一、内存中字的存储 字单元的概念&#xff1a;字单元&#xff0c;即存放一个字型数据(16 位)的内存单元&#xff0c;由两个地址连续的内存单元组成 由上一章学习可知&#xff1a;高地址内存单元中存放字型数据的高位字节&#xff0c;低地址内存单元中存放字型数据的低位字节 …

【喜报】科大睿智多家服务企业上榜2024年第四批DCMM名单

近日&#xff0c;DCMM官方平台发布通知公告&#xff0c;根据《数据管理能力成熟度评估工作管理办法(暂行)》的有关规定&#xff0c;经单位自愿申请&#xff0c;评估机构评估、专家评审及公示&#xff0c;下列27单位获得数据管理能力成熟度等级证书。小编祝贺多家服务企业上榜20…

四川古力未来科技抖音小店畅享多重好处

在当今数字化浪潮席卷之下&#xff0c;四川古力未来科技抖音小店以其独特的魅力&#xff0c;正逐渐成为消费者们的新宠。作为融合了先进科技与便捷购物体验的创新平台&#xff0c;它不仅能够满足消费者的多样化需求&#xff0c;更在提升购物体验、优化服务流程等方面展现出了显…

【ubuntu20】--- 定时同步文件

在编程的艺术世界里&#xff0c;代码和灵感需要寻找到最佳的交融点&#xff0c;才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里&#xff0c;我们将共同追寻这种完美结合&#xff0c;为未来的世界留下属于我们的独特印记。 【Linux命令】--- 多核压缩命令大全&…

openresty(Nginx) 隐藏 软件包名称 版本号 升级新版本

1 访问错误或者异常的URL 2 修改配置&#xff0c;重新编译&#xff0c;升级 #修改版本等 vim ./bundle/nginx-1.13.6/src/core/nginx.h #define nginx_version 1013006 #define NGINX_VERSION "1.13.6" #define NGINX_VER "openresty/&q…

第二证券炒股知识:买可转债的条件?

买可转债需要开通可转债的权限&#xff0c;其间开通可转债权限需要满意2年买卖经历10万元资产量”的准入要求。 在买卖可转债时&#xff0c;需要留意以下买卖规则&#xff1a; 1、可转债买卖时刻为买卖日的9:30-11:30,13:00-15:00&#xff0c;其间9:15-9:25&#xff0c;9:15-9…

如何在OrangePi AIpro智能小车上实现安全强化学习算法

随着人工智能和智能移动机器人的广泛应用&#xff0c;智能机器人的安全性和高效性问题受到了广泛关注。在实际应用中&#xff0c;智能小车需要在复杂的环境中自主导航和决策&#xff0c;这对算法的安全性和可靠性提出了很高的要求。传统的强化学习算法在处理安全约束时存在一定…

[CVPR-24] HUGS: Human Gaussian Splats

本文提出一种新的数字人表征Human Gaussian Splats (HUGS)&#xff0c;可以实现新姿态和新视角生成&#xff1b;本文提出一种新的前向形变模块&#xff08;forward deformation module&#xff09;&#xff0c;在标定空间基于Gaussians表征数字人&#xff0c;并基于LBS学习如何…

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

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

开放式耳机推荐品牌:五款品质超凡机型必须选购

在这个快节奏的生活中&#xff0c;我们每个人都渴望在忙碌之余找到一片属于自己的宁静。音乐&#xff0c;作为连接心灵的桥梁&#xff0c;无疑是最为直接和有效的途径。而一款优秀的开放式耳机&#xff0c;不仅能让我们沉浸在美妙的旋律中&#xff0c;还能在保持对外界环境感知…

Golang os.Rename invalid cross-device link的原因

文章目录 背景运行环境 文件系统对比linux下的文件系统mac下的文件系统linux下的mv指令 golang的os.Rename源码os.Renamesyscall.Renamesyscall.RenameatSYS_RENAMEAT是什么 查看系统调用函数文档什么是man pageman page的用法user commandssystem calls renameat不支持跨挂载点…

如何用俄语预定酒店,柯桥外贸俄语培训

-Привет, Алекс! Как твои дела? 你好&#xff0c;阿列克斯&#xff01;你最近好吗&#xff1f; -Отлично! Я скоро уезжаю на 10 дней в Санкт-Петербург, но никак не могу найти там…

ITIL4认证考试这么贵,还值得考证吗,有必要学吗?

从2023年4月1日开始&#xff0c;ITIL 4是Foundation认证将会捆绑OTM(Official Training Materials),这样在一次ITIL4的考试费中将会捆绑&#xff1a;试卷费电子教材书费监考费OTM费&#xff0c;每一种考试费都相较于2022年有涨幅&#xff0c;再加上PeopleCert收取的授权机构的授…

redis-cli help使用

1. redis-cli命令使用—先连接上服务器 连接到 Redis 服务器&#xff1a; 使用 redis-cli 命令即可连接到本地运行的 Redis 服务器&#xff0c;默认连接到本地的 6379 端口。 redis-cli如果 Redis 服务器不在本地或者端口不同&#xff0c;可以使用 -h 和 -p 参数指定主机和端…