• 监听器,文件上传,文件下载


    监听器

    监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。

    servlet中的监听器

    三种监听器

    监听三个域对象创建和销毁的事

    件监听器
    监听域对象中属性的增加和删除的事件监听器
    监听绑定到 HttpSession 域中的某个对象的状态的事件监听器。(查看API文档)

    监听servletContext域对象创建和销毁

    创建:服务器启动针对每一个web应用创建servletcontext
    销毁:服务器关闭前先关闭代表每一个web应用的servletContext

     监听HttpSession域对象创建和销毁

    创建一个Session时,sessionCreated(HttpSessionEvent se) 方法将会被调用。
    销毁一个Session时,sessionDestroyed (HttpSessionEvent se) 方法将会被调用。

     

    监听HttpRequest域对象创建和销毁

    Request 对象被创建时,监听器的requestInitialized方法将会被调用。
    Request对象被销毁时,监听器的requestDestroyed方法将会被调用。

    attributeAdded 方法

    public void attributeAdded(ServletContextAttributeEvent scae) 
    public void attributeAdded (HttpSessionBindingEvent  hsbe) 
    public void attributeAdded(ServletRequestAttributeEvent srae)

    attributeRemoved 方法

    public void attributeRemoved(ServletContextAttributeEvent scae) 
    public void attributeRemoved (HttpSessionBindingEvent  hsbe) 
    public void attributeRemoved (ServletRequestAttributeEvent srae)

    attributeReplaced 方法

    public void attributeReplaced(ServletContextAttributeEvent scae) 
    public void attributeReplaced (HttpSessionBindingEvent  hsbe) 
    public void attributeReplaced (ServletRequestAttributeEvent srae)

     文件上传

    浏览器端

    method=post 只有post才可以携带大数据 

    encType="multipart/form-data"

    必须使用<input type='file' name='f'>要有name属性

    服务器端

    它有一个方法  getInputStream(); 可以获取一个字节输入流,通过这个流,可以读取到所有的请求正文信息.

    使用包

    commons-fileupload-1.2.1.jar  文件上传

    commons-io-1.4.jar 它是提供的io工具

    commons-fileupload

    1.DiskFileItemFactory类
    2.ServletFileUpload类
    3.FileItem

    使用流程

    创建一个DiskFileItemFactory
    DiskFileItemFactory factory=new DiskFileItemFactory();
    
    创建ServletFileUpload类    
    ServletFileUpload upload=new ServletFileUpload(factory);        
    
    解析所有上传数据
    List<FileItem> items = upload.parseRequest(request);
        fileItem指的是表单中的每一个收集信息的'框'
                

    DiskFileItemFactory(可以设置缓存大小以及临时文件保存位置)

    作用:可以设置缓存大小以及临时文件保存位置.            
    默认缓存大小是  10240(10k).
        如果缓存能够存下上传的文件就不会存在临时文件,如果缓存太小不能存储上传文件,就会存到临时文件中,当item.getInputStream();时,就去缓存中找或者临时文件中找
    临时文件默认存储在系统的临时文件目录下.[环境变量中可以查看]
    1.new DiskFileItemFactory();
        缓存大小与临时文件存储位置使用默认的.
    2.DiskFileItemFactory(int sizeThreshold, File repository) 
        sizeThreshold :缓存大小
        repository:临时文件存储位置
    注意,对于无参数构造,也可以设置缓存大小以及临时文件存储位置.    
     setSizeThreshold(int sizeThreshold)
     setRepository(File repository)
        this.getServletContext.getRealPath("/temp");
            得到的路径是:该项目部署到服务器上的位置[绝对位置][很重要]

    ServletFileUpload

    1.ServletFileUpload upload=new ServletFileUpload(factory);
     创建一个上传工具,指定使用缓存区与临时文件存储位置.
    2.List<FileItem> items=upload.parseRequest(request);
    它是用于解析request对象,得到所有上传项.每一个FileItem就相当于一个上传项.
    3.boolean flag=upload.isMultipartContent(request);
    用于判断是否是上传.
    可以简单理解,就是判断encType="multipart/form-data";
    4.设置上传文件大小
        void setFileSizeMax(long fileSizeMax) 设置单个文件上传大小 
        void  setSizeMax(long sizeMax) 设置总文件上传大小 
    5.解决上传文件中文名称乱码
        upload.setHeaderEncoding("utf-8");
        注意:如果使用reqeust.setCharacterEncoding("utf-8")也可以,但不建议使用。
        

    FileItem

    1.isFormField
        用于判断是否是上传组件.
        如果是<input type="file">返回的就是false,否则返回true.
        
    2.getFieldName();
        返回值String,得到组件名称  <input name="">
    3.getName();
        返回值是String,得到的是上传文件的名称.
        注意:浏览器不同,它们得到的效果不一样。
            1.包含全路径名称  例如: C:UsersAdministratorDesktopa.txt
            2.只包含上传文件名称 例如:a.txt
            
    4.getString();
        这个方法可以获取非上传组件的内容,相当于  getParameter方法作用。
        
        问题:如果信息是中文,会出现乱码,解决方案  getString("utf-8");
        
        如果是上传组件,上传的文件是文本文件,可以获取到文件文件的内容。
        但是如果不是文件文件,例如:是一张图片,这样获取合适吗?
    5.获取上传文件的内容,保存到服务器端.
        item.getInputStream();它是用于读取上传文件内容的输入流.
        使用文件复制操作就可以完成文件上传。
    6.删除临时文件
        item.delete();

    示例代码

        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
    
        try {
            //获取工程对象   设置缓存大小  以及临时文件的存储位置
                DiskFileItemFactory df = new DiskFileItemFactory();//默认配置
                //创建上传工具   
                ServletFileUpload sf =  new ServletFileUpload(df);
                //得到对象   项目解析
                List<FileItem > list = sf.parseRequest(request);
                //进行判断遍历
                if(list!=null){
                    for (FileItem fi : list) {
                        if(fi.isFormField()){
                            //普通表单项
                            String name = fi.getString("utf-8");
                            System.out.println(name);
                            
                            
                            
                        }else{
                            //上传组件
                            //获取文件名称
                            String name = fi.getName();
                            System.out.println(name);//XXX.XXX
                            //获取后缀名
                            String name1 = name.substring(name.lastIndexOf("."));
                            System.out.println(name1);
                            //拼接新的保存名称名字
                            String nameNew = new Date().getTime()+name1;
                            System.out.println(nameNew);
                            
                            //上传文件  【数据库中保存的文件的访问路径    文件保存到服务器】
                        //路径 外界可以访问文件的路径    D:Program FilesApache Software FoundationTomcat 6.0webappsC1711A_20180202_Day14_upload
                        //路径  外界不能访问的路径     D:Program FilesApache Software FoundationTomcat 6.0webappsC1711A_20180202_Day14_uploadWEB-INF
                        //用getServletContext的getRealPath方法获得路径
                String path = this.getServletContext().getRealPath("/"+nameNew); String path2 = this.getServletContext().getRealPath("/WEB-INF/"+nameNew); //得到一个我呢见输出流开始写入文件 FileOutputStream fos = new FileOutputStream(new File(path2)); IOUtils.copy(fi.getInputStream(), fos); //存域 path,绝对路径 request.setAttribute("PATH",nameNew); request.getRequestDispatcher("A.jsp").forward(request, response); } } } } catch (FileUploadException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

    文件下载

    1.超连接下载

    2.服务器端通过流下载(服务器端编程)

    服务器端下载:

    jsp文件

    <a href='${pageContext.request.contextPath}/download?filename=a.txt'>a.txt</a><br>
    public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
    doPost(request, response);
        }
    
        /**
         * The doPost method of the servlet. <br>
         *
         * This method is called when a form has its tag value method equals to post.
         * 
         * @param request the request send by the client to the server
         * @param response the response send by the server to the client
         * @throws ServletException if an error occurred
         * @throws IOException if an error occurred
         */
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
    
        //获取信息
            String name = request.getParameter("name");//文件名称
            String path = "/img/"+name;//下载的路径
            //设置下载的数据类型   什么数据类型都可以【不知道将来要下载的数据是什么类型的】
            response.setContentType("application/octet-stream");
            //设置头信息,告诉浏览器我要下载东西了你要给我一个下载的对话框
            response.addHeader("Content-Disposition", "attachment;filename="+name);
            
            request.getRequestDispatcher(path).forward(request, response);
            response.flushBuffer();
        
        
        }
    
    }
  • 相关阅读:
    异常处理
    组合,封装
    自我介绍
    27python更多实例
    28python类代码编写细节
    29python运算符重载
    30python 类的设计
    31python类的高级主题
    32python异常基础
    33python异常编码细节
  • 原文地址:https://www.cnblogs.com/taozizainali/p/11080664.html
Copyright © 2020-2023  润新知