简单的ajax上传商品功能使用SevletFileUpload和FormData

目录

  • 1、先上图
  • 2、使用ServletFileUpload读取前端发送过来的请求
    • 2.1、maven依赖
    • 2.2、SevletFileUpload的一些基本操作
  • 3、前端代码
  • 4、 Servlet
    • 4.1、后端返回商品列表
    • 4.2、添加商品
    • 4.3、商品DAO层
      • 4.3.1、 ProductDao
      • 4.3.2、ProductDaoimpl

1、先上图

在这里插入图片描述

2、使用ServletFileUpload读取前端发送过来的请求

2.1、maven依赖

maven依赖

	<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.1</version></dependency>

2.2、SevletFileUpload的一些基本操作

SevletFileUpload的一些基本操作
1.form表单的method必须是post
2.form表单的enctype必须是multipart/form-data 以二进制字节流
进行提交 传统接收参数的方式无效
DiskFileItemFactory:
void setSizeThreshold(int sizeThreshold) 设置缓冲区大小,默认10KB 超出将使用临时文件上传
void setRepository(File repository) 设置临时文件路径
ServletFileUpload:核心操作类
public void setSizeMax(long sizeMax)设置总文件的大小
public void setFileSizeMax(long fileSizeMax):设置单个文件的大小
public List<FileItem> parseRequest(javax.servlet.http.HttpServletRequest req) 解析请求正文内容
public static boolean isMultipartContent(HttpServletRequest req)//判断enctype
setProgressListener(new ProgressListener(function(三参数))) 具体内容往下看
FileItem:输入类:
void write(File file): write方法将FileItem对象中的内容保存到某个指定的文件中。如果FileItem对象中的内容是保存在某个临时文件中,该方法完成后,临时文件可以会被删除。该方法也可以将普通表单字段保存在一个文件中,但最主要的用途是把上传的文件内容保存在本地文件系统中。
boolean isFormField():判断是否是普通字段

普通字段:

String getFieldName():获取普通字段的字段名
String getString():获取普通字段的值

文件字段:

String getContentType() 获得文件类型
String getName():获取上传文件名
InputStream getInputStream()以流的形式返回上传文件的主体内容
void delete()删除临时文件

字段乱码的问题

普通字段可以使用item.getString(“GBK”)或者 new String(item.getString().getBytes(“iso-8859-1”),“utf-8”)
如果是文件名乱码的话,就是设置request编码 request.setCharacterEncoding(“utf-8”);

文件名重复问题

一般采用UUIDrandomUUID()来代替文件名防止乱码

上传进度检查

upload.setProgressListener(new ProgressListener(){
参数一:已上传的字节数
参数二:总字节数
参数三:第几项
@Override
public void update(long arg0, long arg1, int arg2) {
// TODO Auto-generated method stub
System.out.println(arg0+" "+arg1+" "+arg2);
}
});

3、前端代码

form表单仅仅只是为了解决JavaScript设置请求头multipart/form-data的边界问题,而不是为了用form表单来提交数据。所以我们需要将form表单的提交事件删除。我们只需要设置onsubmit="return false;"这样就可以使form表单的提交事件不起作用。我们使用FormData这个类来封装表单中的数据,这个数据可以同时封装文件和普通表单字段,以key,value的形式表示,其中key为表单中设置的name属性。

FormData的使用方法
在表单中key 就是属性name 的值
new FormData(表单对象) 直接封装表单对象中的数据
append(String key,String value) 添加属性
set(String key,String value)修改属性
delete(String key) 删除属性

<body>
<div class="insert"><form enctype="multipart/form-data" onsubmit="return false;" id="form1"><div><input type="text" placeholder="请输入商品名称" class="product_name" name="product_name"></div><div><input type="text" placeholder="请输入商品价格" class="price" name="price"></div><div><label for="file">上传图片</label><input type="file" hidden="hidden" id="file" name="imgurl"></div><div class="btn">添加</div></form></div>
<table><tr><th>商品名称</th><th>价格</th><th>图片路径</th><th>delete</th></tr>
</table>
</body>
<script>var table = document.querySelector("table");var btn=document.querySelector(".btn");var name=document.querySelector(".product_name");var price=document.querySelector(".price")var file=document.querySelector("#file");function  cleartable() {table.innerHTML=`<tr><th>商品名称</th><th>价格</th><th>图片路径</th><th>delete</th></tr>`}function responsetable(){//请求后端返回商品列表var xmlHttpRequest = new XMLHttpRequest();xmlHttpRequest.open("POST","productbgServlet",true);xmlHttpRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");xmlHttpRequest.send();xmlHttpRequest.onreadystatechange=function () {var Text = xmlHttpRequest.responseText;var data = JSON.parse(Text);console.log(data);cleartable();data.forEach(function (item,index) {if(xmlHttpRequest.status==200 &&xmlHttpRequest.readyState==4){var tr = document.createElement("tr");tr.innerHTML+=`<td>${item.product_name}</td><td>${item.price}</td><td>${item.imgurl}</td><td class="del">删除</td>`table.appendChild(tr);}})}}window.onload=function () {responsetable();}btn.onclick=function () {//添加商品var formData = new FormData(document.querySelector("#form1"));var xhr=new XMLHttpRequest();xhr.open("POST","insertProductServlet",true)xhr.send(formData)xhr.onreadystatechange=function () {if(xhr.status==200 && xhr.readyState==4){var responseText = xhr.responseText;console.log(responseText);if(responseText=="true"){responsetable();}else if(responseText=="false"){alert("插入失败")}}}}
</script>

4、 Servlet

4.1、后端返回商品列表

package com.Servlet;import com.DAO.Impl.ProductDaoimpl;
import com.DAO.ProductDao;
import com.domain.product;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;/*** 查询所有商品* 返回给主页用于渲染商品*/
@WebServlet("/productPageServlet")
public class productPageServlet extends HttpServlet {@Overridepublic void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {ProductDao productDao=new ProductDaoimpl();final List<product> products = productDao.selAll();GsonBuilder builder=new GsonBuilder();final Gson gson = builder.create();final String json= gson.toJson(products);
//        System.out.println(json);response.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");PrintWriter out=response.getWriter();out.write(json);out.close();}
}

4.2、添加商品

package com.Servlet;import com.DAO.Impl.ProductDaoimpl;
import com.DAO.ProductDao;
import com.domain.product;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;/*** 前台上传商品信息和商品图片* 解析信息与图片*/
@WebServlet("/insertProductServlet")
public class insertProductServlet extends HttpServlet {@Overridepublic void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {ProductDao productDao=new ProductDaoimpl();request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");response.setCharacterEncoding("utf-8");final PrintWriter out = response.getWriter();final DiskFileItemFactory factory = new DiskFileItemFactory();ServletFileUpload fileUpload=new ServletFileUpload(factory);fileUpload.setHeaderEncoding("utf-8");Map<String,String> map=new HashMap<>();final boolean flag = fileUpload.isMultipartContent(request);//判断是否encType="multipart/form-data"System.out.println(flag);try{final List<FileItem> fileItems = fileUpload.parseRequest(request);System.out.println(fileItems);for(FileItem item:fileItems){if(item.isFormField()){//不是文件上传map.put(item.getFieldName(),new String(item.getString().getBytes("iso-8859-1"),"utf-8"));}else{final InputStream inputStream = item.getInputStream();final String contentType = item.getContentType();System.out.println(contentType);String wjj=request.getServletContext().getRealPath("res/productimg");//文件夹路径String filename= item.getName();String name= UUID.randomUUID()+filename.substring(filename.indexOf("."),filename.length());String url=wjj+"/"+name;url=url.substring(url.indexOf("res"),url.length());map.put("imgurl",url);System.out.println(name);final FileOutputStream fileOutputStream = new FileOutputStream(wjj+"/"+name);byte[] bytes=new byte[1024];int len=0;while((len=inputStream.read(bytes))!=-1){fileOutputStream.write(bytes,0,len);}}}}catch (Exception e){e.printStackTrace();}System.out.println(map);final product product = new product(map.get("product_name"),map.get("price"),map.get("imgurl"));if(productDao.insert(product)==1){out.write("true");}else{out.write("false");}}
}

4.3、商品DAO层

4.3.1、 ProductDao

package com.DAO;import com.domain.product;import java.util.List;public interface ProductDao {List<product> selAll();int insert(product p);int delOne(String id);}

4.3.2、ProductDaoimpl

package com.DAO.Impl;import com.DAO.ProductDao;
import com.domain.product;
import com.jdbc.jdbcUtil;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;public class ProductDaoimpl implements ProductDao {static private Connection conn = jdbcUtil.conn;static private PreparedStatement pst = null;@Overridepublic List<product> selAll() {List<product> list=new ArrayList<>();try{pst=conn.prepareStatement("select *from product");final ResultSet resultSet = pst.executeQuery();while(resultSet.next()){list.add(new product(resultSet.getString(1),resultSet.getString(2),resultSet.getString(3),resultSet.getString(4)));}}catch (Exception e){e.printStackTrace();}return list;}@Overridepublic int insert(product p) {try{pst=conn.prepareStatement("insert into product values(null,?,?,?)");pst.setString(1,p.getProduct_name());pst.setString(2,p.getPrice());pst.setString(3,p.getImgurl());final int i = pst.executeUpdate();return i;}catch ( Exception e){e.printStackTrace();}return 0;}@Overridepublic int delOne(String id) {return 0;}public static void main(String[] args) {
//        final List<product> products = new ProductDaoimpl().selAll();
//        System.out.println(products);}
}

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

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

相关文章

JavaScript实现数据分页

目录分页效果图如何分页代码分页 当表单数据过多时&#xff0c;比较不容易浏览。这个时候就需要分页查看。 效果图 如何分页 1、首先确定总记录条数 len 2、单页浏览条数 page_number 3、页数 Total_pageslen % page_number 0 ? len / page_number : len / page_number 1;…

日均互动50万次 微信的营销的成功之道

微信公众平台已成为目前最热的企业营销推广平台&#xff0c;每天都有大量互联网公司和传统企业进驻&#xff0c;使用公众账号通过移动端和粉丝互动&#xff0c;不仅可以群发文字、图片、视频、语音等信息内容&#xff0c;还可以进行一对一的深入沟通。 现在微信公众平台已经成为…

微信开发1之PHP成功获取微信支付的Token

相信不少同学在开发“微信支付”的时候遇到了无法获取Token的难题&#xff0c;这里贴出我成功获取Token的php源码&#xff1a; 步骤如下&#xff1a; 1&#xff0c;确保你服务器的php环境是搭建好的&#xff0c;意思就是可以正确运行php程序 2&#xff0c;确定微信Token访问你…

spring IOC基本配置(xml配置和注解配置)

目录Spring IOCIOC是什么IOC可以做什么依赖注入IOC和DIIOC容器Bean配置IOC容器spring ioc 依赖XML配置实例化容器使用容器xml配置详解spring对bean的管理1、创建bean的三种方式2、bean对象的作用范围3、bean对象的生命周期构造函数依赖注入Setter方法依赖注入注解配置使用xml和…

微信开发2之php网页授权登录

在开发之前&#xff0c;我们要确保我们的服务号&#xff0c;在接口权限处&#xff0c;已经获得了网页授权权限 此外&#xff0c;我们还需要有个备案通过的域名&#xff0c;比如"www.myname.com"&#xff0c;并确保你的域名可以访问到你的服务器&#xff0c;于是在公众…

linux6.0 SVN 服务搭建

Linux6.0下安装svn服务器<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />Subversion有两种运行方式&#xff0c;一种是基于Apache Http Server&#xff0c;另外一种是Subversion Standalone Server。下面我讲解的是基于Apache H…

Spring+SpringMVC+Mybatis 整合入门

文章目录整体结构结构图Spring 整合SpringMVCweb.xmlSpringMvc.xmlSpring整合MybatisapplicationContext.xml代理接口的配置accountDaoimpl.xml其余代码表现层业务层持久层domain查询效果展示附上spring约束spring约束SpringMVC约束Maven 依赖整体结构 结构图 Spring 整合Sprin…

微信开发3之php模板信息推送

模板信息推送&#xff1a;需要在后台开通了模板消息推送接口 PHP代码如下&#xff1a; <?php $appid"wxxxxxxxxxxxxxxxxxx"; //填写微信后台的appid $appsecret"xxxxxxxxxxxxxxxxxxxxxxxxx"; //填写微信后台的appsecret $TOKEN_URL"…

SpringBoot实现国际化

在哔哩哔哩一位up主视频中学到的&#xff01; 国际化 原理 通过Properties文件配置&#xff0c;配置完后通过Thymeleaf中的#{} 来取代原来的静态资源。例如&#xff1a; spring:# 关闭模板引擎的缓存thymeleaf:cache: falsemessages:encoding: UTF-8## 配置国际化绑定的文…

前端开发1之Node.js以及npm开发环境搭建

关于现今的前端开发&#xff0c;由于微服务架构的普及&#xff0c;前端工程师必须承担更重要的任务。现在的后端工程师无需考虑JS、Ajax和json的解析遍历&#xff0c;或许只需要处理前端请求过来的各种带参请求&#xff08;Get/Post/Patch等&#xff09;&#xff0c;目前许多前…

开源中国iOS客户端学习——(八)网络通信AFNetworking类库

AFNetworking是一个轻量级的iOS网络通信类库&#xff0c;继ASI类库不在更新之后开发者们有一套不错选择&#xff1b; AFNetworking类库和使用教程: https://github.com/AFNetworking/AFNetworking 如果想深入研究有官方文档介绍:http://afnetworking.github.com/AFNetworking/ …

OpenGL 入门第一课 视窗以及三角形

请查看课件教程 下面是我粗劣画的过程图 下面是课件中的过程图 下面是未使用索引缓冲对象&#xff08;EBO&#xff09;的 #define GLEW_STATIC // 这个一定要加不然报错 静态链接库 #include<iostream> #include<GL/glew.h> #include<GLFW/glfw3.h> usin…

玩玩短视频平台和网课平台开发1——腾讯云对象储存COS的初步配置

近一两年来&#xff0c;抖音、快手等以短视频为手段的社交工具红遍了大江南北&#xff0c;腾讯也推出了"微视"平台&#xff0c;希望分一杯羹&#xff1b;传统的直播平台如&#xff1a;斗鱼直播、虎牙直播就更不用说了&#xff0c;甚至涌现了许多主打"知识付费&q…

解决从其它搜索引擎不能直接访问百度页面的问题

由于最近baidu和360又开始互咬了&#xff0c;从其它搜索引擎搜索到百度的结果时又变不能直接访问了&#xff0c;会出现如下界面。 需要手动点击这个链接才能访问&#xff0c;让人非常不爽。因此我写了一个chrome扩展解决这个问题&#xff0c;原理很简单&#xff1a;当遇到这种需…

基于JAVA的校园电商物流云平台 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 商品数据模块2.3 快递公司模块2.4 物流订单模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 商品表3.2.2 快递公司表3.2.3 物流订单表 四、系统展示五、核心代码5.1 查询商品5.2 查询快递公司5.3 查…

OpenGL Sharders(着色器) 入门

着色器(Shader)是运行在GPU上的小程序。这些小程序为图形渲染管线的某个特定部分而运行。 // 顶点着色器 #version 330 core // 0号栏位读取顶点坐标 layout (location 0) in vec3 aPos; //1号栏位读取颜色颜色 …

玩玩机器学习1——ubuntu16.04 64位安装TensorFlow GPU+python3+cuda8.0+cudnn8.0

如今的机器学习运算大多数都是利用gpu进行&#xff0c;包括很大大型游戏&#xff0c;比特币的开采&#xff0c;都离不开GPU的运算&#xff0c;GPU已成为大型运算能力的主要硬件。 大名鼎鼎的机器学习开源框架&#xff0c;如TensorFlow和Caffe&#xff0c;Caffe2都建议使用GPU作…

[linux]Ubuntu12.1下打开terminal的方式

有的人比较习惯使用terminal&#xff0c;喜欢简单的文本窗口&#xff0c;刚使用ubuntu可能还不习惯&#xff0c;这里给出几种打开terminal的方法&#xff1a;1 图形界面中图一就是那个左上角红色方框里的图标&#xff0c;点击后搜索terminal就好了。图二2 使用快捷键Ctrl Alt …

OpenGL 自定义着色器(Shaders)

自定义着色器类 声明 #pragma once#include<string>class Shaders { public:Shaders(const char* vertexPath, const char* fragmentPath);~Shaders();std::string vertexString;std::string fragmentString;const char* vertexSource;const char* fragmentSource;unsi…

《统一沟通-微软-技巧》-20-Lync 2010如何在我的联系人列表中添加非联盟联系人...

Blog:http://dynamic.blog.51cto.com MSN:LiuJinFengmsn.com QQ:316190099如果加:A&#xff0e; 内部Lync用户:输入-英文名输入-中文名输入-中文名/英文名中包括的部分字符B&#xff0e; 联盟Lync用户:输入:邮件地址C&#xff0e; 非 Lync用户:在Outlook新建联系人让Lync与Outl…