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>

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前端代码: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>上传文件进度</title> <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script> </head> <body> <form id="uploadForm" enctype="multipart/form-data"> <label for="file">选择文件:</label> <input type="file" name="file" id="file"><br> <input type="button" value="上传" onclick="uploadFile()"> </form> <div id="progress"></div> <script> function uploadFile() { var formData = new FormData($("#uploadForm")[0]); $.ajax({ url: "upload", type: "POST", data: formData, xhr: function() { var xhr = $.ajaxSettings.xhr(); if (xhr.upload) { xhr.upload.addEventListener("progress", function(e) { if (e.lengthComputable) { var progress = e.loaded / e.total * 100; $("#progress").text("上传进度: " + progress.toFixed(2) + "%"); } }, false); } return xhr; }, processData: false, contentType: false, success: function(data) { alert(data); } }); } </script> </body> </html> ``` 后端代码(使用Java Servlet实现): ```java import java.io.File; import java.io.IOException; import java.io.PrintWriter; 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 javax.servlet.http.Part; @WebServlet("/upload") public class FileUploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/plain;charset=UTF-8"); PrintWriter out = response.getWriter(); //获取上传文件 Part filePart = request.getPart("file"); String fileName = filePart.getSubmittedFileName(); String fileType = fileName.substring(fileName.lastIndexOf(".")); String filePath = "upload/" + fileName; File file = new File(filePath); //上传文件 filePart.write(filePath); //返回上传结果 out.write("上传成功!"); out.flush(); out.close(); } } ``` 这里使用了Java Servlet来处理上传请求,通过request.getPart获取上传的文件,将文件保存到指定路径中并返回上传结果。前端代码与之前的类似,通过ajax上传表单数据并监听上传进度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值