Servlet 过滤器、拦截器、监听器以及文件上传下载

在学习之初,总是对过滤器、拦截器、监听器这三个搞不清楚,现在进行一些记录,方便大家交流,也为了提高自身的学习能力!

如果想要了解这三个的作用,首先对servlet流程进行熟悉了解,servlet是客户端(浏览器)与服务器之间的沟通桥梁,可以简单的理解为我们手机想要和电脑之间进行传输数据的USB。

<servlet>
        <servlet-name>Web</servlet-name>
        <servlet-class>com.Web</servlet-class>
        <multipart-config>
            <max-file-size>52428800</max-file-size>
            <max-request-size>52428800</max-request-size>
            <file-size-threshold>0</file-size-threshold>
        </multipart-config>
    </servlet>
    <servlet-mapping>
        <servlet-name>Web</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
View Code

这是servlet重要的配置文件,当然里边涉及到通配符。

<filter>
    <filter-name>Test</filter-name>
    <filter-class>com.Test</filter-class>
</filter>
    <filter-mapping>
        <filter-name>Test</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
View Code

这是过滤器的配置文件,当把Web项目发布到服务器以后,项目进行加载,会调用过滤器com.Test类中(该类实现HttpServlet)的init方法,当访问的Url符合过滤器的url,会调用doFile()方法。过滤器的作用是进行权限分配以及设置编码格式,需要注意在doFile方法中必须进行chain.doFile(request,response),进行该操作是为了进行下一个过滤器,这就要说一下过滤器链,所谓过滤器链就是多个过滤器组成的,它们的执行顺序是按照web.xml文件中配置的先后顺序进行执行。

<filter>
    <filter-name>Test</filter-name>
    <filter-class>com.Test</filter-class>
    <init-param>
        <param-name>number</param-name>
        <param-value>0</param-value>
    </init-param>
</filter>
    <filter-mapping>
        <filter-name>Test</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
View Code

上边配置的过滤器中添加了初始参数,在执行的过程中可以通过request.getParameter("name")获取初始参数,用该方法可以统计浏览网页人数。

try {
            
            //获取上传的文件
             Part part=request.getPart("file");
              //获取请求的信息
             String name=part.getHeader("content-disposition");
             //System.out.println(name);//测试使用
             //System.out.println(desc);//

             //获取上传文件的目录
             String root=request.getServletContext().getRealPath("/upload");
             System.out.println("测试上传文件的路径:"+root);

             //获取文件的后缀
             String str=name.substring(name.lastIndexOf("."), name.length()-1);
             System.out.println("测试获取文件的后缀:"+str);

             //生成一个新的文件名,不重复,数据库存储的就是这个文件名,不重复的
             String filename=root+"\\"+ UUID.randomUUID().toString()+str;
             System.out.println("测试产生新的文件名:"+filename);

             //上传文件到指定目录,不想上传文件就不调用这个
             part.write(filename);

             request.setAttribute("info", "上传文件成功");
         } catch (Exception e) {
             e.printStackTrace();
             request.setAttribute("info", "上传文件失败");
         }
         request.getRequestDispatcher("/success.jsp").forward(request, response);
View Code

这是文件上传的操作。

String fileName = "我的.txt";
        OutputStream out = null;
        FileInputStream fis = null;
        // 1.获取资源文件的路径,当文件名是中文的时候出现不正常的情况,所以需要进行url编码
        String path = "C:\\Users\\admin\\Desktop\\我的.txt";
        try {
            // 2.根据获取到的路径,构建文件流对象
            fis = new FileInputStream(path);
            out = response.getOutputStream();
            // 5.设置http响应头,告诉浏览器以下载的方式处理我们的响应信息
            response.setCharacterEncoding("utf-8");
            response.setHeader("content-disposition", "attachment;filename=" + fileName);
            // 6.开始写文件
            byte[] buf = new byte[1024];
            int len = 0;
            while ((len = fis.read(buf)) != -1) {
                out.write(buf, 0, len);
            }
        } finally {
            if (fis != null) {
                fis.close();
            }

        }
View Code

这是下载的操作,需要注意的是该操作需要对中文进行编码,要不然不能进行下载,还有就是必须进行该操作:response.setHeader("content-disposition", "attachment;filename=" + fileName);,这个主要是告诉浏览器进行下载操作,要不然页面会显示你文件的内容。

posted @ 2018-03-14 14:43  wyyyyw  阅读(315)  评论(0)    收藏  举报