当前位置: 首页 > news >正文

基于JSP、java、Tomcat三者的项目实战--校园交易网(3)主页--添加商品功能

 技术支持:JAVA、JSP

服务器:TOMCAT 7.0.86

编程软件:IntelliJ IDEA 2021.1.3 x64


前文三篇登录和注册功能的实现

基于JSP、java、Tomcat、mysql三层交互的项目实战--校园交易网(1)-项目搭建(前期准备工作)-CSDN博客基于JSP、java、Tomcat、mysql三层交互的项目实战--校园交易网(2)登录,注册功能实现_jsp与java交互-CSDN博客基于JSP、java、Tomcat三者的项目实战--校园交易网(2)登录,注册功能实现-CSDN博客

基于JSP、java、Tomcat三者的项目实战--校园交易网(3)主页-CSDN博客


主页中我们其实看到了许多功能,我们先来说说

由于这么多功能,集中在这一个网页中,所以我也不水字数,主页的JSP文件在这篇博客中
基于JSP、java、Tomcat三者的项目实战--校园交易网(3)主页-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_64056556/article/details/140730309?spm=1001.2014.3001.5501


首先,我们是将所有的商品放在我的sdjyy的数据库中,接下来新建一个名为goods的数据表,里面的属性分别为name和price,同样的这个操作我在上面一篇博客也已经讲了基于JSP、java、Tomcat三者的项目实战--校园交易网(3)主页-CSDN博客

接下来我们先讲一下添加商品功能---->④

①-服务层所写的文件,代码

②-要呈现所有的商品,我们最主要的逻辑就是应用了dao层的findallgoods方法

③-是上一个博客的疏忽,我忘记将Product实体类放到博客上来了,其实就是根据数据库中的定义类型,对product对象中的name和price属性进行set、get方法以及tostring。

话不多说,直接上代码


服务层

AddShoppingServlet

package Servlet;import dao.StudentDAO;
import entiy.Product;
import entiy.Student;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;public class AddShoppingServlet extends HttpServlet {public void service(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {request.setCharacterEncoding("utf-8");//读取参数String name = request.getParameter("name");String price = request.getParameter("price");response.setContentType("text/html;charset=utf-8");PrintWriter out=response.getWriter();try {StudentDAO dao = new StudentDAO();//创建商品对象Product e1 = new Product();e1.setName(name);e1.setPrice(Double.parseDouble(price));System.out.println(e1.getName());System.out.println(e1.getPrice());dao.savegoods(e1);//重定向到主页面response.sendRedirect("list");} catch (Exception e) {e.printStackTrace();out.println("系统繁忙,请稍后再试!");}out.close();}
}

这段服务层的作用是处理添加商品的请求并将商品信息保存到数据库中。

逻辑思路和步骤:

  1. 设置编码和获取参数

    • request.setCharacterEncoding("utf-8"):确保请求参数的编码正确设置为UTF-8,以防止乱码问题。
    • String name = request.getParameter("name") 和 String price = request.getParameter("price"):从请求中获取商品的名称和价格。
  2. 设置响应类型和获取输出流

    • response.setContentType("text/html;charset=utf-8"):设置响应的内容类型为HTML,并指定UTF-8编码。
    • PrintWriter out = response.getWriter():获取用于向客户端发送响应的输出流。
  3. 数据库操作

    • StudentDAO dao = new StudentDAO():创建一个StudentDAO对象,这可能是一个数据访问对象,用于处理数据库操作。
    • Product e1 = new Product():创建一个Product对象,用于封装从请求中获取的商品信息。
    • e1.setName(name) 和 e1.setPrice(Double.parseDouble(price)):设置商品对象的名称和价格。
  4. 保存商品到数据库

    • dao.savegoods(e1):调用StudentDAO中的savegoods方法,将商品对象保存到数据库中。
  5. 异常处理和响应输出

    • response.sendRedirect("list"):重定向到名为"list"的Servlet或页面,通常用于显示添加商品后的主页面或列表页面。
    • catch (Exception e):捕获可能发生的异常。
    • e.printStackTrace() 和 out.println("系统繁忙,请稍后再试!"):在控制台打印异常信息,并向客户端输出错误提示信息。

用到的技术和连接:

  • Servlet技术:基于Java的Web应用开发技术,通过继承HttpServlet来处理HTTP请求和响应。
  • HttpServletRequest和HttpServletResponse:用于获取客户端请求的数据和向客户端发送响应。
  • UTF-8编码:确保中文和特殊字符能够正确地被处理和显示。
  • 数据库访问:通过StudentDAO对象调用savegoods方法,将商品信息保存到数据库中。

这段代码的主要逻辑是接收从前端传来的商品名称和价格,将其封装成一个Product对象,然后通过StudentDAO将该对象保存到数据库中。最后,根据保存结果,可能重定向到商品列表页面或者显示错误信息给用户。


前端

AddShopping.jsp

<%@page contentType="text/html;charset=utf-8" pageEncoding="utf-8" %>
<%@page import="java.util.*,java.text.*,dao.*" %>
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Add Product</title><link rel="stylesheet" href="css/style.css"><style>/* 这里可以添加页面特定的 CSS 样式 */body {font-family: Arial, sans-serif;background-color: #f0f0f0;margin: 0;padding: 0;}#wrap {width: 80%;margin: 0 auto;background-color: #fff;box-shadow: 0 0 10px rgba(0,0,0,0.1);}header {background-color: #333;color: #fff;padding: 10px;text-align: center;}#content {padding: 20px;}.form_table {width: 100%;}.form_table td {padding: 10px;}.inputgri {width: 100%;padding: 8px;border: 1px solid #ccc;border-radius: 4px;box-sizing: border-box;font-size: 14px;}.button {padding: 10px 20px;background-color: #4CAF50;color: white;border: none;border-radius: 4px;cursor: pointer;font-size: 14px;}.button:hover {background-color: #45a049;}#footer {background-color: #333;color: #fff;text-align: center;padding: 10px;}</style>
</head>
<body>
<div id="wrap"><div id="content"><h1>添加商品:</h1><form action="add" method="post"><table class="form_table"><tr><td align="right">Name:</td><td><input type="text" class="inputgri" name="name" /></td></tr><tr><td align="right">Price:</td><td><input type="text" class="inputgri" name="price" /></td></tr></table><p><input type="submit" class="button" value="确认添加"  /></p></form></div><footer id="footer">sdjyw@126.com</footer>
</div>
</body>
</html>

这是一个简单的HTML页面,用于向用户展示一个添加商品的表单界面。

页面结构和功能解析:

  1. 页面声明和设置

    • <%@page contentType="text/html;charset=utf-8" pageEncoding="utf-8" %>:指定页面的内容类型和编码为UTF-8,确保页面可以正确显示中文和特殊字符。
    • <%@page import="java.util.*,java.text.*,dao.*" %>:导入所需的Java类库,包括java.util下的所有类、java.text下的所有类,以及dao包中的所有类,用于后续的数据处理。
  2. HTML结构

    • <!DOCTYPE html>:声明文档类型为HTML5。
    • <html lang="en">:指定页面的语言为英语。
    • <head>:头部部分,包含页面的元数据和引用的样式表。
      • <meta charset="UTF-8">:设置字符集为UTF-8。
      • <meta name="viewport" content="width=device-width, initial-scale=1.0">:设置视口,使页面在各种设备上能正确显示并自动缩放到设备宽度。
      • <title>Add Product</title>:设置页面的标题为"Add Product"。
      • <link rel="stylesheet" href="css/style.css">:引入外部样式表,定义了页面的整体样式。
      • <style>:内部样式表,用于定义页面特定的样式。
  3. 页面内容

    • <body>:页面的主体部分。
      • <div id="wrap">:包裹整个页面内容,定义了页面的宽度、背景色和阴影效果。
      • <div id="content">:页面的主要内容区域。
        • <h1>添加商品:</h1>:显示页面的主标题。
        • <form action="add" method="post">:表单元素,用于向服务器提交数据,提交目标为"add",提交方式为POST。
          • <table class="form_table">:使用表格布局,定义了表单的样式。
            • <tr>:表格行。
              • <td align="right">Name:</td>:表格单元格,显示字段"Name",并右对齐。
              • <td><input type="text" class="inputgri" name="name" /></td>:表格单元格,包含一个文本输入框,用于用户输入商品名称,输入框具有自定义的样式类"inputgri"。
            • 同样的结构用于"Price"字段的输入。
          • <p><input type="submit" class="button" value="确认添加" /></p>:提交按钮,用户点击后将表单数据提交到服务器。
        • <footer id="footer">:页面的页脚部分。
          • "sdjyw@126.com":显示联系邮箱。

页面样式和功能点解释:

  • 样式设计:通过CSS设置了页面的整体布局、背景色、字体等样式,使页面看起来更加整洁和专业。
  • 表单设计:使用了HTML表格布局来组织表单元素,使页面结构清晰,并通过CSS样式美化表单元素的外观。
  • 提交功能:表单的提交目标为"add",使用POST方法提交数据,提交的数据将被发送到后端处理。
  • 响应性设计:通过设置视口和CSS,使页面在不同设备上具有良好的显示效果和响应性。

总体来说,这段HTML页面设计了一个简洁而功能完善的商品添加界面,用户可以通过输入商品名称和价格,点击确认添加按钮,将数据提交到后端处理。


dao层

savegoods方法

public void savegoods(Product e) throws Exception {Connection conn = null;PreparedStatement prep = null;try {conn = DBUtil.getConnection();prep = conn.prepareStatement("INSERT INTO goods (name,price) VALUES (?, ?)");prep.setString(1, e.getName());prep.setDouble(2, e.getPrice());prep.executeUpdate();} catch (SQLException e1) {// Handle specific SQL exceptions or log them for debugginge1.printStackTrace();throw new Exception("Failed to save goods: " + e1.getMessage(), e1);} finally {// Close PreparedStatement and Connection in finally blockif (prep != null) {try {prep.close();} catch (SQLException e2) {e2.printStackTrace();}}DBUtil.close(conn);}
}
  1. 连接和 PreparedStatement 设置:

    • 方法开始通过 DBUtil.getConnection() 建立数据库连接 (conn)。
    • 使用包含插入 name 和 price 到 goods 表的 SQL 查询创建 PreparedStatement (prep)。
  2. 设置参数和执行:

    • 使用 prep.setString(1, e.getName()) 和 prep.setDouble(2, e.getPrice()) 分别为 PreparedStatement 的参数 (name 和 price) 设置值。
    • 使用 prep.executeUpdate() 执行数据库更新操作。
  3. 异常处理:

    • 方法捕获 SQLException 来专门处理数据库操作期间发生的任何错误。
    • 在捕获异常时,打印堆栈跟踪以进行调试,并且抛出一个新的 Exception,包装原始的 SQLException,并提供自定义的错误消息 ("Failed to save goods: " + e1.getMessage()).
  4. 资源管理:

    • 在 finally 块中确保 PreparedStatement (prep) 被正确关闭以释放数据库资源,使用 prep.close()
    • 使用 DBUtil.close(conn) 关闭数据库连接 (conn)。

entity层(实体层)

Product

package entiy;public class Product {private int id;private String name;private double price;// 其他商品属性,如颜色、库存等// 构造方法、getter和setter方法public int getId() {return id;}public void setId(int id) {this.id = id;}public Product(/*, 其他属性 */) {this.name = name;this.price = price;// 初始化其他属性}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getPrice() { return price; }public void setPrice(double price) {this.price = price;}@Overridepublic String toString() {return "Product{" +"id=" + id +", name='" + name + '\'' +", price=" + price +'}';}
}


web.xml

<servlet><servlet-name>add</servlet-name><servlet-class>Servlet.AddShoppingServlet</servlet-class></servlet><servlet-mapping><servlet-name>add</servlet-name><url-pattern>/add</url-pattern></servlet-mapping>

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【C++】数组案例 五只小猪称体重
  • C#中DataTable新增列、删除列、更改列名、交换列位置
  • 代码随想录算法训练营第37天|完全背包理论基础、518.零钱兑换II、377. 组合总和 Ⅳ、70. 爬楼梯(进阶版)
  • 【深度学习】深度学习基本概念、工作原理及实际应用案例
  • (STM32笔记)九、RCC时钟树与时钟 第一部分
  • 微信小程序之behaviors
  • 刷题——不同路径的数目
  • Python基础学习笔记(一)
  • 记录一次网站疑似被劫持的排查
  • 数据治理五部曲
  • uniapp中初始化对象不赋值,后续属性无法绑定问题
  • 掌握SQL Server事务日志的艺术:深入配置与管理
  • Spock Unit Test in Java
  • c++ 11 =delete
  • 数据结构(面试)
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • CentOS 7 防火墙操作
  • exports和module.exports
  • go语言学习初探(一)
  • Java编程基础24——递归练习
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • Python连接Oracle
  • vue-cli3搭建项目
  • 彻底搞懂浏览器Event-loop
  • 对JS继承的一点思考
  • 对象引论
  • 复杂数据处理
  • 构造函数(constructor)与原型链(prototype)关系
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 入口文件开始,分析Vue源码实现
  • 收藏好这篇,别再只说“数据劫持”了
  • 数据仓库的几种建模方法
  • 小程序 setData 学问多
  • ionic异常记录
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​渐进式Web应用PWA的未来
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • #Datawhale X 李宏毅苹果书 AI夏令营#3.13.2局部极小值与鞍点批量和动量
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (SpringBoot)第七章:SpringBoot日志文件
  • (STM32笔记)九、RCC时钟树与时钟 第二部分
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (回溯) LeetCode 77. 组合
  • (理论篇)httpmoudle和httphandler一览
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (新)网络工程师考点串讲与真题详解
  • (一)RocketMQ初步认识
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • *算法训练(leetcode)第三十九天 | 115. 不同的子序列、583. 两个字符串的删除操作、72. 编辑距离
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException