基于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>

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

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

相关文章

Golang | Leetcode Golang题解之第309题买卖股票的最佳时机含冷冻期

题目&#xff1a; 题解&#xff1a; func maxProfit(prices []int) int {if len(prices) 0 {return 0}n : len(prices)f0, f1, f2 : -prices[0], 0, 0for i : 1; i < n; i {newf0 : max(f0, f2 - prices[i])newf1 : f0 prices[i]newf2 : max(f1, f2)f0, f1, f2 newf0, n…

【秋招笔试】24-07-27-OPPO-秋招笔试题(后端卷)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 💡 01.二进制反转游戏 问题描述 K小姐…

体验教程:通义灵码陪你备战求职季

本场景将带大家体验在技术面试准备场景下&#xff0c;如何通过使用阿里云通义灵码实现高效的编程算法题练习 、代码优化、技术知识查询等工作&#xff0c;帮助开发者提升实战能力&#xff0c;更加从容地应对面试挑战。主要包括&#xff1a; 1、模拟题练习&#xff1a;精心挑选…

卸载Windows软件的正确姿势,你做对了吗?

前言 今天有小伙伴突然问我&#xff1a;她把软件都卸载了&#xff0c;但是怎么软件都还在运行&#xff1f; 这个问题估计很多小伙伴都是遇到过的&#xff0c;对于电脑小白来说&#xff0c;卸载Windows软件真的真的真的是一件很难的事情。所以&#xff0c;今天咱们就来讲讲&am…

2024最简七步完成 将本地项目提交到github仓库方法

2024最简七步完成 将本地项目提交到github仓库方法 文章目录 2024最简七步完成 将本地项目提交到github仓库方法一、前言二、具体步骤1、github仓库创建2、将远程仓库拉取并合并&#xff08;1&#xff09;初始化本地仓库&#xff08;2&#xff09;本地仓库与Github仓库关联&…

数据可视化工具,免费无限制制作报表

许多企业在报表制作上投入了大量资金&#xff0c;使用各种收费软件&#xff0c;往往只能满足基本需求&#xff0c;且操作复杂&#xff0c;让人感到无比头疼。不过最近我发现之前一直在做数据大屏的山海鲸可视化&#xff0c;现在新增了报表功能&#xff0c;不仅各种功能都可以免…

远程访问mysql数据库的正确打开方式

为了安全&#xff0c;mysql数据库默认只能本机登录&#xff0c;但是在有些时候&#xff0c;我们会有远程登录mysql数据库的需求&#xff0c;这时候应该怎么办呢&#xff1f; 远程访问mysql数据&#xff0c;需要两个条件&#xff1a; 首先需要mysql服务器将服务绑定到0.0.0.0…

【JVM】类加载器和双亲委派模型

什么是类加载器 如果想要了解什么是类加载器就需要清楚一个Java文件是如何运行的。我们可以看下图&#xff1a; 首先要知道操作系统是不能直接运行Java文件的&#xff0c;所以就需要通过JVM将Java文件转换为操作系统可以运行的文件类型&#xff0c;步骤如下&#xff1a; 类加…

入门必读:11个最受欢迎的UI设计网页软件详细评测

即时设计首发UI设计网页软件的轻量化和在线协作已成为当前UI设计网页软件的发展方向。网页UI设计不容易&#xff0c;实用的网页UI制图软件更难找到。随着网络的快速发展&#xff0c;网站迅速崛起&#xff0c;网页UI设计也很流行。UI设计网页软件即时设计是一种协同设计工具&…

MySQL是怎样运行的——第2章 启动选项和系统变量

文章目录 2.1 在命令行上使用选项2.1.1 选项的长形式和短形式 2.2 配置文件中使用选项2.2.1 配置文件的路径2.2.2 配置文件的内容2.2.3 配置文件的优先级 2.3 命令行和配置文件中启动选项的区别2.4 系统变量2.4.1 简介2.4.2 查看系统变量2.4.3 设置系统变量2.4.4 启动选项和系统…

PyQt5新手教程(五万字)

文章目录 PyQt界面开发的两种方式&#xff1a;可视化UI 编程式UI一、PyQt 简介二、PyQt 与 Qt 的蒙娜丽莎三、PyQt 布局管理器&#xff08;Layout Manager&#xff09;3.1、简介3.1.1、布局管理器的定义3.1.2、布局管理器的类型3.1.3、布局管理器的使用方法 3.2、项目实战3.2.…

查物流信息用什么软件

在电子商务日益繁荣的今天&#xff0c;快递物流信息的查询成为了我们日常生活中不可或缺的一部分。无论是网购达人还是商家&#xff0c;都需要随时掌握货物的物流动态。然而&#xff0c;如何快速、准确地查询物流信息却是一个令人头疼的问题。今天&#xff0c;我将为大家介绍一…

AI大模型需要什么样的数据?

数据将是未来AI大模型竞争的关键要素 人工智能发展的突破得益于高质量数据的发展。例如&#xff0c;大型语言模型的最新进展依赖于更高质量、更丰富的训练数据集&#xff1a;与GPT-2相比&#xff0c;GPT-3对模型架构只进行了微小的修改&#xff0c;但花费精力收集更大的高质量…

C++11深度剖析

目录 &#x1f680; 前言&#xff1a;C11简介 一&#xff1a; &#x1f525; 统一的列表初始化&#x1f4ab; 2.1 &#xff5b;&#xff5d;初始化 二&#xff1a; &#x1f525; std::initializer_list &#x1f4ab; 2.1 std::initializer_list是什么类型&#x1f4ab; 2.2 s…

正则采集器之三——前端搭建

前端使用有名的饿了么管理后台&#xff0c;vue3版本vue3-element-admin&#xff0c;首先从gitee中克隆一个vue3-element-admin模板代码vue3-element-admin: Vue3 Element Admin开箱即用的中后台管理系统前端解决方案&#xff0c;然后在此基础上进行开发。 1、修改vite.config.…

【C++】初识类和对象

本篇介绍一下C的自定义类型&#xff0c;类和对象。 1.类的定义 1.1 类定义格式 class 为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;类名随便取&#xff0c;{}中为类的主体&#xff0c;类定义结束时后面的分号不可省略。类主体中内容称为类的成员&#xff1a;类中…

C++开源界面库duilib的使用细节与实战技巧总结(实战经验分享)

目录 1、使用CEditUI编辑框 2、使用CLabelUI或CTextUI的Html文本效果 3、使用CTextUI控件对文字宽度自适应的特性 4、CRichEditUI富文本控件使用注意点 4.1、指定CRichEditUI加在2.0版本的Riched20.dll库 4.2、解决向CRichEditUI中插入文字后显示空白的问题 5、设置窗口…

STL——栈和队列和优先队列

栈和队列和优先队列 概述std&#xff1a;&#xff1a;堆栈核心函数和操作成员函数示例注意事项 std&#xff1a;&#xff1a;队列核心函数和操作成员函数示例注意事项 std&#xff1a;&#xff1a;优先队列底层实现原理效率分析deque双端队列原理块结构&#xff1a;指针管理&am…

企业源代码加密软件|6款好用的源代码加密软件推荐

在软件开发领域&#xff0c;源代码作为企业最核心的资产之一&#xff0c;其安全性直接关系到企业的技术竞争力和商业机密保护。因此&#xff0c;选择一款高效、可靠的源代码加密软件对于企业来说至关重要。以下是企业源代码加密软件的六款推荐&#xff0c;每款软件均具备其独特…

【Android】系统架构、四大组件、结构目录

文章目录 Android系统架构Android四大组件ActivityServiceBroadcast ReceiverContent Provider 两大视图主要结构目录 Android系统架构 linux内核层 为设备的各种硬件提供了底层的驱动&#xff0c;如显示驱动等 系统运行库层 通过C/C库来为android提供主要的特性支持。如SQLit…