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

news2025/7/5 15:04:32

 技术支持: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 debugging
        e1.printStackTrace();
        throw new Exception("Failed to save goods: " + e1.getMessage(), e1);
    } finally {
        // Close PreparedStatement and Connection in finally block
        if (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;
    }

    @Override
    public 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.coloradmin.cn/o/1978227.html

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

相关文章

cjson

文章目录 概述编译cjson_test 小结 概述 在网络传输中&#xff0c;网络数据序列化&#xff0c;常用的有那么几种&#xff0c;json&#xff0c;protobuf都是很常用的&#xff0c;这一篇来写下json。 Json常用的有几个&#xff0c;rapidjson&#xff0c;jsoncpp&#xff0c;还有…

HarmonyOS开发:路由容器Navigation的使用详解

​目录 前言路由容器NavigationNavigation组成路由跳转操作Navigation下的页面生命周期最后 前言 众所周知&#xff0c;HarmonyOS作为华为推出的新一代操作系统&#xff0c;其开发框架提供了全新的能力和组件&#xff0c;以支持跨平台应用开发&#xff0c;越来越多的开发者加…

红黑树实现详解

实践意义 在各方面&#xff0c;红黑树要比AVL树性能更好&#xff0c;用途也更广泛 map&set底层都主要靠红黑树 概念 性质 插入时&#xff0c;抽象图 cur为新插入 插入时颜色更新逻辑图 板书

bugku-web-never_give_up

解题思路 F12查看请求和响应&#xff0c;查找线索 相关工具 base64解码URL解码Burp Suit抓包 页面源码提示 <!--1p.html--> 2. 去访问这个文件&#xff0c;发现直接跳转到BUGKU首页&#xff0c;有猫腻那就下载看看这个文件内容吧 爬虫下载这个文件 import requests …

20240804 每日AI必读资讯

25亿独角兽CEO带头跑路&#xff0c;携30员工卖身谷歌&#xff01;AI大佬&#xff1a;AGI泡沫几周就要破 - CEO一并带走的&#xff0c;还有Character.AI负责模型训练和语音AI的员工&#xff0c;也就是130名员工中的30人。他们将加入谷歌&#xff0c;参与Gemini AI项目。 - Cha…

【C++学习第19天】二分图

一、如何判断一个图是二分图&#xff1f; 二、代码 1、判断是否为二分图 #include <iostream> #include <algorithm> #include <cstring>using namespace std;const int N 200010;int n, m; int h[N], e[N], ne[N], idx; int color[N];void add(int a, in…

JavaScript 继承百花齐放:从原型链到 ES6 类

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热爱技术和分享&#xff0c;欢迎大家交流&#xff0c;一起学习进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 在 JavaScript 中&#xff0c;继承是一个重要的知识点&#xff0c;上篇文章中我们已…

【Java】Java Swing 图书管借阅管理系统(源码+论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

python rsa如何安装

Python中的一些模块是用一个包管理器来发布的&#xff0c;RSA模块就是&#xff0c;所以首先需要安装setup tools工具。 1、下载文件&#xff1a;ez_setup.py 2、安装&#xff1a; sudo python ez_setup.py 3、下载RSA安装包&#xff1a;rsa-3.1.1-py2.7.egg 4、安装RSA&…

牛客JS题(二十一)数组扁平化

注释很详细&#xff0c;直接上代码 涉及知识点&#xff1a; 递归flat字符串操作正则表达式替换 题干&#xff1a; 我的答案 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /></head><body><script&…

Dubbo源码深度解析(中)

接着《Dubbo源码深度解析(上)》继续讲&#xff0c;上篇博客主要讲Dubbo提供的三个注解的作用&#xff0c;即&#xff1a;EnableDubbo、DubboComponentScan、EnableDubboConfig。其中后两个注解是在EnableDubbo上的&#xff0c;因此在启动类上加上EnableDubbo注解&#xff0c;等…

数据分析模型:洞察数据背后的奥秘

数据分析模型&#xff1a;洞察数据背后的奥秘 事件分析模型通过对用户行为事件的深入剖析&#xff0c;能够了解用户在产品上的具体行为&#xff0c;为产品优化和营销策略提供了有力依据。漏斗分析模型则专注于用户转化流程&#xff0c;帮助找出业务流程中的薄弱环节&#xff0c…

[Meachines] [Easy] Sense PFSense防火墙RCE

信息收集 IP AddressOpening Ports10.10.10.60TCP:80,443 $ nmap -p- 10.10.10.60 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 80/tcp open http lighttpd 1.4.35 |_http-title: Did not follow redirect to https://10.10.10.60/ |_http-server-header…

zlm-openRtpServer使用

http://127.0.0.1/index/api/openRtpServer?port50253&tcp_mode1&stream_idtest123&secretLSAjqhPDsC0IcL27hI6U8heTxgnTlZlW使用getRtpInfo查看这个流的情况&#xff0c;注意只有这个端口在接受流的时候&#xff0c;才会返回数据 http://127.0.0.1/index/api/ge…

【文献阅读】TAM: Topology-Aware Margin Loss for Class-Imbalanced Node Classification

Abstract 在类别不平衡的图数据中学习无偏的节点表示是一项具有挑战性的任务&#xff0c;因为相邻节点之间存在相互作用。现有研究的共同点在于&#xff0c;它们根据少数类节点的总体数量“作为一个整体”进行补偿&#xff08;忽略了图中的节点连接&#xff09;&#xff0c;这…

理解<共轭复数乘法,复数乘法,复数除法>

目录 复数乘法共轭复数乘法的理解复数除法 复数乘法 共轭复数乘法的理解 共轭复数乘法&#xff1a;可以理解为滤波&#xff0c;计算两序列的相关。即一个序列固定&#xff0c;另一个序列进行滑动计算该点的累积和。因为傅里叶变换的卷积定理&#xff0c;时域卷积对于频域相乘。…

web漏洞-知识点详解

先放张图&#xff01;右边漏洞比左边漏洞更重要&#xff01;右边漏洞更多&#xff01;重点讲述右边漏洞&#xff01; sql注入 危害情况&#xff1a;可以获取网站数据库中的数据&#xff0c;如果数据中有敏感信息&#xff0c;比如管理员账号密码&#xff0c;就可以登录后台 漏…

学生管理系统之更新和删除、筛选

学生管理系统之更新和删除 建立新的窗口 添加组件 进行布局 使用Widget把二个放在一块,作为一列,然后全选进行栅格布局,最后添加弹簧进行微调。 编写增加的槽函数 在主函数中调用对话框

CC++内存魔术:掌控无形资源

hello,uu们,今天呢我们来详细讲解C&C的内存管理,好啦,废话不多讲,开干 1:C/C内存分布 2:C语言中动态内存管理方式:malloc/calloc/realloc/free 3:C内存管理方式 3.1:new/delete操作内置类型 3.1.1:代码1 3.1.2:代码2 3.2:new和delete操作自定义类型 3.2.1:C语言创建…

初识增强现实(AR)

初识增强现实&#xff08;AR&#xff09; 笔记来源&#xff1a; 1.2023年中国增强现实&#xff08;AR&#xff09;行业研究报告 2.wiki/Augmented reality 3.In-Depth Review of Augmented Reality: Tracking Technologies, Development Tools, AR Displays, Collaborative AR…