- ?
Java开发工程师如何在Mysql数据库中创建表
Roxana
展开
首先我们需要在数据库中创建两张表用来学习MyBatis对数据库增删改查的使用方法。如果是新安装的数据库可以直接复制我下面的sql进行表创建,如果是已使用中的数据库可能表明会与我的表名冲突,需要创建一个新的database再执行sql,也可以直接删除原来的表,如果表有外键关联需要先解除外键约束再删除。在这里我使用的连接数据库工具为Navicat,相对oracle的有SqlDevloper等。
DROP TABLE IF EXISTS TableName;
这个语句是删除表的,如果表名存在就执行删除。
SET FOREIGN_KEY_CHECKS=0;
这句sql意思是将mysql中外键检查终止,就是说FOREIGN_KEY_CHECKS=0时,外键约束失效,FOREIGN_KEY_CHECKS=1,外键约束启用。所以为了不影响以后的操作,建议在删除表之后将FOREIGN_KEY_CHECKS=1重新启用外键约束。
orders表接下来我们创建表
CREATE TABLE `orders` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL COMMENT '下单用户id',
`number` varchar(32) NOT NULL COMMENT '订单号',
`createtime` datetime NOT NULL COMMENT '创建订单时间',
`note` varchar(100) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`),
KEY `FK_orders_1` (`user_id`),
CONSTRAINT `FK_orders_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
这是一段数据库脚本,大家将这段复制到sqlPlus或者navicat中执行即可。在正式开发环境中,sql建表语句都不是我们手动写出来的,有很多免费的数据库建模工具如powerdesigner,帮助我们构建数据库模型来自动生成sql语句。非常的方便,Mybatis也有一个非常好用的插件叫做逆向工程,它可以帮我们通过sql脚本而生成对应的java 实体类,是持久层开发人员的神器啊,以后都会讲到。
create 创建 和 TABLE 表 这两个都是关键字,`orders` 是想要创建的表名,需要用单引号或双引导包起来,后面跟一个括号,括号内包含表内字段和字段的属性,括号内可以为空,那就会单独创建一张空的表。
`id` int(11) 是一种int类型的名字叫做id的字段,长度为位。比如1111这是四位,如果超过11位就不会显示。int类型可指定字段长度最大为255,非常庞大的数字。 当然也可以不指定它的长度,那么写法就是'id ' int ,唯一区别就是如果指定长度的话,前面有未被使用的位则自动填充0进去,如`id` int(11) ,它的值为11时显示就会是000000000011的形式。
varchar是一种字符数据类型,相当于java里的String,它的最大长度也是255,它的特点就是如果在括号内指定长度则为指定它的最大长度,如果有多余长度没有被占用的话他会自动根据实际情况来缩短自己长度而节省硬盘空间,虽然几位字符不会有多大,但是生产场景中的数据库中的数据量是非常大的,这是一个非常有价值的特性。另外它的实际长度是字段值得长度+1,在数据库设计时会留出一位专门用来保存它的长度,这也就是为什么能够自动缩短长度的原理。
datetime 是一种时间格式,与此相关的还有date和timestamp时间戳。那么他们有什么区别呢?
date:2018-4-22 不带时分秒的
datetime:相反,则是带时分秒的
timestamp:时间戳 (1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。)
COMMENT 关键字是我们为字段解释其含义的内容,后面通常在括号内写入字段的中文意思
NotNULL表示非空,即该字段永不为空,如果ID这种字段就不可以为空,则为数据类型的默认值也叫作缺省值。
KEY就是键,多用作的外键,它其实也是一种索引,能够帮助我们快速找到相应字段。
PRIMARY KEY为主键,主键与Key的区别就是主键通常是唯一的,在mysql中ID多为自增序列,后面在复杂项目也会用到联合主键。而Oracle的主键则是通过另一种方法叫做序列sequence,Oracle没有自增这一说而是每一次增加都是从sequence取出值来放入字段内。这一点很像是Java里面的数据结构队列。
CONSTRAINT `FK_orders_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
CONSTRAINT 约束,FOREIGN KEY外键,REFERENCES 关联,是为表添加外键约束关联至user表的,字段id下。
接下来我们为表插入字段的值。
INSERT INTO `orders` VALUES ('3', '1', '1000010', '2015-02-04 13:22:35', null);
INSERT INTO `orders` VALUES ('4', '1', '1000011', '2015-02-03 13:22:41', null);
INSERT INTO `orders` VALUES ('5', '10', '1000012', '2015-02-12 16:13:23', null);
insert 语句非常简单就不细说了,接下来我们创建另一张表,user表。
user表CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(32) NOT NULL COMMENT '用户名称',
`birthday` date DEFAULT NULL COMMENT '生日',
`sex` char(1) DEFAULT NULL COMMENT '性别',
`address` varchar(256) DEFAULT NULL COMMENT '地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;
创建user表INSERT INTO `user` VALUES ('1', '王五', null, '2', null);
INSERT INTO `user` VALUES ('10', '张三', '2014-07-10', '1', '北京市');
INSERT INTO `user` VALUES ('16', '张小明', null, '1', '河南郑州');
INSERT INTO `user` VALUES ('22', '陈小明', null, '1', '河南郑州');
INSERT INTO `user` VALUES ('24', '张三丰', null, '1', '河南郑州');
INSERT INTO `user` VALUES ('25', '陈小明', null, '1', '河南郑州');
INSERT INTO `user` VALUES ('26', '王五', null, null, null);
插入字段信息大家最好能够按照图片上的自己敲一遍,如果执行失败的话可以复制我的文本进行创建即可。这就是两个关联的表,我们可以使用Mybatis框架对数据库进行增删改查,单表查询或多表查询练习使用。大家有不明白的地方可以下房留言回复,数据库是开发人员的一种硬实力,其中存储过程,视图触发器等对熟悉面向对象的Java程序员都是难啃的骨头,一定要掌握扎实的数据库基础才行。
- ?
互联网技术时代——JAVA学习之文件上传与下载
寄文
展开
u文件上传和下载
u说出几种拦截器,及其作用
u掌握文件上传和下载
使用fileUpload完成文件上传
掌握系统拦截器参数的注入
实现stream完成文件下载
文件上传的步骤
u1.定义Action封装文件、名称、类型属性
u2.定义表单、添加 enctype="multipart/form-data"
代码分析定义Action
public class UploadAction {
private File file; //表示上传到服务器的文件
private String fileFileName; //上传文件的文件名
private String fileContentType; //上传文件的文件类型
public String execute(){
try{
File target = new File("d:\doc\"+fileFileName);
FileUtils.copyFile(file, target);
}catch(Exception e){
}
return "
success";
注意以下 2点:
1,定义文件属性名,必须与表单文件框的名称一致
2,定义一个文件属性,必须带两个文件名和文件类型属性,且两个属性的
命名格式必须xxxFileName,xxxContextType
有如下上传文件action,定义文件上传属性img,其(1)和(2)正确的是
private File img; //表示上传到服务器的文件
private String (1); //上传文件的文件名
private String (2); //上传文件的文件类型
选项:
A, fileFileName 和 fileContentType
B, fileName 和 contentType
C, imgfileName 和 imgcontentType
D, imgFileName 和 imgContentType
JSP表单分析
注意以下2点:
1,enctype,表单数据编码类型为二进制传输数据类型,
2,文件input 的名字要与action中文件属性保持一直
u建立一个struts251的项目
u建立一个UpAction.java和up.jsp实现文件上传
u 指定上传文件时的临时目录,默认使用javax.servlet.context.tempdir
比如:value="d:\temp"
u 指定Struts 2文件上传中整个请求内容允许的最大字节数
文件上传的配置参数
11 / 16
上传文件拦截器FileUploadInterceptor
u
public class FileUploadInterceptor extends AbstractInterceptor {
protected Long maximumSize;
protected Set
allowedTypesSet = Collections.emptySet(); protected Set
allowedExtensionsSet = Collections.emptySet(); 1,maximumSize ,允许上传的文件大小
2,allowedTypes ,允许上传的文件类型比如:image/bmp,image/png,text/plain
3,allowedExtensions允许上传的扩展名,比如:.jpg,.png
4,action一定要实现ActionSuppor
配置使用上传文件拦截器
text/plain
/pages/upload_control.jsp /pages/finish.jsp 1, fileUpload 配置文件上传拦截器,加入参数
2,defaultStack 配置默认拦截器栈,否则很多功能消失。
3,配置input result ,文件上传拦截器发现非法上传,返回的result
多文件上传Action
private[] File file; //表示上传到服务器的文件
private[] String fileFileName; //上传文件的文件名
private[] String fileContentType; //上传文件的文件类型
for(int i=0;i
FileUtils.copyFile(file[i], target);
文件下载Action
public class DownloadAction {
private InputStream inputStream; //被下载文件输入流
//seter、geter 方法略
String localFileName = "11.jpg";
String localFile = "d:\doc\"+localFileName;
inputStream = new FileInputStream(localFile );
fileName = new String(localFileName.getBytes(), "ISO8859-1"
文件下载配置
inputStream
application/octet-stream
attachment;filename="${fileName} "
1,result type 为stream
2,param参数inputName,下载文件来源流,对应action中某个类型的
inputStream的属性名,该属性必须有getInputStream()方法
3,contentType 内容类型,和互联网中MIME表中一致
4,contentDisposition 文件下载的处理方式,包括内联(inline)和
(attachment),inline浏览器试图直接打开附件,attachment打开对话框。
打开或保存对话框
1,IE浏览器可用。其他浏览器不一定。
2,测试时,打开新的浏览器
uJSP中,如果是部署的项目某一可用路径下的图片,直接
使用超链接即可。就像UI设计需要使用图片一样

u如果不在部署工程路径下,在某一磁盘中,即可使用下载
图片方式。
JSP中,嵌入
"down.action">
JSP中使用下载图片
u建立一个DownAction.java实现文件下载
u增加一个welcome.jsp文件,直接显示下载的图
- ?
如何用Java制作一个简单数据库
卢书竹
展开
笔者准备上大二,四月时加入了学院一个为期一年的Hadoop开发研究项目小组,暑假绝对是不可错过的学习时期。由于Hadoop 是由Java 编写的,调用API 最好也是用Java,Java的简单使用因此成为我们小组的必修。
我们选择的教材是《Thinking in Java》(Bruce Eckel)和网课《Java4android》(Mars老师)。悄悄告诉你,我《Thinking in Java》截稿时才看了不到200页。
制作一个简单数据库是 《Java4android》中Mars老师留下的作业。我花了三天半完成,700+行。(代码太长,就不一一贴出来了,文末有跳转查看和下载地址)
学习是一个输入和输出的过程,这篇文章就当作我Java入门的奠基,同时可以帮助初学者理解Java这门语言的使用,也欢迎参照这个小项目练练手。
---------------------------------------------------
笔者的这个数据库是基于文本文件的读写储存,原理比较简单。
数据库命令: 首先,数据库有四大基本功能:增删改查(add/delete/update/query),我为了使用方便,在设定这四个命令的同时,增加了“列出全部(show)”和“退出(quit)”。
数据库成员: 数据库每个成员有五个值:与
命令格式:
ADD
DELETE
UPDATE
QUERY
SHOW
QUIT
程序文件纵览:(已展开展示成员与方法)
程序类文件图:(使用Eclipse的Modelgoon插件反向制作UML)
程序关系图:
(我知道挺乱●﹏●)
程序文件各类的作用分析:
Main:显示欢迎界面、调用MainLooper的loop()方法(程序主循环)。
MainLooper:程序主循环、从Input的getInputLine()方法获得命令输入、把输入的字符串传给CheckCmd的check()方法、如果传去check()的值为”QUIT”则跳出循环。
Input:bufferedReader.getInputLine()方法中,调用java.io.BufferedReader的readLine()方法读取整行字符串返回。
Data.txt:存放数据库的文件。
Eng.properties:存放用户交互界面(UI)提示
IOProperty(截图里打错了):利用java.util.Properties的load(InputStreaminStream)方法,读取储存文件键值对。
UserInterface:提供获取UI提示的方法。
User:方便获得、暂存、修改、统一输出成员的值。
UsefulMethod:(实用方法)专门在代码重构时新增的类,供使用的类继承,意在统一管理常用的6个方法。分别是:1、反馈命令成功执行 2、判断字符串是否为数字 3、判断成员的数值value是否符合要求 4、判断新增成员key是否重复 5、把数据库储存文件的内容按照id排序(选择排序法) 6、消除String[]中的null。
CheckCmd:使用String的.split(“ ”)方法拆分命令,检查判断输入命令,若无语法问题即进行相应操作,否则报错。
Action:根据CheckCmd的调用进行相应的操作实现数据库功能。
WriteFile:根据调用的参数把字符串添加或覆盖写入文件。
QueryFile:showAll()方法返回数据库所有的内容,query(inttypeIndex, int operIndex, String args) 根据参数进行相应的搜索,返回所有符合条件的成员。
命令实现详析:
ADD
actAdd(String[] strs):可添加前提:命令长度为6、成员数值value和性别合规、key不重复。否则根据不符的要求相应显示提示。
actAdd(String[] strs):new一个User类,放入成员值,用writeFile.write(user.toString(),true)添加到文件尾部,并执行一次sortData()(文件全内容按id排序)。
DELETE
checkDelete(String[] strs):前提:命令长度为2。判断命令参数是否为id(isNumberic(Stringstr)),并输入到actDELETE()。
actDelete(String[] strs, boolean isId):调用queryFile.showAll()获得文件全部内容并存在String[]中。根据isId循环检索对应key,成立便跳出,把对应字符串赋为””空字符串,并复写在文件上。
UPDATE(设计仅支持salary修改)
checkUpdate(String[] strs):前提:命令长度为4、命令第2部分是salary。判断命令参数是否为id,并输入到actUPDATE()
actUpdate(String[] strs, boolean isId):与DELETE类似,调用queryFile.showAll()获得文件全部内容并存在String[]中。根据isId循环检索对应key,成立便跳出,把对应成员值放在一个user成员内,并修改成员salary值,再复写在文件上。
QUERY
checkQuery(String[] strs):前提:命令长度为4。根据type index{0.
actQuery(int typeIndex, int operIndex, Stringargs):调用queryFile.query(typeIndex, operIndex, args)获取结果并循环输出结果。
query(int typeIndex, int operIndex, Stringargs) :把简化的情况分别检索。思想挺简单,逻辑容易乱,代码也多。
SHOW
checkShow(String[] strs):前提:命令长度为1。直接调用actShow(String[]strs)。
actShow(String[] strs):调用queryFile.showAll()获取全部内容并循环输出。
QUIT
checkQuit():输出“谢谢使用”,并返回-1至MainLooper,跳出循环,程序终结。
Data.txt截图:
Eng.properties截图:
运行效果:(注:亮绿色为键盘输入)
------------------------------------------------------
至此,我把我数据库的结构与实现方式大概展现出来了。
但正如我们的精神领袖Linus Torvalds所说的“Talk is cheap, show me the code.”说多无益,想要自己有大长进,就要多看优秀代码,同时自己多写代码。
在此我放出链接:
直接看代码链接:Java简单数据库 源码展示
下载链接:http://pan.baidu/s/1dE82FJF 密码:jyq0
(包含源码和可运行jar)
欢迎找BUG。
感谢Bruce Eckel 和 Mars老师。
谢谢各位看看官。
- ?
如何把excel数据导入navicat
吉青文
展开
在导出的Excel表中,手动的录入一些数据,然后将这个表导入到数据库中。
步骤1:运行【导入向导】,选择导入数据的类型
步骤2:选择文件数据源
步骤3:跳过。
步骤4:给源文件定义一些附加选项,前三个选项一定要填写正确,否则将不能完成正确的导入。
[栏位名行]:数据表字段所在的行位置
[第一个数据行]:导入的数据表中源数据是从第几行开始的
[最后一个数据行]:导入的数据表中源数据是从第几行结束的
步骤5:选择目标表,也可以新建一个表
步骤6:定义源栏位和目标栏位的对应关系,如果目标栏位设置了主键,在这一步中一定要勾选,否则也将无法正常导入数据
步骤7:选择导入模式,如果是新表,选择第一项。可以根据具体情况选择不同的选项。这里选择第三项。
步骤8:点击【开始】执行导入命令
执行完之后,去数据库验证一下:
(本文内容由百度知道网友茗童贡献)
- ?
Java -- 大文件分片上传后台的处理
安露
展开
关注我的人都成为了月薪5w以上的技术大牛
问题:
js上传文件时文件太大导致的上传失败,到底多大会上传失败没测试过(因为我测试上传了一个10G文件失败了)。原因猜测很多,可能和post之类的网络协议有关,可能和后台某些设置有关。
思路:
思路挺简单的,因为前台上传使用的 Web Uploader,一个百度的插件,文档里清清楚楚写着有一个multiple属性,设置成true开启分片上传,听名字就知道可以用来上传大文件,我想断点续传之类的应该都是用这个做的吧。嘛,我的需求没那么复杂,能上传就行。然后重点是后台。 分片上传后台的接收,网上很多帖子的做法是用RandomAccessFile获取到文件,然后把文件下标(不知道怎么形容好)移到文件最后,然后把分片上传的数据写入到后面。 然后我遇见的问题有两个,一个一个遇见的。。1.分片上传他是速度很快的发送数据,然后tomcat应该会为每个请求分配不同的线程,所以有多线程问题(比如第一个请求正在写数据还没写完第二个请求就把文件拿过去接着写了)。2.分片上传因为是请求,所以顺序是不能保证的,每次都在文件最后开始写入会出现文件损坏。(eg:一个文件叫做"123",现在把文件拆分成"1","2","3"。分三次请求发送给服务器,服务器的接收顺序可能是321,132。这样会造成文件损坏)。
解决:
问题1:一开始在网上找资料发现有个叫文件锁的东西可以用,可是报了一个错,网上管管这个错误是因为线程一获取了文件锁,在线程一没有释放的时候线程二去获取这个锁就会抛出异常。囧。我理解的锁难道不该是线程二没获取到锁应该就等着线程一释放再去获取嘛,直接抛出异常是什么鬼。嘛,不想这么多,直接给拼接方法那里加个 synchronized 关键字就好了。这样大小起码看起来是正常了(虽然这样做并没有什么卵用)。 问题2:这个是最蛋疼的,测试的时候发现压缩包文件在这样上传后会出现文件损坏,想了很久还是经过同事提醒才认识到这个问题。知道问题,思路就可以有很多了,位置不对放对位置就好了嘛。我的思路是多看了下uploader这个插件,分片上传时给把文件大小,分片总数,当前分片数都传给你。然后根据这个些参数在设置文件大小,根绝当前分片数移动到对应位置写入数据就好了。这样写上边问题1加上的 synchronized 关键字去掉也可以。
好程序员特训营自2014年开班至今,一直立志培养高薪,高能,高 职的程序员人才,截至目前,好程序员学员就业均薪1万3以上,学员薪资最高达到2万9千元。现开设Html5、JavaEE、大数据、Android等高端精品课程,40人小班教学保证高品质,坚持100%全程面授。
大数据1704期开班日期12月18日, 通过考试后享受5000元学费报名优惠 。
好程序员,从平凡到卓越,为梦想而拼搏!
- ?
Java框架的配置文件如何导入约束?以MyBatis为例
雪清爽
展开
首先你得有一个数据库,Mysql,Oracle,SqlServer其中任意一种都可以。这里以Mysql为例。
在项目中搭建框架除了下载好框架之外,在写代码之前还需要完成框架的配置工作。MyBatis这个框架是基于JDBC的,所以你在学习之前最好了解JDBC是怎么回事。用法上基本相同。JDBC需要的配置这里都会用到。
首先我们创建一个SqlMapConfig.xml ,这个xml包含了MyBatis所有的全局配置,在这里可以配置它的运行环境。说一下这个配置文件是固定的,大家可以去看一下源码,当框架运行第一步首先就会加载这个xml文件,如果找不到就会启动失败。
新建xml文件,名字固定为SqlMapCOK理论上当你创建好之后是这个样子的,就是一个空的xml文件。如果你使用过其他框架应该知道,配置文件中需要加入框架的DTD约束,这个约束可以帮助我们在eclipse自动补全和提示框架的标签。
创建好配置文件OK现在大家将下面到之尖括号中内容复制到XML中,如下图所示。
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
加入框架约束加入之后我按Ctrl+/ ,会自动提示 configuration标签,它是框架的根标签,所以内容写在
完成约束可自动补全标签< 里面。刚刚发生了一件很讨厌的事情,我在configuration里面没有自动提示我里面的标签。是什么原因呢,我这种导入约束的方式 是需要联网的,可能刚才联的是国外的网,过了好一会才出来。就是说SqlMapConfig.xml需要去读 这个DTD 文件,除了填写它的网络位置外,还可以填写它在你机器上的物理位置。看到了吗在你的框架源码中的Builder.xml包里。如果你不能上网 下面教你引入它的物理路径,让SqlMapCinfig直接去读取本地的DTD文件。
DTD约束文件路径在Eclipse找到这个位置,打开windows -> Preference -> XML -> XML Catalog -> 选择右边栏中的 Add 按钮,-> Key Type 选择 URI,Key 中粘贴 刚才DTD的一段URL路径
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
-> 然后点击 File System
点击AFileSystem选择你 框架里的DTD在Windows中的路径,说实话这个真挺麻烦的,因为你必须先找到这个jar包位置,然后进去找到DTD的位置。大家也看到我的,我用 maven下载的MyBatis框架,所以它在我的Maven仓库下。教你们个简单方法,DTD可以在网上下载的,或者你进Maven仓库把它复制出来到一个新建文件夹,这样路径会短一点。随便你们,这个事情不是重点,相信你们已经明白了 FileSystem要的就是这个DTD文件的位置。
DTD文件在Windows下的绝对路径弄好之后你再configuration下按ctrl+/ 现在下图画面就表示成功了
此图为约束导入成功OK各位试试看吧,SSM.SSH框架整合的时候也是需要导入约束的,有什么不明白的地方可以下方回复哦,都会一一解答的。
- ?
Java文件上传与下载【面试+工作】
代云
展开
Java实现文件上传与下载【面试+工作】
1.servlet 如何实现文件的上传和下载?
1.1上传文件
通过前台选择文件,然后将资源上传到(即新建一个文件)到发布的资源文件下面,下载就是url 到发布的资源文件,触发即可自动下载。服务器已经封装了如何下载的底层实现。(此处用的是tomcat)JSP上传文件方法: 关于在HTTP request 中通过Post方法提交文件的规范,该项目性能稳定快速,易于部署和使用.本次教程以前端jsp + 后端 servlet的方式,利用JSP上传文件,你也可以完全在jsp中实现而不用servlet.
在开始JSP上传文件之前你要准备以下几个东西:
1. commons-FileUpload 1.3 包
下载地址:http://jakarta.apache.org/commons/fileupload/
2. commons-IO 2.5 包
下载地址:http://jakarta.apache.org/commons/io/
有了上面这些东西我们就可以开始了
1. 新建一个叫Servlet_UploadDownLoad的WEB项目
2. 接着把这两个jar包放到WEB-INF/lib目录中:
3.接下来我们要准备一份如下内容的upload.jsp文件,用来选择要上传的文件,
上面文件中有几个需要注意的地方就是
1. action="UploadServlet" 必须和后面的web.xml配置文件中对servlet映射必须保持一致.
2. method="POST" 这里必须为"POST"方式提交不能是"GET".
3. enctype="multipart/form-data" 这里是要提交的内容格式,表示你要提交的是数据流,而不是普通的表单文本.
4. file1,file2,file3表示你要3个文件一起上传,你也可以一次只上传一个文件.
接下来我们要写一个与上面这个upload.jsp配套的servlet程序,就叫做UploadServlet.java
upload.jsp文件有了,配套的servlet也有了,现在最后剩下的就是怎么让它们配合工作了,接着我们把WEB-INF/web.xml文件请出来,并在该文件中加入以下内容:
写好以后再点击"保存"
把你的upload项目整个拷贝到tomcat的webapps目录下,启动tomcat.打开IE浏览器在地址栏中输入http://localhost:8080/Servlet_UploadDownLoad/upload.jsp怎么样看到JSP上传文件的输入框了吗? 什么,没有看到,出错了! 你仔细检查一下步骤有没有对.
好了,现在我们点击页面上的"浏览"按钮,找到我们要上传的文件,最后点击"Submit",太激动了,还不看一下你的I:\\updir里面有没有你要的东西.
1.2下载文件
1)通过超链接实现下载
在HTML网页中,通过超链接链接到要下载的文件的地址:downloadOne.jsp
"/Servlet_UploadDownLoad/file/commons-beanutils-1.9.3-bin.zip"是文件路径,程序结构如下图:
程序运行后,可以通过单击需要下载文档实现下载
但是这里会出现一个问题,就是单击下载压缩包的时候会弹出下载页面,但是下载图片的时候浏览器就直接打开了图片,没有下载。
这是因为通过超链接下载文件时,如果浏览器可以识别该文件格式,浏览器就会直接打开。只有浏览器不能识别该文件格式的时候,才会实现下载。
因此利用第二种方法实现下载功能。
2)通过Servlet程序实现下载
通过Servlet下载文件的原理是通过servlet读取目标程序,将资源返回客户端。
downloadTwo.jsp
其中,/Servlet_UploadDownLoad 是servlet程序的映射路径
然后新建一个servlet,名称为ServletDownload,URL映射为/ServletDownload
web.xml :
ServletDownload.java :
重启tomcat服务器,即可实现对压缩包和对图片的下载。
2、struts如何实现文件的上传和下载?
2.1struts上传文件
先新建web project ,然后Add Struts Capabilties
struts.xml 的配置:
upload.jsp :
- ?
FasfDFS整合Java实现文件上传下载
凝丹
展开
在上一篇的文章中已经整合了Nginx和FastDFS : FastDFS安装和配置,整合Nginx-1.13.3
今天使用Java代码实现文件的上传和下载。对此作者提供了Java API支持,下载fastdfs-client-java将源码添加到项目中。或者在Maven项目pom.xml文件中添加依赖
当完成以上操作之后可以添加链接FastDFS服务器的配置文件 fastdfs-client.properties
因为项目中只使用properties 格式文件,如果需要更多的配置信息,可以查看官方的配置信息
注: 1. 其他的配置项为可选,fastdfs.tracker_servers 为必须选项
2. 多个tracker_servers可以使用逗号“ , ”分隔
当出现上面和配置文件一致的输出结果时候,说明加载配置文件已经成功。
由于是使用Junit做测试,为了方便在开始执行之前,初始化配置文件和获取连接,同时没有捕获异常全部抛出
注: 如果出现连接超时异常:java.SocketTimeoutException: connect timed out
1 .查看服务器地址和端口是否正确
2 .请查看服务器TrackerServer和StorageServer服务端口是否开启。默认为22122和23000
下面是执行结果
已经将图片上传到服务器,同时返回了图片地址。那么通过这个地址试试能否访问
OK,在浏览器输入地址后,成功返回了图片信息
这里通过storageClient下载文件,然后将数据存储到本地。如果通过浏览器下载,同理将数据写入文件即可
下面是执行结果,不出意外是可以成功执行的
以下是执行结果,获取到的数据和上传的数据一样
输出结果
当数据测试完整之后,试试能否删除吧
删除之后输出结果为0,如果出现非0结果,那么返回的是错误代码
以上是Java实现上传下载等功能的代码,如果需要可以封装成工具类使用。
整篇博文到此为止,不足之处请多多指正。
- ?
整理关于java写入内容到excel的例子供大家参考
占凝天
展开
1POI jar简介
Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。
2POI jar下载
poi下载地址:https://apache.org/dyn/closer.lua/poi/release/bin/poi-bin-3.17-20170915.tar.gz
下载之后把压缩包解压,然后在项目里面引用解压文件夹里面的jar
3新建ReadExcelTest java project,引入poi相关jar
4创建一个WriteExcel java类,编写代码,写入excel里面
package test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class WriteExcel {
private static final String EXCEL_XLS = "xls";
private static final String EXCEL_XLSX = "xlsx";
@SuppressWarnings("rawtypes")
public static void writeExcel(List
String finalXlsxPath) {
OutputStream out = null;
try {
// 获取总列数
int columnNumCount = cloumnCount;
// 读取Excel文档
File finalXlsxFile = new File(finalXlsxPath);
Workbook workBook = getWorkbok(finalXlsxFile);
// sheet 对应一个工作页
Sheet sheet = workBook.getSheetAt(0);
/**
* 删除原有数据,除了属性列
*/
int rowNumber = sheet.getLastRowNum(); // 第一行从0开始算
System.out.println("原始数据总行数,除属性列:" + rowNumber);
for (int i = 1; i <= rowNumber; i++) {
Row row = sheet.getRow(i);
sheet.removeRow(row);
}
// 创建文件输出流,输出电子表格:这个必须有,否则你在sheet上做的任何操作都不会有效
out = new FileOutputStream(finalXlsxPath);
workBook.write(out);
* 往Excel中写新数据
for (int j = 0; j < dataList.size(); j++) {
// 创建一行:从第二行开始,跳过属性列
Row row = sheet.createRow(j + 1);
// 得到要插入的每一条记录
Map dataMap = dataList.get(j);
String name = dataMap.get("title_id").toString();
String address = dataMap.get("title_name").toString();
String phone = dataMap.get("title_name_en").toString();
for (int k = 0; k <= columnNumCount; k++) {
// 在一行内循环
Cell first = row.createCell(0);
first.setCellValue(name);
Cell second = row.createCell(1);
second.setCellValue(address);
Cell third = row.createCell(2);
third.setCellValue(phone);
// 创建文件输出流,准备输出电子表格:这个必须有,否则你在sheet上做的任何操作都不会有效
} catch (Exception e) {
e.printStackTrace();
} finally {
if (out != null) {
out.flush();
out.close();
} catch (IOException e) {
System.out.println("数据汇入成功");
* 判断Excel的版本,获取Workbook
*
* @param in
* @param filename
* @return
* @throws IOException
public static Workbook getWorkbok(File file) throws IOException {
Workbook wb = null;
FileInputStream in = new FileInputStream(file);
if (file.getName().endsWith(EXCEL_XLS)) { // Excel 2003
wb = new HSSFWorkbook(in);
} else if (file.getName().endsWith(EXCEL_XLSX)) { // Excel 2007/2010
wb = new XSSFWorkbook(in);
return wb;
* @param args
public static void main(String[] args) {
List
for(int k=0; k<100;k++){
Map
map = new HashMap (); map.put("title_id", "title_id"+k);
map.put("title_name", "title_name"+k);
map.put("title_name_en", "title_name_en"+k);
mapList.add(map);
writeExcel(mapList, mapList.size(), "D:/360bizhi/readExcel.xlsx");
5运行main进行测试,查看写入结果
写入结果和预期是一样的,说明写入成功
请大家多多关注我的头条号,谢谢大家
- ?
Java实现文件批量导入导出实例(兼容xls,xlsx)
代芙
展开
1、介绍
java实现文件的导入导出数据库,目前在大部分系统中是比较常见的功能了,今天写个小demo来理解其原理,没接触过的同学也可以看看参考下。
目前我所接触过的导入导出技术主要有POI和iReport,poi主要作为一些数据批量导入数据库,iReport做报表导出。另外还有jxl类似poi的方式,不过貌似很久没跟新了,2007之后的office好像也不支持,这里就不说了。
2、POI使用详解
2.1 什么是Apache POI?
Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。
2.2 POI的jar包导入
本次讲解使用maven工程,jar包版本使用poi-3.14和poi-ooxml-3.14。目前最新的版本是3.16。因为3.15以后相关api有更新,部分操作可能不一样,大家注意下。
2.3 POI的API讲解
2.3.1 结构
HSSF - 提供读写Microsoft Excel格式档案的功能。XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。HWPF - 提供读写Microsoft Word格式档案的功能。HSLF - 提供读写Microsoft PowerPoint格式档案的功能。HDGF - 提供读写Microsoft Visio格式档案的功能。
2.3.2 对象
本文主要介绍HSSF和XSSF两种组件,简单的讲HSSF用来操作Office 2007版本前excel.xls文件,XSSF用来操作Office 2007版本后的excel.xlsx文件,注意二者的后缀是不一样的。
HSSF在org.apache.poi.hssf.usermodel包中。它实现了Workbook 接口,用于Excel文件中的.xls格式
常用组件:HSSFWorkbook excel的文档对象HSSFSheet excel的表单HSSFRow excel的行HSSFCell excel的格子单元HSSFFont excel字体HSSFDataFormat 日期格式HSSFHeader sheet头HSSFFooter sheet尾(只有打印的时候才能看到效果)样式:HSSFCellStyle cell样式辅助操作包括:HSSFDateUtil 日期HSSFPrintSetup 打印HSSFErrorConstants 错误信息表
XSSF在org.apache.xssf.usemodel包,并实现Workbook接口,用于Excel文件中的.xlsx格式
常用组件:XSSFWorkbook excel的文档对象XSSFSheet excel的表单XSSFRow excel的行XSSFCell excel的格子单元XSSFFont excel字体XSSFDataFormat 日期格式和HSSF类似;
2.3.3 两个组件共同的字段类型描述
其实两个组件就是针对excel的两种格式,大部分的操作都是相同的。
2.3.4 操作步骤
以HSSF为例,XSSF操作相同。
首先,理解一下一个Excel的文件的组织形式,一个Excel文件对应于一个workbook(HSSFWorkbook),一个workbook可以有多个sheet(HSSFSheet)组成,一个sheet是由多个row(HSSFRow)组成,一个row是由多个cell(HSSFCell)组成。
3、代码操作
3.1 效果图
惯例,贴代码前先看效果图
Excel文件两种格式各一个:
代码结构:
导入后:(我导入了两遍,没做校验)
导出效果:
3.2 代码详解
这里我以Spring+SpringMVC+Mybatis为基础
Controller:
Service
3.3 导出文件api补充
大家可以看到上面service的代码只是最基本的导出。
在实际应用中导出的Excel文件往往需要阅读和打印的,这就需要对输出的Excel文档进行排版和样式的设置,主要操作有合并单元格、设置单元格样式、设置字体样式等。
3.3.1 单元格合并
使用HSSFSheet的addMergedRegion()方法
参数CellRangeAddress 表示合并的区域,构造方法如下:依次表示起始行,截至行,起始列, 截至列
3.3.2 设置单元格的行高和列宽
3.3.3 设置单元格样式
1、创建HSSFCellStyle
2、设置样式
3、将样式应用于单元格
3.3.4设置字体样式
1、创建HSSFFont对象(调用HSSFWorkbook 的createFont方法)
2、设置字体各种样式
3、将字体设置到单元格样式
大家可以看出用poi导出文件还是比较麻烦的,等下次在为大家介绍下irport的方法。
导出的api基本上就是这些,最后也希望上文对大家能有所帮助。
学习Java的同学注意了!!!学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群495273252,我们一起学Java!
java上传excel到数据库
-
1、只需3秒快速实现求和
-
2、如何快速填充序号
-
3、如何自动填充序号(公式法)
-
4、数据条的神奇应用
-
5、多文本快速合并
-
6、查找与替换的不同玩法
-
7、快速定位到指定区域
-
8、数据排序、工资条制作
-
9、快速筛选(模糊、精确筛选)
-
10、快速插入空行
-
11、快速删除空行
-
12.快速跳转到天涯海角
-
13、.同时查看两个Excel文件
-
14、用条件格式扮靓报表
-
15、一键插入Excel图表
-
16、批量处理行高、列宽
-
17、利用拆分功能查看数据
-
18、批量录入相同内容
-
19、工作表快速跳转
-
20、批量录入表格模板(精品课程)
-
21、Excel函数与公式的应用、公式循环引用的查找
-
22、IF函数单条件判断同比增长
-
23、用sum函数 格式相同,连续多表数据汇总
-
24、excel快捷键
-
25、VLOOKUP函数——根据销售员匹配销售额
-
26、统计各部门销售总额
-
27、统计指定条件个数
-
28、怎样输入当前日期和时间、星期数
-
29、销售业绩排名
-
30、Sumproduct函数-万能函数(销售额汇总求和)
-
31、根据销售员,地区,商品名称汇总
-
32、批量替换PPT字体
-
33、给销售额数据批量添加万元单位
-
34、一秒快速核对两列数据
-
35、快速定位到指定单元格或区域
-
36、快速制作双行标题工资条
-
37、给你的表格做个瘦身
-
38、快速打开常用的Excel文件
-
39、快速打开多个Excel文件
-
40、利用创建组—快速隐藏/展开多列数据
-
41、快速制作下拉菜单
-
42、复制粘贴表格,如何保留数据源列宽格式一致?
-
43、两列数据位置互换
-
44、1秒钟扮靓报表——如何实现表格隔行换色
-
45、快速删除重复记录——保留唯一值
-
46、快速向下填充、向右填充,文本或公式
-
47、给Excel文件添加密码
-
48、插入带图片的批注
-
49、输入公式后不计算?
-
50、如何设置单元格缩进
-
51、快速解决Excel表格总显示货币格式
-
52、批量添加万元单位
-
53、你会四舍五入么?
-
54、用RAND函数机选彩票
-
55、冻结首行你会么?
-
56、超链接的高级应用
-
57、IFERROR函数-屏蔽错误值
-
58、批量填充颜色
-
59、录入数据
-
60、快速输入工号
-
61、快速行列转置
-
62、自定义缩放界面
-
63、多个单元格同时输入
-
64、如何计算立方米?
-
65、快速制作双行标题工资条
-
66、输入带方框的√和×
-
67、快速将姓名对齐
-
68、快速输入性别
-
69、按单位职务排序
-
70、自动计算合同到期日期
-
71、计算时间间隔
-
72、日期和时间的拆分
-
73、快速处理不规范的日期格式
-
74、快速填充合并单元格
-
75、效率加倍的快捷键
-
76、快速复制表格和对象
-
77、快速创建工作表副本
-
78、快速复制序列号
-
79、快速显示公式
-
80、多个单元格同时输入
-
81、快速调整显示比例
-
82、快速自动填充
-
83、快速填充(Ctrl+E)
-
84、Ctrl与数字键结合
-
85、快速将多列数据整理为1列
-
86、快速将1列数据拆分为多列
-
87、快速定位公式
-
88、快速录入数据
-
89、快速累计求和
-
90、身份证号码显示为0怎么办?
-
91、快速制作斜线表头
-
92、文本竖向显示
-
93、神奇的监视窗口
-
94、不一样的格式刷
-
95、快速美化图表
-
96、快速生成当前日期
-
97、快速找出循环引用
-
98、快速提取信息
-
99、二维表快速转换为一维表
-
100、快速多表合并