html网页上传到服务器_JSP+Servlet实现文件上传到服务器功能

本文实例为大家分享了JSP+Servlet实现文件上传到服务器功能的具体代码,供大家参考,具体内容如下

项目目录结构大致如下:

0efe4da3659492a2e01b0d895308af64.png

正如我在上图红线画的三个东西:Dao、service、servlet 这三层是主要的结构,类似 MVC 架构,Dao是模型实体类(逻辑层),service是服务层,servlet是视图层,三者协作共同完成项目。

这里的User是由user表来定义的一个类,再封装增删改查等操作,实现从数据库查询与插入,修改与删除等操作,并实现了分页操作,也实现了将图片放到服务器上运行的效果。

Dao层:主要实现了User类的定义,接口IUserDao的定义与实现(UserDaoImpl);

service层:直接定义一个接口类IUserService,与IUserDao相似,再实现其接口类UserServiceImpl,直接实例化UserDaoImpl再调用其方法来实现自己的方法,重用了代码。详见代码吧;

servlet层:起初是将表User 的每个操作方法都定义成一个servlet 去实现,虽然简单,但是太多了,不好管理,于是利用 基类BaseServlet 实现了“反射机制”,通过获取的 action 参数自己智能地调用对应的方法,而UserServlet则具体实现自己的方法,以供调用,方便许多,详见之前的博文或下述代码。

将文件上传到 tomcat 服务器的编译后运行的过程的某个文件关键要在每次编译后手动为其创建该文件夹来存放相应的上传文件,否则会导致每次重启 tomcat 服务器后该编译后的工程覆盖了原先的,导致上传文件存放的文件夹不存在,导致代码找不到该文件夹而报错,即上传不成功。如下图所示:

0ed6b6200dc2167e8288bbb4173d6ee1.png

主要是考虑图片路径的问题,手工设置路径肯定不能保证不重复,所以取到上传图片的后缀名后利用随机生成的随机数作为图片名,这样就不会重复名字了:

String extendedName = picturePath.substring(picturePath.lastIndexOf("."),// 截取从最后一个'.'到字符串结束的子串。

picturePath.length());

// 把文件名称重命名为全球唯一的文件名

String uniqueName = UUID.randomUUID().toString();

saveFileName = uniqueName + extendedName;// 拼接路径名

增加用户时代码如下:

// 增

public void add(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

System.out.println("add方法被调用");

// 获取数据

int id = 0;

String username = null;

String password = null;

String sex = null;

Date birthday = null;

String address = null;

String saveFileName = null;

String picturePath = null;

// 得到表单是否以enctype="multipart/form-data"方式提交

boolean isMulti = ServletFileUpload.isMultipartContent(request);

if (isMulti) {

// 通过FileItemFactory得到文件上传的对象

FileItemFactory fif = new DiskFileItemFactory();

ServletFileUpload upload = new ServletFileUpload(fif);

try {

List items = upload.parseRequest(request);

for (FileItem item : items) {

// 判断是否是普通表单控件,或者是文件上传表单控件

boolean isForm = item.isFormField();

if (isForm) {// 是普通表单控件

String name = item.getFieldName();

if ("id".equals(name)) {

id = Integer.parseInt(item.getString("utf-8"));

System.out.println(id);

}

if ("sex".equals(name)) {

sex = item.getString("utf-8");

System.out.println(sex);

}

if ("username".equals(name)) {

username = item.getString("utf-8");

System.out.println(username);

}

if ("password".equals(name)) {

password = item.getString("utf-8");

System.out.println(password);

}

if ("birthday".equals(name)) {

String birthdayStr = item.getString("utf-8");

SimpleDateFormat sdf = new SimpleDateFormat(

"yyyy-MM-dd");

try {

birthday = sdf.parse(birthdayStr);

} catch (ParseException e) {

e.printStackTrace();

}

System.out.println(birthday);

}

if ("address".equals(name)) {

address = item.getString("utf-8");

System.out.println(address);

}

if ("picturePath".equals(name)) {

picturePath = item.getString("utf-8");

System.out.println(picturePath);

}

} else {// 是文件上传表单控件

// 得到文件名 xxx.jpg

String sourceFileName = item.getName();

// 得到文件名的扩展名:.jpg

String extendedName = sourceFileName.substring(

sourceFileName.lastIndexOf("."),

sourceFileName.length());

// 把文件名称重命名为全球唯一的文件名

String uniqueName = UUID.randomUUID().toString();

saveFileName = uniqueName + extendedName;

// 得到上传到服务器上的文件路径

// C:apache-tomcat-7.0.47webappsaobaoServlet4甥汰慯dxx.jpg

String uploadFilePath = request.getSession()

.getServletContext().getRealPath("upload/");

File saveFile = new File(uploadFilePath, saveFileName);

// 把保存的文件写出到服务器硬盘上

try {

item.write(saveFile);

} catch (Exception e) {

e.printStackTrace();

}

}

}

} catch (NumberFormatException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (FileUploadException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

// 2、封装数据

User user = new User(id, username, password, sex, birthday, address,

saveFileName);

// 3、调用逻辑层API

IUserService iUserService = new UserServiceImpl();

// 4、控制跳转

HttpSession session = request.getSession();

if (iUserService.save(user) > 0) {

System.out.println("添加新用户成功!");

List users = new ArrayList();

users = iUserService.listAll();

session.setAttribute("users

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

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

相关文章

gaf处理一维故障信号_【推荐文章】改进局部均值分解的齿轮箱复合故障特征提取...

《机械传动》2019年 第43卷 第8期文章编号:1004-2539(2019)08-0130-05DOI:10.16578/j.issn.1004.2539.2019.08.024引用格式:柴慧理, 叶美桃. 改进局部均值分解的齿轮箱复合故障特征提取[J]. 机械传动, 2019,43(8):130-134.CHAI…

dll模块化设计与编程_FPGA设计原则经验分享

一、面积和速度如何折中 面积和速度是芯片设计中一对相互制约、影响成本和性能的指标,贯穿FPGA设计的始终。在FPGA设计中,面积是指一个设计消耗的FPGA内部逻辑资源的数量,可以用消耗的触发器和查找表的个数或者是等效逻辑门数来衡量&#x…

div背景透明_为什么css3实现background-image和半透明边框这么麻烦

”background和border属性能有什么难的?"我经常听到新手觉得css的background和border属性简单。那好,我们来看下面这个比较“简单”的需求:父元素有一张背景,子元素有边框,且子元素有一张背景颜色。这时候子元素的…

c mysql 查询超时设置_MySQL查询超时的设置方法

欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入 这里顺带解释一下什么是non-interactive connection Non-Interactive Commands Just do a quick look up on a table without logging into the client, running the query then logging back out aga欢…

python聚类分析案例_深度解读|如何构建用户分级体系实现精细化运营?附案例实操...

本文内容较长,代码全部已展示在文中用户精细化分类也可以称做用户画像,是目前很常见的一种运营手段,目的是为了更好的服务不同性质的客户,提高每个环节的转化率,最大程度挖掘客户价值,创造利润。那么如何构…

单片机集成wifi等_从零制作单片机需要哪些知识?

请点击上面 免费关注...说一下从芯片制作开始到最后编写驱动程序整个过程中每一步所需要的知识。作者:彭谟威链接:https://www.zhihu.com/question/28580074/answer/93515413来来来,让我们一起,左手右手一个慢动作。每一个方向都值…

matlab案例_基于matlab和frost平台的cassie案例足式机器人运动学和动力学计算实现过程...

1、软件平台Maltab2019aMathematica 12.1.0Frost2、实现步骤(1)、安装matlab2019a(2)、安装Mathematica 12.1.0(3)、下载frost-dev-master软件说明:https://ayonga.github.io/frost-dev/pages/i…

计算机毕业设计----SSM实现的一个在线文具学习用品购买商城

项目介绍 本项目分为前后台,前台为普通用户登录,后台为管理员登录; 管理员角色包含以下功能: 管理员登录,管理员信息管理,查看用户信息,新闻公告信息管理,文具类型信息管理,城市信息管理,配货点信息管理,文具信息管理,订单信息…

python2和3语法区别_python2和3语法区别

以下是Python2和Python3中的一些语法差异,有需要的小伙伴可以学习下。 print语句 在Python 2里,print是一个语句。无论你想输出什么,只要将它们放在print关键字后边就可以。在Python 3里,print()是一个函数。就像其他的函数一样&a…

python如何循环使用input_python基础知识input到while循环

j周笔记 输入与输出 1.输入 input (请输入内容) 字符串 2.输出 print(输出到控制台) 变量vairable 变量就是相当于我们人的名字 1.名字 2.存储位置 3.该存储位置的内容解释 ​ name(名字) 张三(值(存储位置)) 变量名 值 注意: 给变量取名字时,一定要遵循python语法规范 1.变量…

echarts tooltip被遮挡_echarts 的tooltip定位到当前图,避免溢出和遮挡

问题:tooltip初始是跟着鼠标移动,当内容过多(宽度高度过大),会被其他遮挡或者会溢出屏幕外解决:思路:根据官方文档,鼠标在左侧时,tip在右侧,鼠标在右侧时&…

idea mysql错误提示_idea提示错误:java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

碰见了一个问题,一直无法解决,希望大家帮帮忙。这是连接mysql的JdbcUtils代码:public class JdbcUtils {// 配置文件private static Properties props null;// 静态块保证只加载一次static {InputStream in JdbcUtils.class.getClassLoader…

python中seed的用法_Python中的seed()方法怎么用

Python中的seed()方法怎么用?下面是seed()方法的相关介绍: 描述 seed() 方法改变随机数生成器的种子,可以在调用其他随机模块函数之前调用此函数。 语法 以下是 seed() 方法的语法:import random random.seed ( [x] ) 注意:seed(…

bootstrap 输入错误提示_win7系统提示explorer.exe应用程序错误怎么办

在电脑当中弹出错误提示框可谓是多种多样,详细有很多电脑都有碰到过,最近有位win7系统用户在使用电脑的过程中,系统总是提示“explorer.exe应用程序错误”,用户不知道怎么解决这个问题,为此非常苦恼,那么wi…

json阅读器_Flutter小说阅读器系列一:使用Bloc模式获取起点小说关键字提示

Bloc模式下的小说关键字提示效果图最近难得有些闲暇时间,所以我又打算做一个小说阅读器,以前倒是用RNGolang写了一个,不过当时太过放飞自我导致自己看起来都很费力,这次我准备换成Flutter试一下。先简单将小说阅读器分为以下几个部…

python获取mysql中的数据供js调用_详解js文件通过python访问数据库方法

我来教你 js文件怎么通过python访问数据库,希望能够为你带来帮助。 1、如果是要提交表单内容给 服务器的 python 处理,那么只需要在表单 里面的 action 填写服务端的处理路由就可以了。或者用 指向服务器路由get querystring。前端方面不需要python啊。…

python 初始化一个4维向量_看图学NumPy:掌握n维数组基础知识点,看这一篇就够了...

摘要:NumPy是Python的最重要的扩展程序库之一,也是入门机器学习编程的必备工具。国外有位程序员讲NumPy的基本运算以图解的方式写下来,让学习过程变得轻松有趣。 NumPy是Python的最重要的扩展程序库之一,也是入门机器学习编程的必备工具。然而对初学者来说,NumPy的大量运算…

win8 mysql6_Win8系统 MySQL 6.0 安装图解

Win8系统 MySQL 6.0 安装图解(作者:wanghui2015/04/08)1、首先双击mysql-6.0.10-msi,会出现如下图所示界面。点击next;2、出现如下界面:这三个为选择安装类型,新手可以选择Typical或Complete就可以了。咱们为了看一下安…

python画锯齿波_用Python控制硬件35-自制二三十元成本的信号测量采集控制系统

如前篇所介绍,用Shell Lab测试台软件配合之前介绍的任意款实验板,都能方便地实现ADC电压测量,但遇到两个问题:示例代码虽然众多,但大都默认ShellLab类型的控制器,需要手动改为Mcush.Mcush类型才能运行&…

java连接hbase_HBase实战 | 05405.15.0Spark2使用HBaseSpark访问HBase

转载自微信公众号Hadoop实操温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。Fayson的github:https://github.com/fayson/cdhproject提示:代码块部分可以左右滑动查看噢1文章编写目的越…