监听器(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);//单个文件最大2M

upload.setSizeMax(1024*1024*3);//总大小最大3M

List<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{

@Override

protected 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的更多相关文章

  1. 【FTP】FTP文件上传下载-支持断点续传

    Jar包:apache的commons-net包: 支持断点续传 支持进度监控(有时出不来,搞不清原因) 相关知识点 编码格式: UTF-8等; 文件类型: 包括[BINARY_FILE_TYPE(常 ...

  2. SpringMVC 上传下载 异常处理

    SpringMVC 上传下载 异常处理 上一章节对SpringMVC的表单验证进行了详细的介绍,本章节介绍SpringMVC文件的上传和下载(重点),国际化以及异常处理问题.这也是SpringMVC系 ...

  3. JAVAWEB之文件的上传下载

    文件上传下载 文件上传: 本篇文章使用的文件上传的例子使用的都是原生技术,servelt+jdbc+fileupload插件,这也是笔者的习惯,当接触到某些从未接触过的东西时,总是喜欢用最原始的东西将 ...

  4. JavaWeb 文件上传下载

    1. 文件上传下载概述 1.1. 什么是文件上传下载 所谓文件上传下载就是将本地文件上传到服务器端,从服务器端下载文件到本地的过程.例如目前网站需要上传头像.上传下载图片或网盘等功能都是利用文件上传下 ...

  5. javaEE(14)_文件上传下载

    一.文件上传概述 1.实现web开发中的文件上传功能,需完成如下二步操作: •在web页面中添加上传输入项•在servlet中读取上传文件的数据,并保存到本地硬盘中. 2.如何在web页面中添加上传输 ...

  6. SpringMVC实现上传下载功能

    配置资源(jar包) 将前端页面整理好: 写核心的几个配置文件(applicationContext+wed.xml+jdbc.properties+log4j+springMVC.xml) 都是在s ...

  7. java+大文件上传下载

    文件上传下载,与传统的方式不同,这里能够上传和下载10G以上的文件.而且支持断点续传. 通常情况下,我们在网站上面下载的时候都是单个文件下载,但是在实际的业务场景中,我们经常会遇到客户需要批量下载的场 ...

  8. 转载:JavaWeb 文件上传下载

    转自:https://www.cnblogs.com/aaron911/p/7797877.html 1. 文件上传下载概述 1.1. 什么是文件上传下载 所谓文件上传下载就是将本地文件上传到服务器端 ...

  9. Jmeter 上传下载文件

    最近很多同学都在问jmeter上传.下载文件的脚本怎么做,要压测上传.下载文件的功能,脚本怎么做,网上查了都说的很含糊,这次呢,咱们就好好的把jmeter的上传下载文件好好缕缕,都整明白了,怎么个过程 ...

随机推荐

  1. 分布式任务&分布式锁

    目前系统中存在批量审批.批量授权等各个操作,批量操作中可能因为处理机器.线程不同,造成刷新缓存丢失授权等信息,如批量审批同一用户权限多个权限申请后,流程平台并发的发送多个http请求到acl不同服务器 ...

  2. Houdini技术体系 基础管线(一) : Houdini与Houdini Engine的安装

    Houdini 下载与安装 在官网 https://www.sidefx.com/download/ 下载最新的Production Build 版本,当前是16.5版本,需要注册帐号 PS:公司内网 ...

  3. 抖音圈圈乐 系统搭建H5微信小游戏圈圈乐系统介绍

    网红线下游戏抖音圈圈乐改造而来 一.搭建此系统需要准备如下资料: 1. 认证微信服务号 2. 微信支付商户号 3. 备案域名及云服务器 二.系统功能简介: 1. 游戏闯关 2. 每个商品闯关难度后台自 ...

  4. MTK 音量加减键修改为默认控制媒体音量

    frameworks/base/media/java/android/media/AudioService.java: private int getActiveStreamType(int sugg ...

  5. C#实现复杂XML的序列化与反序列化

    已知.xml(再此命名default.xml)文件,请将其反序列化到一个实例对象. Default.XML文件如下: <?xml version="1.0" encoding ...

  6. python2与python3中除法的区别

    python2中的除法 >>>1/2 0 即一个整数(无小数部分的数)被另外一个整数除,计算结果的小数部分被截除了,只留下了整数部分 有时候,这个功能比较有用,譬如在做一些需要取位数 ...

  7. Zephyr学习(二)开发环境搭建

    一.概述 Zephyr支持在Windows.Linux和MacOS环境下开发,这里只介绍如何在Windows下搭建zephyr的开发环境. 二.步骤 2.1安装msys2 msys2是一个Linux模 ...

  8. Linux下的awk文本分析命令实例(二)

    awk实现求和.平均.最大值和最小值的计算操作 准备和数据文件 [finance@master2-dev ~]$ cat data.txt 求和 [finance@master2-dev ~]$ ca ...

  9. php操作redis案例

    <?php     //实例化     $redis = new Redis();     //连接服务器     //默认端口是6379,可不写     $redis->connect( ...

  10. linux基础操作1

    date #查看日期cal #查看当月日历cal 2017 #查看某年全年的日历whoami #查看当前登录的用户 #修改网卡,可以上网的步骤vi /etc/sysconfig/network-scr ...