上传文件时表单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. Spring Date Jpa on update current_timestamp 自动维护创建时间和更新时间

    在数据库里设置默认值current_timestamp可以维护创建时间,设置on update current_timestamp 可以维护更新时间.在JPA中应该如何去做呢?这里还是以上篇Topic ...

  2. Jsp/html页面删除前进行删除提示

    HTML代码 <body> <a href="javascript:if(window.confirm('是否?')){window.location.href='test ...

  3. JSP慕课网之application、page、pageContext、config、exception

    接下来使用getSession().forward().include()方法. 跳转的include.jsp页面:

  4. [2017-09-04]Abp系列——为什么值对象必须设计成不可变的

    本系列目录:Abp介绍和经验分享-目录 这篇是之前翻备忘录发现漏了的,前阵子刚好同事又提及过这个问题,这里补上. 本文重点在于理解什么是值对象的不可变性. Abp的ValueObject以及EF的Co ...

  5. JDBCTemplate

    1.Spring提供的一个操作数据库的技术JdbcTemplate,是对Jdbc的封装.语法风格非常接近DBUtils. JdbcTemplate可以直接操作数据库,加快效率,而且学这个JdbcTem ...

  6. ref与out的区别、冒泡排序、普通排序,以及二分法查询

    一.首先我们先讲一下ref与out的区别和使用方法: 1.ref与out的区别: out:需要在使用前声明变量,分配地址但不能赋值,但是需要在使用中的时候需要初始化(进入方法体中的时候需要先赋值在使用 ...

  7. Day4 - Linux分区规划与xshell使用排错

    1.1 没有重要数据 /boot   200M    存放系统的引导信息 内核 swap   交换分区   防止内存用光了 临时的一个内存 如果你的内存小于8G swap是内存的1.5倍   如果你的 ...

  8. Python学习日志_2017/09/08

    今天早晨学习了<Head First :HTML and CSS>:学习了两个章节,感觉从基础学习特别的踏实,能看懂的同时踏踏实实的锻炼了基础的能力.我个人认为无论哪个行业,最重要的永远是 ...

  9. 初学者入门web前端 C#基础知识:数组与集合

    对于初学者,想要入门web前端,要有足够的信念和坚持,不然只会越走越远,我现在就深深的体会到. 我本是一个很拒绝代码的人,以前想过UI设计,但是在这段学习时间里,发现其实只要认真,代码并不是很难 所以 ...

  10. C++学习日记(二)————初始字符串类型

    使用频率高,但操作复杂的数据有哪些? 做下总结: int; double;float;char;bool这些类型用的比较频繁,但并不复杂.但对于字符串来说(char数组)用的频繁但操作又复杂,只能用一 ...