IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> web后端servlet修改数据—前端使用带文件上传的form表单,Ajax的FormData申请,后端servlet直接调用写的工具类实现对数据库信息的修改。 -> 正文阅读

[大数据]web后端servlet修改数据—前端使用带文件上传的form表单,Ajax的FormData申请,后端servlet直接调用写的工具类实现对数据库信息的修改。

目录

一、程序分析构思

二、servlet测试代码

三、工具类FormPostUpdateUtil


一、程序分析构思

????????上一篇博客谈到了从前端接收带文件的数据,Ajax使用FormData接收fomr表单数据,servlet直接调用编写的工具 FormPostInsertUtil 来接收前端数据插入到数据库。整个过程模块化,使得代码结构清晰,也为下次使用写好的工具,重复使用。

? ? ? ? 这篇博客继续编写修改数据库的数据,也是同样的思路,部分代码不一样。

二、servlet测试代码

 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("进入修改updateservlet");
        String path1="D:\\Web后端开发技术\\uploadFile";	 //指定保存上传文件的服务器位置
        String tablname1="user";//指定要操作的数据库表名
       //可以使用session、cookie获取当前用户名,这里我测试直接赋值
        String username1="123";
        new FormPostUpdateUtil().getParmUpdate(request,response,path1,tablname1,username1);
    }

三、工具类FormPostUpdateUtil

/*
* 接收前端被修改的数据再一步到位去修改数据库中的数据
* servlet测试代码
* String path1="D:\\大三下\\Web后端开发技术\\uploadFile";	 //指定保存上传文件的服务器位置
* String tablname1="user";//指定要操作的数据库表名
* //可以使用session、cookie获取当前用户名,这里我测试直接赋值
* String username1="123";
* new FormPostUpdateUtil().getParmUpdate(request,response,path1,tablname1,username1);
* */
package com.jdbc.utils;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.mysql.jdbc.Connection;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;

/*
* path1:文件保存路径
* tablname1:表名
* username1:update查询语句中的where的限制条件,我预设每次修改的数据都是正在修改的用户的数据
* */

public class FormPostUpdateUtil {
    public  void getParmUpdate(HttpServletRequest request, HttpServletResponse response, String path1, String tablname1,String username1) {
        System.out.println("进入servlet");
        try {
            request.setCharacterEncoding("UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        response.setContentType("text/html;Charset=UTF-8");
        String sqlFieldValue=""; //这个串用于保存sql的update命令中要修改的字段列名和值,一键搞定
        DiskFileItemFactory factory1=new DiskFileItemFactory();//来源于:commons-fileupload-1.4.jar
        factory1.setSizeThreshold(1024*1024*20);//设置内存中用字节数
        ServletFileUpload uploadf1=new ServletFileUpload(factory1); //创建文件工厂
        uploadf1.setHeaderEncoding("utf-8");//只能解决文件名或路径中汉字乱码
        java.util.List<FileItem> fileItemList;
        try {
            fileItemList = uploadf1.parseRequest(request);
            for(FileItem fileItem :fileItemList )
            {
                if(fileItem.isFormField())  //表示是普通参数,不是文件.下面为拼凑sql命令insert串做准备
                {
                    sqlFieldValue=sqlFieldValue+fileItem.getFieldName()+"=";//fileItem.getFieldName()获取input标签的name名字
                    System.out.println(fileItem.getFieldName());
                    try {
                        sqlFieldValue=sqlFieldValue+"'"+fileItem.getString("utf-8")+"',";//fileItem.getString("utf-8")获取值
                        System.out.println(fileItem.getString("utf-8"));
                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                    }	 //要加编码,否则取出来汉字可能是乱码
                }

				 /*fileItem.getName()有些浏览器可以直接获取到文件名,不需要处理
				 但是如果有的浏览器获取的是带有路径的名字,这里要处理后才可以拼接fileinputnames*/

                else //当前项是文件流,要把数据写入磁盘
                {
                    String tempFileinputname=fileItem.getFieldName();//文件标签名
                    String tempFilename=fileItem.getName();//文件名

                    //处理文件名字
                    int po=tempFilename.lastIndexOf("\\"); //只保留后面的文件名,不要前面路径
                    if(po!=-1)//说明找到了右斜杠\
                    { tempFilename=tempFilename.substring(po+1);}
                    //处理文件名完毕

                    if(tempFilename==""||tempFilename.equals(""))//如果没有上传文件,什么也不做
                    {  }
                    //有上传文件就添加sql语句,并写入磁盘
                    else{
                        sqlFieldValue=sqlFieldValue+tempFileinputname+"=";//fileItem.getFieldName()获取input标签的name名字
                        sqlFieldValue=sqlFieldValue+"'"+tempFilename+"',";//所有上传文件的名字
                        savefile(fileItem, path1);//把上传文件写入磁盘中,即保存上传文件
                    }
                }
            }
            //准备把以上数据插入到数据库中; 调用 inserttable()函数
            UpdateTable(tablname1, sqlFieldValue, username1);//向指定表,插入指定字段名,指定值,上传文件字段名,上传文件名字
        } catch (FileUploadException e) {
            e.printStackTrace();
        }
    }


        /*
         * 关于fileItem.getName()获取文件名字有个注意事项
         * 网上说有的浏览器获取的直接就是文件的名字
         * 而有的浏览器获取的是带有路径的文件名字
         * 为了两者兼容,直接使用处理带路径的文件名字的方法
         * */
        private void savefile (FileItem fileItem, String path1){
            System.out.println("来了老弟,要保存文件了");
            String fname1;
            fname1 = fileItem.getName();
            //去掉前面的路径,只要后面干净文件名。
            int po = fname1.lastIndexOf("\\");
            if (po != -1)//说明找到了右斜杠\
            {
                fname1 = fname1.substring(po + 1);
            }
            if (fileItem.getSize() > 1024 * 1024 * 20) {
                return;
            } //文件太大了,拒绝上传
            if (fname1 == null || fname1.equals("") || fileItem.getSize() == 0) {
            }//那说明没有上传文件过来,这样处理 好处是,用户可传可不传文件,无所谓
            else {
                File savefile1 = new File(path1, fname1);
                try {
                    fileItem.write(savefile1);//可以使用系统时间数字避免文件名重复(我另一篇文件上传的方法中有)
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

    /*
     * 参数:
     * tablename:表名
     * sqlFieldValue:sql语句中修改字段和值
     * username:预设查询限定条件where为用户名相同的
     */
    private  void  UpdateTable(String tablename, String sqlFieldValue, String username1) {
        System.out.println("开始到数据库修改数据");
        if(sqlFieldValue.length()<1||sqlFieldValue.length()<1) //那说明前端没有数据上传
        {   }
        else { //说明表单中有数据上传 ,这样才有必要写到数据库中。这种偷懒 方法前提是HMTL表单中的控件name要与数据库表列名相同才行。
            String sqlstr1="";
            //要去掉字段名串最后多的一个逗号
            sqlFieldValue=sqlFieldValue.substring(0,sqlFieldValue.length()-1);
            sqlstr1="update "+tablename+" set "+sqlFieldValue+" where username='"+username1+"'";//预设查询限定条件为用户名相同的数据
            System.out.println(sqlstr1);
            Connection con1=(Connection) JdbcConUtil.getConnection();
            Statement st1;
            try {
                st1 = con1.createStatement();
                st1.execute(sqlstr1);
                JdbcConUtil.close(st1, con1);
                System.out.println("修改数据完毕");
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

四、html代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>论坛首页</title>
    <script src="./jquery-3.4.1.min.js"></script>
</head>
<body>
<h1>欢迎来到八杯水论坛网站</h1>
<form action="updateServlet" method="POST" id="form1" enctype="multipart/form-data">
    用户名:<input type="text" name="username" id="username"><br>
    密码:<input type="password" name="password" id="password">
</form>
<button id="updateBtn">修改</button>

<script>
    $(document).ready(function (){
        $("#updateBtn").click(function () {
            var data0 = new FormData($("#form1")[0]);
            $.ajax({
                type:"post",
                url:"updateServlet",
                cache: false,
                data: data0,
                processData: false,
                contentType: false,
                dataType:"json", //是后端传回来的数据类型,不是前端传过去的数据类型
                success:function(re)
                {      }
            })
        })
    })
</script>
</body>
</html>

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-04-26 11:47:11  更:2022-04-26 11:50:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:42:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码