后端增删改查的基本应用——一个简单的货物管理系统

news2024/12/23 10:11:51

最终效果,如图所示:

如果想要进行修改操作,可点击某栏修改选项,会在本表格下方弹出修改的具体操作界面(点击前隐藏),并且目前的信息可复现在修改框内。

本篇文章通过该项目将后端和前端结合起来,实现了对数据库的调用,和对数据库的查找,添加,删除,修改。

首先我们应该准备一个简单的前端界面,其中通过$.ajax({})部分完成和后端的交互。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>库存商品管理系统</title>
<script src="js/jquery.js"></script>
<script>
	 $(function(){$.ajax({
	        	url:"goodsServlet",
	        	type:"get", //请求方式 get post
	        	success:function(value){
	        		$("tbody").empty()
	        		console.log(value)
	        		console.log(value.data)
	        		var arr=value.data
	        		for(var i=0;i<arr.length;i++){
	        		$("tbody").append(
	        				"<tr>"+
	        				"<td>"+arr[i].g_name+"</td>"+
	        				"<td>"+arr[i].g_num+"</td>"+
	        				"<td>"+arr[i].g_price+"</td>"+
	        				"<td><input type='button' value='修改' class='update' id='body' index='"+arr[i].g_name+"'><input type='button' value='删除' class='delete' id='body' index='"+arr[i].g_name+"'></td>"+
	        				"</tr>")
	        		}
	        		},
	        	error:function(){
	        		alert("出错啦")
	        	},
	        	})
	        	$("tbody").on("click",".delete",function(){
	        		var g_name =$(this).attr("index")

	        	        $.ajax({  
	        	            url: 'deleteServlet', // 替换为你的后端处理URL  
	        	            type: 'post', // 请求类型post 做修改常用  
	        	            data: {  
	        	                 g_name 
	        	            },  
	        	            success: function(value) {  
	        	                // 请求成功时执行的代码  
	        	                alert(value)
	        	                //页面刷新
	        	                location.reload()
	        	            },  
	        	            error: function() {  
	        	                // 请求失败时执行的代码  
	        	                alert("出错啦") 
	        	            }, 
	        	        })
	        	})
	        	
	        	
	        	
	        	$("#btn").on("click",function(){
	        		$(".add_model").css("display","block")
	        		
	        	})
	        	$("#close").on("click",function(){
	        		$(".add_model").css("display","none")
	        	})
	        	
	        	$("#u_close").on("click",function(){
	        		$(".update_model").css("display","none")
	        	})
	        	
	        	//添加
	        	$("#add").on("click",function(){
	        		//获取框里的值
	        		var name=$(".name").val()
	        		var number=$(".num").val()
	        		var price=$(".price").val()
	        		$.ajax({  
	        	            url: 'addServlet', // 替换为你的后端处理URL  
	        	            type: 'post', // 请求类型post 做修改常用  
	        	            data: {  
	        	                 name,
	        	                 number,
	        	                 price
	        	            },  
	        	            success: function(value) {  
	        	                // 请求成功时执行的代码  
	        	                alert(value)
	        	                //页面刷新
	        	                location.reload()
	        	            },  
	        	            error: function() {  
	        	                // 请求失败时执行的代码  
	        	                alert("出错啦") 
	        	            }, 
	        	        })
	        		
	        	})
	        	
	        	$("tbody").on("click",".update",function(){

		        	$(".add_model").css("display","none")
		        	$(".update_model").css("display","block")
		        		
		        	var u_name=$(this).attr("index")
		        	
		        	$.ajax({  
	        	            url: 'searchidServlet', // 替换为你的后端处理URL  
	        	            type: 'get', // 请求类型post 做修改常用  
	        	            data: {  
	        	                 u_name
	        	            },  
	        	            success: function(value) {  
	        	                // 请求成功时执行的代码  
	        	                var obj=value.data[0]
	        	                console.log(obj)
	        	                
	        	                $(".u_name").val(obj.g_name);
	        	                $(".u_num").val(obj.g_num);
	        	                $(".u_price").val(obj.g_price);
	        	                $("#update").attr("index",obj.g_name)
	        	                //页面刷新
	        	             
	        	            },  
	        	            error: function() {  
	        	                // 请求失败时执行的代码  
	        	                alert("出错啦") 
	        	            }, 
	        	        })
		        	
		        	
		        	})
		        	
		        	$("#update").on("click",function(){
		        		
		        		var u_name=$(".u_name").val()
		        		var u_number=$(".u_num").val()
		        		var u_price=$(".u_price").val()
		        		var id=$(this).attr("index")
		        		alert(id)
		        		$.ajax({  
	        	            url: 'updateServlet', // 替换为你的后端处理URL  
	        	            type: 'post', // 请求类型post 做修改常用  
	        	            data: {  
	        	                 u_name,
	        	                 u_number,
	        	                 u_price,
	        	                 id
	        	            },  
	        	            success: function(value) {  
	        	                // 请求成功时执行的代码  
	        	                alert(value)
	        	                //页面刷新
	        	                location.reload()
	        	            },  
	        	            error: function() {  
	        	                // 请求失败时执行的代码  
	        	                alert("出错啦") 
	        	            }, 
	        	        })
	        		
	        	})
		        		
	        	
	})

	

</script>
<style>
              *{
            padding: 0;
            margin: 0;
        }
        .container{
            width: 10%;
            min-width: 350px;
            margin: 150px auto;
        }
        table{
            border-collapse: collapse;
            margin: 5px auto;
            width: 80%;
            
        }

        thead{
            background: rgb(57, 151, 180);
            border: 2px rgb(14, 77, 160) solid;
        }
        table tbody tr:nth-child(odd){
            background: rgb(192, 230, 244);
            border: 2px rgb(14, 77, 160) solid;
        }

        table tbody tr:nth-child(even){
            background: rgb(197, 209, 225);
            border: 2px rgb(14, 77, 160) solid;
        }

		table tbody #body{
			margin:3px;
		}
		
        table tbody #body:nth-child(1){
            background: rgb(230, 233, 167);

        }
        table tbody #body:nth-child(2){
            background: rgb(227, 182, 223);

        }


        .add_model{
            border: 2px rgb(14, 77, 160) solid;
            padding:15px;
            font-weight: 500;
            margin: 50px ;
            display:none
        }
       .update_model{
            border: 2px rgb(14, 87, 160) solid;
            padding:15px;
            font-weight: 500;
            margin: 50px ;
            display:none
        }
        
        
</style>
</head>
<body>
<div class="container">
    <span>商品名称:
        <input type="text" id="userInput">
        <input type="button" value="查找" class="title" id="search">
        <input type="button" value="添加" class="title" id="btn">
    </span>
    <table border="1">
        <thead>
            <tr>
                <th>商品名称</th>
                <th>数量</th>
                <th>价格</th>
                <th>操作</th>
            </tr>
        </thead>
        
        <tbody>
        
        </tbody>
    </table>
    
    
    <h4 class="add_model">
        <span class="bottom">添加商品</span>
        <br>
        <span>商品名称:<input type="text" class="name"></span>
        <br>
        <span>商品数量:<input type="text" class="num"></span>
        <br>
        <span>商品价格:<input type="text" class="price"></span>
        <input type="button" value="添加商品" class="title" id="add">
        <input type="button" value="取消" class="title" id="close">
    </h4>
    
    <h4 class="update_model">
        <span class="bottom">修改</span>
        <br>
        <span>商品名称:<input type="text" class="u_name"></span>
        <br>
        <span>商品数量:<input type="text" class="u_num"></span>
        <br>
        <span>商品价格:<input type="text" class="u_price"></span>
        <input type="button" value="修改" class="title" id="update">
        <input type="button" value="取消" class="title" id="u_close">
    </h4>
    
    
</div>


</body>
</html>

1.goodsServlet.java

构建servlet文件,在doGet方法做如下操作。该文件用来调用数据库中初始表格。其中 MysqlUtil.getJsonBySql方法为自建包MysqlUtil中的方法将所调出来的数据转化为Json格式

package com.qcby.servlet;

import java.io.IOException;
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 datab.MysqlUtil;


@WebServlet("/goodsServlet")
public class goodsServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public goodsServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		 //解决中文乱码
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        //设置后端给前端返回的数据为json格式(大量数据)
        response.setContentType("text/json;charset=utf-8");
		//接收参数
		 //查找
		String sql="SELECT * from goods";
		String[] colums= {"g_name","g_num","g_price"};
		String res=MysqlUtil.getJsonBySql(sql, colums);
		
		 //后端给前端返回数据
        response.getWriter().write(res);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

2.deleteServlet.java

该文件用来实现删除功能。同样的 MysqlUtil.del方法为自建包MysqlUtil中的方法,用于执行删除语句(当然也可以自己写),这个方法会返回一个int型 即修改的行数,这个数可以判断删除操作是否成功执行。

package com.qcby.servlet;

import java.io.IOException;
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 datab.MysqlUtil;

/**
 * Servlet implementation class deleteServlet
 */
@WebServlet("/deleteServlet")
public class deleteServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public deleteServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
	    response.setCharacterEncoding("utf-8");
		
		System.out.println("post");
		
		String g_name=request.getParameter("g_name");
		
		String sql="DELETE FROM goods WHERE g_name='"+g_name+"'";
		int num=MysqlUtil.del(sql);
		
		String res="删除失败";
		if(num>0) {
			res="删除成功";
		}
		 response.getWriter().write(res);	
	}

}

3.searchidServlet.java & updateServlet.java

要实现在修改时弹框的复现功能,就需要接受data域所传参数,并进行展示,在此插入searchidServlet.java,如下所示,本文件配合前端jQuery方法用于获取在 update操作中所需要复现的内容

package com.qcby.servlet;

import java.io.IOException;
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 datab.MysqlUtil;

/**
 * Servlet implementation class searchidServlet
 */
@WebServlet("/searchidServlet")
public class searchidServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public searchidServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//解决中文乱码
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        //设置后端给前端返回的数据为json格式(大量数据)
        
        response.setContentType("text/json;charset=utf-8");
		
		String u_name=request.getParameter("u_name");
		
		String sql="SELECT * FROM goods WHERE g_name=\""+u_name+"\"";
		String[] colums= {"g_name","g_num","g_price"};
		String res=MysqlUtil.getJsonBySql(sql, colums);
		
		response.getWriter().write(res);

	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}
package com.qcby.servlet;

import java.io.IOException;
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 datab.MysqlUtil;

/**
 * Servlet implementation class updateServlet
 */
@WebServlet("/updateServlet")
public class updateServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public updateServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		 //解决中文乱码
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
		
		//接收参数
		String name=request.getParameter("u_name");
		String number=request.getParameter("u_number");
		String price=request.getParameter("u_price");
		String id=request.getParameter("id");
		
		//修改
		String sql="UPDATE goods SET g_name=\""+name+"\",g_num="+number+",g_price="+price+" WHERE g_name=\""+id+"\"";
		int num=MysqlUtil.update(sql);
		
		String res="修改失败";
		if(num>0) {
			res="修改成功";
		}
		 response.getWriter().write(res);	
	}

}

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

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

相关文章

java内存控制

Java 内存控制是一个相对复杂但至关重要的主题&#xff0c;它涉及到如何高效地管理Java应用程序中的内存资源。在Java中&#xff0c;内存管理主要由Java虚拟机&#xff08;JVM&#xff09;负责&#xff0c;包括内存的分配和回收。尽管如此&#xff0c;作为开发者&#xff0c;我…

2025年5月高项,从0备考信息系统项目管理师 | 备考经验全攻略分享

在逐步摸索备考信息系统项目管理师的过程中&#xff0c;我总结了很多关于班课资料和学习经验&#xff0c;现在与大家分享。&#xff08;全文约3k字&#xff0c;阅读用时约5min&#xff09; 这篇分享帖不仅告诉你关于备考信息系统项目管理师实用的班课资料&#xff0c;还有学习…

Win11 23H2 10月正式版:22631.4317 镜像免费下载!

今日&#xff0c;系统之家小编给您带来2024年10月最新更新的Windows11 23H2正式版系统下载&#xff0c;该版本系统基于微软官方最新Windows11 23H2 22631.4317专业版展开离线制作&#xff0c;没有病毒残留&#xff0c;且能完美支持新老机型&#xff0c;安装后&#xff0c;系统版…

【概率论】泊松分布

泊松分布 若 &#xff0c;则 归一性 例子 泊松分布多出现在当X表示一定时间或一定空间内出现的事件的个数这种场合&#xff0c;如在一定时间内某交通路口所发生的事故的个数。 将泊松分布假设为二项分布 假设条件: &#xff08;1&#xff09;泊松分布一般为一段时间或一…

★ 算法OJ题 ★ 二分查找算法

Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;塞尔达将和大家一起做几道二分查找算法算法题 ~ ❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️ 澄岚主页&#xff1a;椎名澄嵐-CSDN博客 算法专栏&#xff1a;★ 优选算法100天 ★_椎名澄嵐的博客-CSDN博客…

STM32 SPI串行总线

目录 STM32的SPI通信原理 SPI串行总线概述 SPI串行总线互连方式 STM32F1 SPI串行总线的工作原理 SPI串行总线的特征 SPI串行总线的内部结构 SPI串行总线时钟信号的相位和极性 STM32的SPI接口配置 STM32的SPI接口数据发送与接收过程 SPI的HAL 驱动函数 STM32的SPI通信…

靶标弹孔检测系统源码分享

靶标弹孔检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

apt update报错:ModuleNotFoundError: No module named ‘apt_pkg‘(可能是默认python版本被改坏了)

文章目录 错误信息分析1. 确保 apt_pkg 模块已安装2. 检查 Python 版本3. 重新配置 Python4. 修复损坏的依赖5. 检查环境变量 尝试 错误信息 (base) rootkyai:/ky/tml/ky_ai_get_server_info# apt update 获取:1 file:/var/cuda-repo-cross-aarch64-ubuntu2004-11-4-local InR…

【Python】如何让SQL Server像MySQL一样拥有慢查询日志(Slow Query Log慢日志)

如何让SQL Server像MySQL一样拥有慢查询日志&#xff08;Slow Query Log慢日志&#xff09; SQL Server一直以来被人诟病的一个问题是缺少了像MySQL的慢日志功能&#xff0c;程序员和运维无法知道数据库过去历史的慢查询语句。 因为SQLServer默认是不捕获过去历史的长时间阻塞…

inBuilder低代码平台新特性推荐-第二十五期

今天来给大家带来的是inBuilder低代码平台社区版中的特性推荐系列第二十五期——选人组件扩展&#xff01; 一、概述 inBuilder低代码平台社区版的开发过程中&#xff0c;选人组件支持tab页中增加扩展页面&#xff0c;由二开人员根据业务场景实现自定义取数接口和页面展示形式…

【笔记】济南,天命人,春秋

孤独而高傲的济南人 浩克山东知天命热爱的sensei 浩克山东 哦哦&#xff0c;最高的大葱也是济南的了&#xff0c;这大葱&#xff0c;比一般人要高呢&#xff0c;尽管济南的朋友们也都个子不矮。。能想像的到两米高的米库。。。。 然而在这块地界&#xff0c;遇到个人&#xf…

基于STM32的简易交通灯proteus仿真设计(仿真+程序+设计报告+讲解视频)

基于STM32的简易交通灯proteus仿真设计(仿真程序设计报告讲解视频&#xff09; 仿真图proteus 8.9 程序编译器&#xff1a;keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;C0091 **1.**主要功能 功能说明&#xff1a; 以STM32单片机和数码管、LED灯设计简易交通…

版本控制系统Helix Core的常见使用误区及解决办法、实用工具及新功能介绍

日前&#xff0c;Perforce携手合作伙伴龙智一同亮相Unreal Fest 2024上海站&#xff0c;分享Helix Core版本控制系统及其协作套件的强大功能与最新动态&#xff0c;助力游戏创意产业加速前行。 Perforce解决方案工程师Kory Luo在活动主会场&#xff0c;带来《Perforce Helix C…

QT安装成功后-在创建项目时,发现仅有项目名文件

&#xff08;1&#xff09;QT安装成功后&#xff0c;发现仅有项目名文件其他可编辑文件缺失 &#xff08;2&#xff09;点击文件名左上角的感叹号显示【No kits are enabled for this project. Enable】 小编在尝试多次后发现&#xff0c;可以通过以下方式解决&#xff1a;QT软…

YOLO11改进|编码器篇|引入AIFI混合特征编码器

目录 一、【AIFI】混合编码器机制1.1【AIFI】混合编码器介绍1.2【AIFI】核心代码 二、添加【AIFI】机制2.1STEP12.2STEP22.3STEP32.4STEP4 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、【AIFI】混合编码器机制 1.1【AIFI】混合编码器介绍 【AIFI】在论文中并没有结构图…

CVPR 2024最佳论文候选-pixelSplat论文解读

目录 一、概述 二、相关工作 1、单场景下的视角合成 2、基于先验的三维重建和视图合成 3、多视图几何测量 三、3DGS的缺点 1、容易陷入最小值 2、需要大量输入图像 3、尺度模糊性 四、pixelSplat 1、解决尺度模糊性&#xff08;深度信息生成&#xff09; 2、编码器…

QT实现QMessageBox中文按钮

这是我记录Qt学习过程心得文章的第二篇&#xff0c;主要是为了方便QMessageBox弹出框的使用&#xff0c;通过自定义的方式&#xff0c;将其常用的功能&#xff0c;统一封装成一个函数&#xff0c;还是写在了Skysonya类里面。 实现代码&#xff1a; //中文提示对话框 bool Sky…

线程(四)线程的同步——条件变量

文章目录 线程线程的同步和互斥线程同步--条件变量什么是线程同步示例--条件变量的使用示例--使用两个线程对同一个文件进行读写示例--一个读者一个写者使用条件变量来实现同步 线程 线程的同步和互斥 线程同步–条件变量 是一个宏观概念&#xff0c;在微观上包含线程的相互…

新160个crackme - 078-CodeZero.1

运行分析 需要破解Serial PE分析 VB程序&#xff0c;32位&#xff0c;无壳 静态分析&动态调试 使用VB Decompiler进行分析找到check按钮事件&#xff1a; Form1 -> Command1_Click_4055F4发现直接爆出了Serial55555 验证成功

【xilinx-versal】【Petalinux】I2C驱动开发问题记录

问题 调试中发现系统起来后无I2C设备。 仔细查找后发现没有配置versal的I2C控制器。 解决方法 打开versal的I2C控制器的配置 起来后I2C设备注册成功