上传文件时表单enctype属性必须要更改为<enctype='multipart/form-data'>;采用post提交表单,元素需要有name属性;

利用第三方jar包(commons-fileupload-1.2.1.jar   commons-io-1.3.2.jar )进行普通数据获取和文件上传;普通文本需要用getString("编码格式")方法获取,否则汉字会出现乱码,最开始我一直用的getString()获取,发现传到数据的数据全是乱码,查看流浪器的里面的请求和响应全是正常的,百度了半天也没找到真正的解决方法,无意间发现第三方包里面的FileItem还有一个重载的getString(String  args)方法,但是不晓得参数传什么;后来发现这个getString(String  args)方法会抛一个

UnsupportedEncodingException异常,英语也不好,百度单词的意思吧,什么不支持的编码异常,到此终于发现这个是设置编码的方法;
所以呢,写方法;写类;写变量;写参数时,能让人见文知意是多么重要;要是这个方法直接这样写的getString(String  charset)一看就知道是设置编码格式的方法了把。

添加商品的Servlet:

package ni.jun.yang.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List; 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 ni.jun.yang.service.KindService; @WebServlet("/AddGoodsServlet")
public class AddGoodsServlet extends HttpServlet {
private static final long serialVersionUID = 1L; public AddGoodsServlet() {
} protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//响应编码格式
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
//遍历类型的集合,得到下拉框选项
List<String> list = new ArrayList<>();
String sql = "Select * from kind";
list = new KindService().select(sql);
out.println("<html><head><meta charset='utf-8'><title>添加商品</title>");
out.println("</head>");
out.println("<body>");
//上传文件的提交方式
out.println("<form action='AddResultServlet' method='post' enctype='multipart/form-data'>");
out.println("<table>"); out.println("<tr>");
out.println("<td>名称:</td>");
out.println("<td><input type='text' name='mingzi'></td>");
out.println("</tr>"); out.println("<tr>");
out.println("<td></td>");
out.println("<td><input type='file' name='filename'></td>");
out.println("</tr>"); out.println("<tr>");
out.println("<td>介绍:</td>");
out.println("<td><input type='text' name='jieshao'></td>");
out.println("</tr>"); out.println("<tr>");
out.println("<td>售价:</td>");
out.println("<td><input type='text' name='shoujia'></td>");
out.println("</tr>"); out.println("<tr>");
out.println("<td>分类:</td>");
out.println("<td>");
out.println("<select name='fenlei'>");
//遍历类型的集合,得到下拉框选项
for (int i = 0;i<list.size();i++) {
out.println("<option value="+(i+1)+">");
out.println(list.get(i));
out.println("</option>");
}
out.println("</select>");
out.println("</td>");
out.println("</tr>"); out.println("<tr>");
out.println("<td> </td>");
out.println("<td><input type='submit' value='添加'></td>");
out.println("</tr>");
out.println("</table>");
out.println("</form>");
out.println("</body>");
out.println("</html>"); }
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}

  处理提交数据的Servlet:

package ni.jun.yang.servlet;

import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.List; 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 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 ni.jun.yang.bean.Goods;
import ni.jun.yang.service.GoodsService; @WebServlet("/AddResultServlet")
public class AddResultServlet extends HttpServlet {
private static final long serialVersionUID = 1L; public AddResultServlet() { }
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8"); DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(1024*1024*5);
ServletFileUpload upload = new ServletFileUpload(factory);
List<FileItem> fileItems = null;
Goods goods = new Goods();
try {
//请求数据返回FileItem类型的数组
fileItems = upload.parseRequest(request);
} catch (FileUploadException e) { e.printStackTrace();
}
//上传的文件存放路径
String path = getServletContext().getRealPath("/image");
File f = new File(path);
//没有此路径就创建
if(!f.exists()){
f.mkdirs();
}
//遍历请求数据的集合进行数据的获取和文件的上传
for (FileItem x : fileItems) {
try {
uploading(x, goods, path);
} catch (Exception e) { e.printStackTrace();
}
}
//普通数据存入数据库,页面跳转
if(new GoodsService().add(goods)){
request.getRequestDispatcher("success.html").forward(request, response);
}else{
response.sendRedirect("lose.html");
} }
/**
* 数据的获取和文件上传
* @param fileItem
* @param goods 待添加的商品
* @param path 上传的路径
* @throws Exception
*/
private void uploading (FileItem fileItem,Goods goods,String path) throws Exception{
//普通文本数据
//只能获取字符串,其他的数据需要通过包装类的方法转化得到
if(fileItem.isFormField()){
if(fileItem.getFieldName().equals("mingzi")){
//获取普通的文本数据利用getString("utf-8"),设置编码格式。否则会出现汉字乱码
goods.setName(fileItem.getString("utf-8")); }else if(fileItem.getFieldName().equals("jieshao")){
goods.setExplain(fileItem.getString("utf-8")); }else if(fileItem.getFieldName().equals("shoujia")){
//字符串转Double
goods.setPrice(Double.parseDouble(fileItem.getString())); }else if(fileItem.getFieldName().equals("fenlei")){
String type = fileItem.getString();
goods.setType(Integer.parseInt(type)); }
}else{
// 文件类型
String fileName = fileItem.getName();
// System.out.println(fileName);
//设置上传的文件名字,利用时间返回毫秒数,保证上传的文件不重名
String path1 = new Date().getTime()+"_"+fileName;
String fileName2= path+"\\"+ path1;
File file = new File(fileName2);
//数据只存放文件名字
goods.setPhoto(path1);
// System.out.println(fileName2);
try {
fileItem.write(file);
} catch (Exception e) {
e.printStackTrace();
}
}
} protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response);
} }

  效果图:

完整项目网盘地址:http://pan.baidu.com/s/1boWm05T         密码:blqh

servlet文件上传2——复合表单提交(数据获取和文件上传)的更多相关文章

  1. layui框架实现多图片手动上传和随表单提交方法

    首先在官方文档并没有手动上传的说明文档,这里手动实现上传原理是:在表单中有三个按钮,分别是上传图片按钮.隐藏上传按钮.表单提交按钮,点击上传图片按钮之后,图片添加在前端但是并没有真正的上传,而是在点击 ...

  2. Servlet的5种方式实现表单提交(注册小功能)

    Servlet的5种方式实现表单提交(注册小功能),后台获取表单数据   用servlet实现一个注册的小功能 ,后台获取数据. 注册页面: 注册页面代码 : <!DOCTYPE html> ...

  3. Linux curl 模拟form表单提交信息和文件

    Linux curl 模拟form表单提交信息和文件   curl是一个命令行方式下传输数据的开源传输工具,支持多种协议:FTP.HTTP.HTTPS.IMAP.POP3.TELNET等,功能超级强大 ...

  4. c# 模拟表单提交,post form 上传文件、大数据内容

    表单提交协议规定:要先将 HTTP 要求的 Content-Type 设为 multipart/form-data,而且要设定一个 boundary 参数,这个参数是由应用程序自行产生,它会用来识别每 ...

  5. Yii2表单提交(带文件上传)

    今天写一个php的表单提交接口,除了基本的字符串数据,还带文件上传,不用说前端form标签内应该有这些属性 <form enctype="multipart/form-data&quo ...

  6. js_ajax模拟form表单提交_多文件上传_支持单个删除

    需求场景: 用一个input type="file"按钮上传多张图片,可多次上传,可单独删除,最后使用ajax模拟form表单提交功能提交到指定方法中: 问题:由于只有一个file ...

  7. 使用bean接收ajax表单提交数据包含文件上传

    这几天写带图片上传的表单提交,一个配置小程序活动弹出框样式的功能,记录一下一些需要注意的地方 首先是 前端 JSP 文件的表单 <form class="search-wrapper& ...

  8. c# 模拟表单提交,post form 上传文件、数据内容

    转自:https://www.cnblogs.com/DoNetCShap/p/10696277.html 表单提交协议规定:要先将 HTTP 要求的 Content-Type 设为 multipar ...

  9. Java后台使用httpclient入门HttpPost请求(form表单提交,File文件上传和传输Json数据)

    一.HttpClient 简介 HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 ...

随机推荐

  1. We’re Just Beginning

    "We are reading the first verse of the first chapter of a book whose pages are infinite…" ...

  2. 谈MVVM

    什么是MVVM? MVVM(模型-视图-视图模型,Model-View-ViewModal)是一种架构模式,并非一种框架,它是一种思想,一种组织与管理代码的艺术.它利用数据绑定,属性依赖,路由事件,命 ...

  3. Python初学——pickle & set

    pickle 存放数据 保存和提取python运算完的结果 首先import pickle模块 定义一个字典: a_dict={'da':111,2:[23,1,4],'23':{1:2,'d':'s ...

  4. 【转载】makefile经典教程

    该篇文章为转载,是对原作者系列文章的总汇加上标注. 支持原创,请移步陈浩大神博客: http://blog.csdn.net/haoel/article/details/2886 makefile很重 ...

  5. js学习--变量作用域和作用域链

    作为一名菜鸟的我,每天学点的感觉还是不错的.今天学习闭包的过程中看到作用域与作用域链这两个概念,我觉得作为一名有追求的小白,有必要详细了解下. 变量的作用域 就js变量而言,有全局变量和局部变量.这里 ...

  6. 八大排序算法---基于python

    本文节选自:http://python.jobbole.com/82270/ 本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 ...

  7. Javascript学习日志(三):闭包

    说实话,前面一节的原型和原型链在当初学的时候并没有很头疼,对着高级编程第三版撸了几遍就理解透了,闭包这一节真的挺头疼的,很惭愧,看了差不多十来遍吧,还翻看了网上的其他博客和解释文档,五花八门的表达方式 ...

  8. 通信原理课程设计Javaswing技术计算出PCM编码——猎八哥FLY

    package keshe; import java.awt.BorderLayout; import java.awt.EventQueue; import javax.swing.JFrame; ...

  9. 201521123096《Java程序设计》第八周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 本次作业题集集合 1.List中指定元素的删除(题目4-1) 1.1 实验总结 实验中使用了s ...

  10. 201521123045 《Java程序设计》第6周学习总结

    Java 第六周总结 1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结.注1:关键词与内容不求多,但概念之间的 ...