目录
一、程序分析构思
二、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>
|