JavaWeb - 文件的上传,核心API的使用,文件下载,附学习笔记 面试整理 进阶书籍

HarmonyOS学习 2021-11-25 19:09:28
java 面试 编程语言 后端开发

返回List集合,集合里面每个部分是FileItem

= setHeaderEncoding(java.lang.String encoding):设置上传文件名称的编码

= setFileSizeMax(long fileSizeMax):设置单个上传文件的大小

= setSizeMax(long sizeMax):设置上传文件的总大小

3.3 FileItem:文件项

(1)普通方法

= boolean isFormField():判断是否是普通输入项,返回boolean,如果返回true是普通输入项

= getFieldName():得到普通输入项name的属性值

= getString():得到普通输入项输入的值

= getString(java.lang.String encoding):输入的值有中文,设置编码

= getName():得到上传文件的名称。在某些浏览器里面得到带路径的名称,截取操作

= getInputStream():得到表单提交的文件的输入流

= delete():删除临时文件

 4、练习:js控制多文件的上传

4.1 需求描述

(1)在上传表单里面,有两个按钮,一个是上传,一个是增加

(2)点击增加按钮时候,增加一个文件上传项和删除按钮

(3)点击删除按钮时候,删除一行内容

(4)点击上传按钮时候,把当前文件上传到服务器

4.2 使用js增加一行和删除一行

(1)代码

//增加一行

function addFile() {

//得到div

var div1 = document.getElementById(“div1”);

div1.innerHTML += “<div><input type=‘file’ name=‘filename’/><input type=‘button’ value=‘删除’ onclick=‘del1(this);’/></div>”;

}

//删除一行

function del1(who) {

//因为要删除文件上传项和删除按钮,这两个内容都在div里面,删除div就可以了

//得到当前点击的删除按钮所在的div

var div = who.parentNode;

//删除div,使用dom里面的方法 removeChild(),不能自己删除自己,通过父标签删除

//得到要删除div的父标签

var div1 = div.parentNode;

div1.removeChild(div);

}

4.3 使用button提交表单

(1)代码

//提交表单,实现上传(使用button提交的表单)

function uploadfile() {

//得到form标签

var form1 = document.getElementById(“form1”);

form1.submit();

}

 5、文件上传问题的解决

5.1 文件重名的问题

(1)如果上传了多个项目名称的文件,最后一次上传的文件,把之后的文件给覆盖了。

5.2 解决方法

(1)在上传的文件名称里面,添加一个随机的唯一的字符串,保证每个文件名称都是唯一的一个值

(2)生成一个随机的唯一的值

第一种方式:使用毫秒数实现

第二种方式:使用UUID工具类实现

(3)代码

//在文件名称里面添加随机的唯一的值

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

//uuid_filename

filename = uuid+“_”+filename;

 第二部分:文件的下载


 1、什么是文件的下载

1.1 把服务器上文件保存到本地硬盘,这个过程称为文件的下载

1.2 文件下载的实现方式:有两种实现方式

第一种方式:使用超链接实现文件的下载

(1)如果要下载的文件是图片格式,直接在浏览器里面打开;如果下载的是zip格式的文件,才会

提示下载。最终:无论什么格式都是一下载方式打开。

第二种方式:通过代码实现文件的下载

(1)实现的步骤

第一步:设置要下载文件的MIME类型,设置头信息 Content-Disposition,无论是什么格式,都是以下载方式打开

第二步:从服务器上得到要下载的文件的输入流

第三步:创建输出流,通过输出流把文件写到浏览器

第四步:流对接,关闭流

 2、代码实现文件的下载

2.1 实现的步骤

第一步:设置要下载文件的MIME类型,设置头信息 Content-Disposition,无论是什么格式,都是以下载方式打开

= 设置mime类型

//设置要下载文件的mime类型

String type = getServletContext().getMimeType(filename);

//设置mime类型

response.setContentType(type);

= 设置头信息

response.setHeader(“Content-Disposition”, “attachment;filename=”+filename);

第二步:从服务器上得到要下载的文件的输入流

//得到要下载文件的输入流

InputStream in = new FileInputStream(path);

第三步:创建输出流,通过输出流把文件写到浏览器

OutputStream out = response.getOutputStream();

第四步:流对接,关闭流

2.2 下载文件名称包含中文的乱码问题解决

(1)不同的浏览器有不同的编码,ie浏览器采用的url编码,火狐采用base64编码

(2)区分不同的浏览器

= 在请求头 User-Agent,得到当前请求的浏览器的类型

(3)代码

//得到当前请求的浏览器类型 ,使用头 User-Agent

String agent = request.getHeader(“User-Agent”);

if(agent.contains(“Firefox”)) {//如果是火狐浏览器

//base64编码

filename = “=?UTF-8?B?”+

new BASE64Encoder().encode(filename.getBytes(“utf-8”))+“?=”;

} else {

//url编码

filename = URLEncoder.encode(filename, “UTF-8”);

}

 第三部分:注解


 1、什么是注解

1.1 是jdk5.0的新特性

(1)jdk5.0很多新特性:泛型、自动拆装箱、增强for循环、可变参数、枚举…

1.2 注解不是注释

(1)注释:给程序员看的

(2)注解:给程序看的

(3)注解就是代码里面的特殊标记,主要功能替代配置文件

其实就是代码里的特殊标记, 它用于替代配置文件,

也就是说,传统方式通过配置文件告诉类如何运行,

有了注解技术后,开发人员可以通过注解告诉类如何运行。

在Java技术里注解的典型应用是:可以通过反射技术去得到类里面的注解,以决定怎么去运行类。

1.3 写法

(1) @注解的名称

(2)可以使用在方法上面,也可以是类上面

 2、jdk里面的三个注解

(1) @Override: 限定重写父类方法, 该注解只能用于方法

(2) @SuppressWarnings: 抑制编译器警告.

= @SuppressWarnings(“all”)

= 不影响程序的运行

(3) @Deprecated: 用于表示某个程序元素(类, 方法等)已过时

= 不影响程序的运行

 3、自定义注解

3.1 定义的方式:使用关键字 @interface 注解名称

(1) @interface MyAnno { }

3.2 声明注解的属性

(1)类型 属性的名称();

@interface MyAnno {

//定义属性

String aa();

int bb();

}

3.3 如果定义属性类型是Date类型,报错

Invalid type Date for the annotation attribute MyAnno.date;

only primitive type, String, Class, annotation, enumeration are permitted

or 1-dimensional arrays thereof

(1)属性允许的类型:基本数据类型、string、Class、注解、枚举,一维数组

(2)代码

//自定义注解

@interface MyAnno {

//定义属性

String aa();

int bb();

//定义Date类型

// Date date();

//定义Class类型

Class clazz();

//定义注解

anno ann();

//定义枚举类型

Color c();

//定义一维数组

String[] arr();

}

(3)使用自定义注解

@MyAnno(aa=“qq”,bb=1,clazz=TestAnno01.class,ann=@anno,c=Color.RED,arr={“aa”,“bb”})

3.4 特殊属性value

(1)如果把属性的名称写成value,在使用这个注解的时候value可以省略不写

3.5 元注解

(1)修饰注解的注解

@Retention:修饰注解使用范围,自定义一个注解,在默认的情况下是源代码阶段

RetentionPolicy.CLASS: 编译器将把注解记录在 class 文件中. 当运行 Java 程序时, JVM 不会保留注解. 这是默认值

RetentionPolicy.RUNTIME:编译器将把注释记录在 class 文件中. 当运行 Java 程序时, JVM 会保留注解. 程序可以通过反射获取该注释

RetentionPolicy.SOURCE: 编译器直接丢弃这种策略的注释

@Retention(RetentionPolicy.RUNTIME)

@Target:指定注解用于修饰类的哪个成员.

@Target 包含了一个名为 value,类型为ElementType的成员变量。

@Target({ElementType.METHOD,ElementType.PARAMETER})

@Documented: 用于指定被该元 Annotation 修饰的 Annotation 类将被 javadoc 工具提取成文档.

@Inherited: 被它修饰的 Annotation 将具有继承性.

如果某个类使用了被 @Inherited 修饰的 Annotation, 则其子类将自动具有该注解

 4、使用反射+注解完成两个练习

4.1 使用反射+注解实现模拟单元测试的效果

(1)什么是单元测试 junit

= 测试一个类中的方法,使用注解方式进行操作 @Test

= 在要测试方法上面添加注解 @Test,选择要测试的方法,点击右键 run as —> junit test

= 运行之后,在工具里面出现一个JUNIT,有一个绿色的条,表示测试通过了

= 运行之后,在工具里面出现一个JUNIT,如果有红棕色条,表示测试失败

= 在方法上面有 @Test注解,这个方法就可以运行

= @Ignore :当前的方法不参与单元测试

(2)实现的步骤

  • 1、得到要测试方法所在类的Class

  • = 有三种方式

  • 第一种:类名.class

  • 第二种:对象.getClass()

  • 第三种:Class.forName(“包类路径”)

  • 2、得到类中的所有的方法

  • Method[] getMethods() ,返回方法的数组

  • 3、遍历数组,得到类中的每个方法

  • 4、判断方法上面是否有注解

  • boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)

  • = 参数:注解的Class

  • 5、如果有注解,让方法执行

  • invoke(Object obj, Object… args)

  • = 第一个参数是类实例;第二个参数执行方法里面的参数

(3)自定义的注解,在默认情况下作用范围是源代码阶段,使用元注解设置的作用范围

(4)代码

//得到要测试方法所在类的Class

Class clazz = TestJunit02.class;

//得到类中的所有的方法

总结

这个月马上就又要过去了,还在找工作的小伙伴要做好准备了,小编整理了大厂java程序员面试涉及到的绝大部分面试题及答案,希望能帮助到大家

JavaWeb - 文件的上传,核心API的使用,文件下载,附学习笔记 面试整理 进阶书籍_后端开发

JavaWeb - 文件的上传,核心API的使用,文件下载,附学习笔记 面试整理 进阶书籍_Java_02

本文已被 CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

版权声明
本文为[HarmonyOS学习]所创,转载请带上原文链接,感谢
https://blog.51cto.com/u_15438507/4690515

  1. jQuery-实例方法
  2. jQuery-dom和jQuery,入口函数(基本知识)
  3. JavaScript-this指向问题
  4. JavaScript-封装与继承(两种)
  5. JavaScript-包装类型
  6. JavaScript-传值(引用类型,基本类型)
  7. JavaScript-面向对象(构造函数,实例成员,静态成员)
  8. JavaScript-解构赋值
  9. JavaScript-箭头函数
  10. JavaScript-参数
  11. JavaScript-预解析(变量提升)
  12. JavaScript-闭包closure
  13. JavaScript-声明变量的关键字
  14. JavaScript - mot - clé pour déclarer une variable
  15. Fermeture de fermeture JavaScript
  16. JavaScript Pre - parse (promotion des variables)
  17. Paramètres JavaScript
  18. Fonction de flèche JavaScript
  19. JavaScript - déconstruction assignations
  20. Common annotations in springboot
  21. Building CentOS 7.6 with Linux
  22. JavaScript - orienté objet (constructeur, membre d'instance, membre statique)
  23. JavaScript value Transfer (reference type, Basic type)
  24. JavaScript - type d'emballage
  25. linux deepin/ubuntu安装flameshot火焰截图
  26. JavaScript - encapsulation et héritage (deux)
  27. JavaScript JS method for writing 99 multiplication table
  28. 從零開始學java - 第二十五天
  29. Apprendre Java à partir de zéro - jour 25
  30. Les voitures d'hiver, les voitures électriques et les voitures à essence ne sont pas les mêmes?
  31. JavaScript - ceci pointe vers le problème
  32. Copie JavaScript
  33. Spring boot quickly integrates swagger
  34. linux deepin/ubuntu安裝flameshot火焰截圖
  35. Capture d'écran de flamme de l'installateur de flamme Linux deepin / Ubuntu
  36. Jquery DOM et jquery, fonctions d'entrée (bases)
  37. Méthode d'instance jquery
  38. Méthode et démonstration de code dans l'interface de liste en Java
  39. 【错误记录】Java 中 ArrayList 排序 ( 使用 Comparator 接口时注意 compare 返回值是 -1 和 +1 )
  40. Démarrage du Zookeeper
  41. Java oom Cognition
  42. Java 开发者最困惑的四件事,值得一看!,BAT面试文档
  43. Java 将两个对象list里面的 某个字段值抽取到一个list里,java选择排序原理
  44. Java 多线程 —— 生产者消费者问题,从基础到深入案例
  45. Java 中设计模式 之 工厂模式,java反射机制的底层原理
  46. 【錯誤記錄】Java 中 ArrayList 排序 ( 使用 Comparator 接口時注意 compare 返回值是 -1 和 +1 )
  47. 【 enregistrement des erreurs 】 tri ArrayList en Java (Notez que les valeurs de retour de comparaison sont - 1 et + 1 lors de l'utilisation de l'interface de comparaison)
  48. Pourquoi Xiaopeng P5 est - il devenu un grand succès dans le cercle? Le Salon de l'automobile de Guangzhou montre encore des compétences polyvalentes
  49. Java 開發者最困惑的四件事,值得一看!,BAT面試文檔
  50. Les quatre choses les plus déroutantes pour les développeurs Java valent la peine d'être regardées! Document d'entrevue sur les MTD
  51. k8s-Pod污点与容忍
  52. k8s-Pod污点与容忍
  53. K8s POD Contamination and Tolerance
  54. K8s POD Contamination and Tolerance
  55. mysql常用语句——GROUP BY和HAVING
  56. Spring boot quickly integrates swagger
  57. mysql常用語句——GROUP BY和HAVING
  58. MySQL Common statements - group by and having
  59. Le défi du pinceau leetcode - Javascript: 110. Arbre binaire équilibré
  60. [notes d'apprentissage de première ligne] day44: XMLHttpRequest