监听器&上传下载&I18N
监听器(Listener)
监听Java对象 的方法调用和属性改变()
web的一个组件
事件驱动编程:事件源,事件名称,事件响应函数,事件对象
以后在Spring中的配置
WEB中有哪些监听器? 作用域生命周期监听器 作用域属性监听器
作用域的生命周期监听器: 负责监听request,session,application的创建和销毁.
ServletRequestListener:
HttpSessionListener:
ServletContextListener: 监听系统启动时,直接编写初始化代码.
作用域属性监听器
作用域的属性监听器(添加/删除/替换属性):
ServletRequestAttributeListener:
HttpSessionAttributeListener:
ServletContextAttributeListener
进行配置(webxml, 标签配置)1<listener><listener-class>包名。类名<listener-class><listener>
@webListener
上传功能
想要上传,我们在前台(页面上)需要一个上传的控件,让用户可以通过这个控件选择文件。
<input type="file" name="heading">
reg.jsp |
<form action="/upload" method="post"> 用户:<input type="text" name="name" /> <br /> 密码:<input type="password" name="pwd" /> <br /> 头像:<input type="file" name="headImg" /> <br /> <input type="submit" value="注册"> </form> |
咱们的Servlet中拿到的是一个文件的名称(字符串)
最后想要的肯定是一个二进制的流
重要:上传时,我们表单的请求类型必需设置成multipart/form-data
上传的method必需是POST的
上传流的请求头信息
content-type
咱们Servlet中拿到的值与数据必需是经过编码的值,而现在我们无法拿到任何值了。这里如果要拿到值
1 准备一个form表单,里面有一个上传,form表单的类型必需是multipart/form-data
2 准备一个上传的Servlet,到后台接收传过来的普通表单数据 与 文件(二进制)
3 导入相应的FileUpload jar包 (commons-fileupload-1.2.2.jar ,commons-io-1.4.jar)
完成上传功能
完成文件上传重要方法:
fileItem.write(File file);
FileItemd对象就是从request中获得数据对象,
通过调用它的write把其中的数据写入到磁盘文件(File file)
//boolean isMultipart = ServletFileUpload.isMultipartContent(req);
try {
//创建一个磁盘工厂对象
FileItemFactory factory = new DiskFileItemFactory();
//创建文件 上传处理器
ServletFileUpload upload = new ServletFileUpload(factory);
//解析请求(生成FileItem对象放到集合中)
//FileItem对象:对表单中的每一个表单控制做的封装 <input type="text" name="name" />
List<FileItem> items = upload.parseRequest(req);
for (FileItem fileItem : items) {
if(fileItem.isFormField()){
//代表是一般表单,用一般表单的处理方式解决即可
}else{
//拿到文件的名称
String fileName = fileItem.getName();
//最后文件上传的位置
File uploadFile = new File("D:/",fileName);
//将本地的文件写到服务器中
fileItem.write(uploadFile);
}
}
} catch (Exception e) {
e.printStackTrace();
}
上传细节处理
IE低版本的文件名称Bug解决
修改前
String filename=fileItem.getname();
修改后
String filename=FilenameUtil.getName(fileItem.getname());
上传文件的名称冲突问题
代码分析: |
//拿到文件的名称String fileName = FilenameUtils.getName(fileItem.getName());//拿到文件的后缀String extName = FilenameUtils.getExtension(fileName);//生成随机的名称String fileUUIDName = UUID.randomUUID().toString();//结合成我们的随机名称(带后缀)String randomFileName = fileUUIDName+"."+extName;//最后文件上传的位置File uploadFile = new File("D:/",randomFileName); |
将文件存在本项目中
在自己的项目下根目录下面创建一个upload文件夹,然后把所有上传的文件保存在这个目录下即可:
super.getServletContext().getRealPath("/"); 我们upload文件夹的路径,然后把上传的文件保存到这个文件夹中了。
代码:拿到本项目中的路径 |
//最后文件上传的位置String realPath = super.getServletContext().getRealPath("/upload");File uploadFile = new File(realPath,randomFileName); |
普通字段获取
if(fileItem.isFormField()){//代表是一般表单,用一般表单的处理方式解决即可//拿到字段的名称(请参照表单控制的name属性)String fieldName = fileItem.getFieldName();//拿到相应字段的值String value = fileItem.getString("UTF-8");System.out.println(fieldName+":"+value);}else{//上传文件的代码} |
设置缓存大小与临时目录
设置缓存大小: |
factory.setSizeThreshold(1024 * 10 * 5); //50KB //设置缓存大小 |
设置临时目录: |
factory.setRepository(new File("C:/temp")); //设置临时目录 |
设置文件大小
//得到一个文件的最大值 -1代表没有上限 |
upload.setFileSizeMax(1024 * 10* 2); //20KB |
//代表所有请求的大小 -1代表没有上限 |
upload.setSizeMax(1024 * 1024 * 2); // 2M |
上传工具类(FileUtil)
把我们要抽取的这段重复代码直接写到工具方法中
该方法中需要的一些参数咱们直接传过去
提供更好的灵活性,对工具类进行修改
我们要提供一个工具类FileUtil,然后添加一个静态方法uploadImg
咱们现在在工具类上加一个功能:确定我们要上传的图片类型!
//准备只支持的图片类型private static final String[] IMG_TYPE = {"jpg","png","gif","bmp"};/*** 如果我的工具类要检查文件的类型,怎么做?* @param req*/public static void upload(HttpServletRequest req){try {DiskFileItemFactory factory = new DiskFileItemFactory();ServletFileUpload upload = new ServletFileUpload(factory);upload.setFileSizeMax(1024*1024*2);//单个文件最大2Mupload.setSizeMax(1024*1024*3);//总大小最大3MList<FileItem> items = upload.parseRequest(req);for (FileItem fileItem : items) {if(fileItem.isFormField()){//代表是一般表单,用一般表单的处理方式解决即可//拿到字段的名称(请参照表单控制的name属性)String fieldName = fileItem.getFieldName();//拿到相应字段的值String value = fileItem.getString("UTF-8");System.out.println(fieldName+":"+value);}else{//拿到文件的名称String fileName = FilenameUtils.getName(fileItem.getName());//拿到文件的后缀String extName = FilenameUtils.getExtension(fileName);//如果图片类型不匹配,if(!Arrays.asList(IMG_TYPE).contains(extName)){//给出错误提示throw new RuntimeException("亲,你上传的图片类型不匹配!");}//生成随机的名称String fileUUIDName = UUID.randomUUID().toString();//结合成我们的随机名称(带后缀)String randomFileName = fileUUIDName+"."+extName;//最后文件上传的位置String realPath = req.getServletContext().getRealPath("/upload");File uploadFile = new File(realPath,randomFileName);//将本地的文件写到服务器中fileItem.write(uploadFile);}}}catch(RuntimeException e){throw e;}catch (Exception e) {e.printStackTrace();}} |
第一个问题:拿不到当前表单字段值(只能在工具类中打印没有意义)
第二个问题:文件上传后,我们拿到不到上传的文件的数据(文件名称与路径)
注意了:上面的数据我们以后很有可能需要拿到并上传到数据库
们准备两个容器(就是集合),然后一个容器装普通表单,一个窗口装上传的文件数据。
由于可能会出现多文件上传!而一个文件对应的属性有很多,于是我们需要把文件单独进行一个对象的封装(这个在以后的实际开发中是非常有必要的)。于是我们准备了一个CFile对象还封装文件对象。
CFile |
//文件对象public class CFile {private String name;private String path;//提供getter,setter 。。。} |
FileUtil |
Servlet中完整代码 |
try {//装普通form的容器Map<String,String> fieldMap = new HashMap<String,String>();//装文件的容器Map<String,CFile> filesMap = new HashMap<String,CFile>();FileUtil.upload(req,fieldMap,filesMap);System.out.println(fieldMap);System.out.println(filesMap);} catch (RuntimeException e) {req.setAttribute("errorMsg", e.getMessage());req.getRequestDispatcher("/reg.jsp").forward(req, resp);} |
下载功能
超连接下载功能:
download.jsp |
<a href="/download?filename=aa.rar">aa.rar</a><br /><a href="/download?filename=美女.rar">美女.rar</a><br /><a href="/download?filename=用户.rar">用户.rar</a><br /><a href="/download?filename=用户.png">用户.png</a><br /> |
·
@WebServlet("/download")public class DownLoadServlet extends HttpServlet{@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {//告诉浏览器文件应该被下载,而不是被直接打开(IE6直接打开)resp.setContentType("application/x-msdownload");//得到文件名String filename = req.getParameter("filename");//得到文件的真实路径String realpath = super.getServletContext().getRealPath("/download");//拿到咱们要下载的文件File file = new File(realpath, filename);//解决乱码问题(兼容IE与火狐)/*** 这里注意:这个MSIE只对IE低版本有效,高版本又需要单独处理*/String userAgent = req.getHeader("User-Agent");if(userAgent.contains("MSIE")){filename = URLEncoder.encode(filename, "UTF-8");}else{filename = new String(filename.getBytes("UTF-8"),"ISO-8859-1");}解决下载文件全部都是download名字resp.setHeader("Content-Disposition", "attachment; filename="+filename);//将文件下载到本地/*** 两个参数:第一个参数相当于拿到程序中的真实文件* 第二个参数拿到我们的响应输出流* 然后通过流将文件从程序拷备到客户端*/Files.copy(Paths.get(file.getAbsolutePath()), resp.getOutputStream());}} |
监听器&上传下载&I18N的更多相关文章
- 【FTP】FTP文件上传下载-支持断点续传
Jar包:apache的commons-net包: 支持断点续传 支持进度监控(有时出不来,搞不清原因) 相关知识点 编码格式: UTF-8等; 文件类型: 包括[BINARY_FILE_TYPE(常 ...
- SpringMVC 上传下载 异常处理
SpringMVC 上传下载 异常处理 上一章节对SpringMVC的表单验证进行了详细的介绍,本章节介绍SpringMVC文件的上传和下载(重点),国际化以及异常处理问题.这也是SpringMVC系 ...
- JAVAWEB之文件的上传下载
文件上传下载 文件上传: 本篇文章使用的文件上传的例子使用的都是原生技术,servelt+jdbc+fileupload插件,这也是笔者的习惯,当接触到某些从未接触过的东西时,总是喜欢用最原始的东西将 ...
- JavaWeb 文件上传下载
1. 文件上传下载概述 1.1. 什么是文件上传下载 所谓文件上传下载就是将本地文件上传到服务器端,从服务器端下载文件到本地的过程.例如目前网站需要上传头像.上传下载图片或网盘等功能都是利用文件上传下 ...
- javaEE(14)_文件上传下载
一.文件上传概述 1.实现web开发中的文件上传功能,需完成如下二步操作: •在web页面中添加上传输入项•在servlet中读取上传文件的数据,并保存到本地硬盘中. 2.如何在web页面中添加上传输 ...
- SpringMVC实现上传下载功能
配置资源(jar包) 将前端页面整理好: 写核心的几个配置文件(applicationContext+wed.xml+jdbc.properties+log4j+springMVC.xml) 都是在s ...
- java+大文件上传下载
文件上传下载,与传统的方式不同,这里能够上传和下载10G以上的文件.而且支持断点续传. 通常情况下,我们在网站上面下载的时候都是单个文件下载,但是在实际的业务场景中,我们经常会遇到客户需要批量下载的场 ...
- 转载:JavaWeb 文件上传下载
转自:https://www.cnblogs.com/aaron911/p/7797877.html 1. 文件上传下载概述 1.1. 什么是文件上传下载 所谓文件上传下载就是将本地文件上传到服务器端 ...
- Jmeter 上传下载文件
最近很多同学都在问jmeter上传.下载文件的脚本怎么做,要压测上传.下载文件的功能,脚本怎么做,网上查了都说的很含糊,这次呢,咱们就好好的把jmeter的上传下载文件好好缕缕,都整明白了,怎么个过程 ...
随机推荐
- 【Unity】项目工程源码
Unity开发者俱乐部 http://blog.csdn.net/dingxiaowei2013/article/details/50605208 游戏蛮牛 9秒社团 6m5m raywenderli ...
- mysql查询某一个字段是否包含中文字符
在使用mysql时候,某些字段会存储中文字符,或是包含中文字符的串,查询出来的方法是: SELECT col FROM table WHERE length(col)!=char_length(col ...
- spring-boot-actuator报错Full authentication is required to access this resource
解决办法[设置端点访问 ]: 1, 关闭验证 management.security.enabled=false 2,开启HTTP basic认证 - 添加依赖 <dependency> ...
- jq 日期区间处理
<html lang="en"><head> <meta charset="UTF-8"> <title>Tit ...
- 使用Spring Cloud Feign作为HTTP客户端调用远程HTTP服务
在Spring Cloud Netflix栈中,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端.我们可以使用JDK原生的URLConnection.Ap ...
- java基础---->java8中的函数式接口
这里面简单的讲一下java8中的函数式接口,Function.Consumer.Predicate和Supplier. 函数式接口例子 一.Function:接受参数,有返回参数 package co ...
- AS 常用快捷键
上篇中我们讲了Android Studio如何添加插件,这篇我们讲讲AS的快捷键,这里我说明的快捷键都是最最实用的,希望刚刚加入AS的朋友尽快的熟悉一下这几个快捷键,这样可以帮助你提高coding的效 ...
- nw.js---开发一个百度浏览器
使用nw.js开发一个简单的百度浏览器就很简单了,只需要在配置里面写入: { // "main": "index.html", "main" ...
- python2.7.X 升级至Python3.6.X
安装Python3 项目是在py3环境下进行编码的,正好yczhang默认的py版本是2,我们还需要安装py3才能让程序run起来,在此之前,需要安装开发工具包,因为要编译安装Python [root ...
- python接口自动化测试(c测试环境的准备)
接口测试的方式有很多,比如可以用工具(jmeter,postman)之类,也可以自己写代码进行接口测试,工具的使用相对来说都比较简单,重点是要搞清楚项目接口的协议是什么,然后有针对性的进行选择,甚至当 ...